|
如果有人問(wèn)Java是否可以成為理想的嵌入式設(shè)備程序設(shè)計(jì)語(yǔ)言,正確的答案應(yīng)該是:具體情況具體分析。對(duì)此,本文將提供有益的參考。 Java程序設(shè)計(jì)語(yǔ)言最初是針對(duì)機(jī)頂盒應(yīng)用而設(shè)計(jì)的,它可使家庭與WWW連為一體。而今,開(kāi)發(fā)商們又希望把Java作為一種針對(duì)嵌入式系統(tǒng)的程序設(shè)計(jì)語(yǔ)言, 令其以新的方式進(jìn)入家庭。 然而, 與最初針對(duì)機(jī)頂盒的應(yīng)用開(kāi)發(fā)相比, 針對(duì)嵌入式系統(tǒng)的家庭應(yīng)用開(kāi)發(fā)要復(fù)雜得多。人們不得不面對(duì)許多新的設(shè)備與新的技術(shù),同時(shí)也遇到種種限制,例如運(yùn)行速度、內(nèi)存配置、外形尺寸以及與時(shí)間相關(guān)的技術(shù)問(wèn)題。Java具有面向?qū)ο蟮奶匦浴?nèi)在的Internet集成并因此而獲得了大批擁有雄厚技術(shù)實(shí)力的開(kāi)發(fā)商,可以幫助人們順利完成嵌入式系統(tǒng)的開(kāi)發(fā)。 例如, Java 2 Micro Edition(J2ME)——Java API的一個(gè)子集,只包含了Java的關(guān)鍵特性,是專門針對(duì)那些對(duì)內(nèi)存具有苛刻要求的嵌入式設(shè)備而設(shè)計(jì)的。J2ME粗略地將應(yīng)用對(duì)象劃分為兩大范疇:內(nèi)存在128K~512K之間的設(shè)備和內(nèi)存為512K以上的設(shè)備,根據(jù)設(shè)備所處的類別提供不同的用戶接口和不同的軟件包。 然而, 具有諷刺意味的是, 某些使Java成為Internet和桌面設(shè)備理想編程語(yǔ)言的良好特性, 在嵌入式系統(tǒng)中卻引發(fā)了一些十分棘手的問(wèn)題。缺乏指針尋址以及運(yùn)行于Java虛擬機(jī)(JVM)模式中的安全特性都使Java很難對(duì)硬件進(jìn)行直接控制。 自動(dòng)垃圾收集功能可使程序設(shè)計(jì)變得更加容易, 但卻使應(yīng)用失去了實(shí)時(shí)決策能力。另外, Java的運(yùn)行速度偏慢, 而且程序量也偏大。然而, 令程序設(shè)計(jì)人員感到鼓舞的是, 目前所有這些問(wèn)題大多數(shù)已能夠解決, 許多可行的方案正在陸續(xù)推出。因此, 如果有人問(wèn)Java是否可以成為理想的嵌入式設(shè)備程序設(shè)計(jì)語(yǔ)言, 那么正確的答案應(yīng)該是:具體情況具體分析。 什么情況下Java是理想的選擇? 為“火星探路者”引導(dǎo)方向的微處理器對(duì)中斷功能具有很強(qiáng)的依賴性, 此時(shí)Java可能不是最佳的選擇。如果你希望設(shè)計(jì)那些小型化、高功效、可執(zhí)行關(guān)鍵任務(wù)的實(shí)時(shí)應(yīng)用, 例如火箭控制、傳感器通信或報(bào)告宇宙飛行器的方位等, 最好采用C語(yǔ)言或匯編程序。 然而, 對(duì)于其他一些應(yīng)用, 例如使用手持設(shè)備追蹤貨物的發(fā)運(yùn)情況, Java將是一種最理想的選擇。那些需要相互對(duì)話或與Internet進(jìn)行溝通的設(shè)備, 可以充分利用這一語(yǔ)言的內(nèi)在通信特性。如果已經(jīng)用Java編寫了服務(wù)器端軟件,那么與此協(xié)同運(yùn)作的客戶端應(yīng)用也很適合使用這種語(yǔ)言。 關(guān)于運(yùn)行速度的考慮 Java之所以能夠得以流行, 一個(gè)重要原因是具有WORA(Write once run anywhere, 編寫一次即可到處運(yùn)行)的特性。同樣的Java代碼可以運(yùn)行在Mac、PC甚至是大型機(jī)上, 因?yàn)镴ava是一種解釋性語(yǔ)言。面向具體平臺(tái)的JVM可解釋在每一操作系統(tǒng)平臺(tái)上運(yùn)行的字節(jié)代碼。然而, 這一解釋需要花費(fèi)額外的時(shí)間。值得慶幸的是, 目前JVM解釋代碼所花費(fèi)的時(shí)間已大大減少, 這要?dú)w功于即時(shí)(Just-in-time)編譯程序的推出。預(yù)先(AOT,ahead-of-time)編譯程序也可解決這一問(wèn)題, 因?yàn)樗軌蝾A(yù)先解釋Java代碼, 把Java代碼轉(zhuǎn)換成經(jīng)過(guò)優(yōu)化且面向具體平臺(tái)的二進(jìn)制代碼。 Cygnus Solutions公司聲稱, AOT編譯程序能夠把代碼的運(yùn)行速度提高8倍。NewMonics也開(kāi)發(fā)了一個(gè)名為QuickPERC的編譯程序。該公司宣稱, 與通常的解釋模式相比,這一編譯程序可把代碼的執(zhí)行速度提高20倍。 盡管使用AOT令開(kāi)發(fā)人員失去了可以在中心控制點(diǎn)對(duì)所編譯的代碼進(jìn)行版本管理和維護(hù)的能力, 但對(duì)于比較穩(wěn)定的代碼庫(kù)(例如嵌入式系統(tǒng))環(huán)境這算不上是很大的損失。 程序規(guī)模遇到了“天花板” 在一個(gè)服務(wù)器中擁有幾個(gè)Gb的內(nèi)存十分平常,但一個(gè)可運(yùn)行Java的電器設(shè)備充其量只有不足512K的內(nèi)存。因此, 當(dāng)運(yùn)行帶有1Mb核心類庫(kù)的Java時(shí), 即使你只編寫了一行代碼, 也無(wú)法將其裝進(jìn)嵌入式系統(tǒng)。AOT編譯程序可以解決這一問(wèn)題,因?yàn)樗梢詭椭闳コ胁皇褂玫拇a、方法和類。許多供應(yīng)商已經(jīng)編寫了體積更小、效率更高、面向具體平臺(tái)的專用核心Java類, 而且仍可繼續(xù)使用已公布的Java API。與匯編或C等語(yǔ)言相比, 通常情況下, 面向?qū)ο蟮恼Z(yǔ)言需要使用更多的內(nèi)存。在臺(tái)式機(jī)上這早已算不上是一個(gè)問(wèn)題,然而在嵌入式系統(tǒng)中卻是一個(gè)很大的問(wèn)題。 選擇正確的集成開(kāi)發(fā)環(huán)境(IDE) 人們已經(jīng)認(rèn)識(shí)到, C程序中80%的故障是指針引起的, 因此Java中去掉了指針。Java的安全模式放棄了系統(tǒng)內(nèi)存直接尋址和指向?qū)嶋H硬件的指針尋址。然而, 這些指針的存在本來(lái)是很方便的, 特別是當(dāng)你希望快速和直接尋址內(nèi)存時(shí)。 用Java編寫的嵌入式系統(tǒng)必須使用本地接口去執(zhí)行那些面向具體硬件的功能。然而, 這將意味著你正在管理以多種語(yǔ)言編寫、具有多種類型的代碼。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),就必須懂得更多的技術(shù), 否則只好組織一個(gè)更龐大的開(kāi)發(fā)人員班子。如何把所有代碼連接成一個(gè)模塊?當(dāng)出現(xiàn)某些故障時(shí)如何對(duì)代碼進(jìn)行調(diào)試? 所有這些都是必須解決的問(wèn)題。 推出功能豐富、支持多平臺(tái)代碼的IDE(集成開(kāi)發(fā)環(huán)境),這是朝正確方向邁出的一大步。當(dāng)前可用的IDE有Metrowerks CodeWarrior(它可使程序設(shè)計(jì)人員在同一IDE中使用多種語(yǔ)言編寫代碼) 和IBM的VisualAge for J2ME。由于這些IDE是用于解決復(fù)雜問(wèn)題的,所以人們也需付出較大的努力才能掌握它們。 垃圾處理刻不容緩 許多人不愿在嵌入式系統(tǒng)中使用Java的一個(gè)重要原因是Java不能保證應(yīng)用的實(shí)時(shí)決策需求,即這種語(yǔ)言不能以可預(yù)知、可重復(fù)的時(shí)間長(zhǎng)度來(lái)處理一個(gè)具體的代碼部分。Java使用自動(dòng)垃圾收集功能回收那些不再使用的內(nèi)存,開(kāi)發(fā)人員幾乎不能控制垃圾收集的具體時(shí)間。實(shí)際上, 當(dāng)Java進(jìn)行垃圾收集時(shí)暫停了整個(gè)應(yīng)用的執(zhí)行。為了解決這一問(wèn)題, 供應(yīng)商們陸續(xù)推出一些不同的垃圾收集方法與算法。 有些產(chǎn)品, 例如NewMonic的Real Time Executive和WindRiver的FastJ,可以確保絕對(duì)時(shí)間決策應(yīng)用的開(kāi)發(fā)。Sun擁有一個(gè)不同的方案,但它也開(kāi)始轉(zhuǎn)向?qū)?shí)時(shí)決策功能的支持。各種編碼技術(shù)(例如對(duì)象的重用), 也可減緩垃圾收集所產(chǎn)生的不良影響。 可重用性不可忽視 盡管使用AOT編譯程序會(huì)犧牲掉在任何平臺(tái)上運(yùn)行同一編譯后Java代碼的能力, 但可移植的Java源代碼仍將是一大優(yōu)勢(shì)。 當(dāng)供應(yīng)商推出其硬件新版本時(shí), 只要接口保持不變, 那么與接口對(duì)話的代碼就不必改變, 這就是面向?qū)ο笤O(shè)計(jì)的實(shí)質(zhì)所在。事實(shí)上,大多數(shù)高級(jí)應(yīng)用邏輯在臺(tái)式機(jī)上就可以進(jìn)行調(diào)試,而不必在嵌入系統(tǒng)的目標(biāo)設(shè)備上摸索。 內(nèi)存與處理器的成本 有的時(shí)候, 人們之所以愿意使用Java, 是因?yàn)镴ava具有良好的性能價(jià)格比。眾所周知, 目前內(nèi)存和處理器的價(jià)格是相當(dāng)便宜的, 而且越來(lái)越便宜。盡管花費(fèi)幾百美元, 甚至是幾千美元為服務(wù)器購(gòu)買內(nèi)存是合乎情理的,但對(duì)于價(jià)格本來(lái)就十分低廉的蜂窩電話來(lái)說(shuō), 過(guò)多的內(nèi)存開(kāi)銷顯然是不能接受的。如果因?yàn)槭褂昧溯^小的內(nèi)存讓每部電話節(jié)省1美元, 那么2000萬(wàn)部將節(jié)省2000萬(wàn)美元。因此內(nèi)存和處理器速度的開(kāi)銷應(yīng)與設(shè)備成本相適應(yīng)。實(shí)際上,對(duì)于有些應(yīng)用場(chǎng)合來(lái)說(shuō),內(nèi)存和處理器速度并不是刻意追求的因素,這就給降低產(chǎn)品成本找到了一條出路。 如何吸納Java? 如果你正在考慮把Java用于你的下一個(gè)嵌入式系統(tǒng), 那么重要的不是技術(shù)問(wèn)題,而是你的公司文化。如果你擁有一批習(xí)慣于犧牲機(jī)器資源換取自己方便的Web設(shè)計(jì)人員, 并讓他們充當(dāng)嵌入式系統(tǒng)的Java程序員,盡管同樣是使用Java,但從Web設(shè)計(jì)到嵌入式系統(tǒng)程序設(shè)計(jì)將是一個(gè)不大容易的轉(zhuǎn)變。對(duì)Java的使用要循序漸進(jìn),而不是立即使用Java編寫所有的應(yīng)用。必須讓Java程序員與那些有經(jīng)驗(yàn)的嵌入式系統(tǒng)設(shè)計(jì)人員進(jìn)行對(duì)話溝通,互相學(xué)習(xí)對(duì)方的技能。 在JVM上運(yùn)行的J2ME目標(biāo)代碼偏離通常環(huán)境越遠(yuǎn),應(yīng)用管理就越復(fù)雜。其中的經(jīng)驗(yàn)是, 盡可能采用標(biāo)準(zhǔn)的J2ME。只有遇到特殊問(wèn)題時(shí),才采用特殊的方案。 如果某些針對(duì)嵌入式系統(tǒng)的技術(shù)(例如AOT編譯程序和半自動(dòng)垃圾收集)反過(guò)來(lái)被應(yīng)用到臺(tái)式機(jī)和服務(wù)器環(huán)境,這并不令人感到驚奇。Java良好的內(nèi)在特性, 無(wú)論對(duì)于家庭應(yīng)用還是工業(yè)應(yīng)用, 都將是嵌入式系統(tǒng)首先需要認(rèn)真考慮的一種程序設(shè)計(jì)語(yǔ)言。 |
|
|