Java能扮演嵌入式應用開發的主角嗎?

heying1229發表於2007-09-25
Java能扮演嵌入式應用開發的主角嗎?[@more@]來自:IT168

 Java自從推出以來一直備受關注,尤其是宣佈開源之後,就更加為開發者所歡迎。不過在嵌入式系統設計師看來,其效能並不能令人滿意。執行Java虛擬機器(JVM)解釋Java位元組碼,這種方式對大多數嵌入式應用來說佔用空間過多,執行速度過慢。不過Sun 的Java 2 Micro Edition(J2ME)改變了這種狀況。

  對嵌入式系統設計師來說,Java有許多優點。作為一門開源的程式語言,Java允許物件導向程式設計,又沒有C中存在的嚴重問題。Java執行時環境還提供了有用屬性。Java提供的記憶體管理功能使得程式設計人員不必分配及釋放記憶體。執行時環境甚至可以透過整合核心類庫來簡化程式分配。 但大多數嵌入式應用面臨Java沒有處理好的兩大約束:沒有足夠的空間和時間。

  那麼,Java作為一種在C++基礎上改進了的物件導向的開源語言,在嵌入式應用開發方面能挑大樑嗎?能否為它自己撐起一片蔚藍的天空呢?

  一、為什麼會是Java?

  對於嵌入式系統來說,Java技術比C語言和組合語言具有很明顯的優越性。最顯著的特點是減少了系統的開發和維護,增強了程式碼的重利用能力,提高了Java程式碼與系統原有程式碼的可整合性。

  1. 提高開發效率和可維護性

  在專案的整個生命週期中,Java環境大大的簡化了開發和維護。由於目標環境是建立在一個虛擬機器上,程式碼可以很容易的編寫、除錯、分析、更改、維護。加上將來要連線的外接裝置,未來的系統可能比目前的嵌入式系統複雜很多。升級手冊也許不會在整個專案的生命週期中都能起到作用。取而代之的是,硬體裝置的可連線性使得能夠遠端管理模組,這樣就保證了開發人員能在產品上增加新的效能,同時解決了在產品生產後軟體升級和維護的問題。

  2. 重複利用程式碼

  由於嵌入式系統有特殊的需求,以及不同的專門硬體要協同工作,嵌入式軟體開發者通常使用非常原始的方法來開發,有時每一個新的專案都要從頭再來一遍。現在,隨著嵌入式技術的成熟以及系統本身變得更大更最佳化,很多人開始對於把一個產品的模組甚至是全部的應用程式用到另一個產品感興趣。這種可重新利用性使得"一次開發,多次利用"成為了可能。

  Java環境使得一個模組可以只要做很少的工作就可以適應多個專案和平臺。甚至包括有時客戶需要一個新的目標板,或者採用新的硬體(CPU或外設)和軟體,或者使用不同的Linux都可以進行移植。

  3. 整合Java程式碼和原始碼

  使用原始碼明顯是指應用程式的多可用性以及程式碼的重利用能力。在開源的Java語言的應用中,一個設計很好的介面,或者虛擬機器,或者是底層的硬體都可以很好的相容到嵌入式系統中。儘管無法移植,對於很多功能和硬體介面來說,在本地環境下開發的程式碼也許仍然是最好的解決方案。在C、C++或者組合語言中,加入標準的通訊、介面模組、使用者介面、安全特性會花費很多時間與金錢。與之相比較,Java的基本庫本身就提供了這些東西甚至還更多,這樣就可以加速開發。
二、Java碎片真的會有影響嗎?

  在使用JavaME CLDC進行行動電話開發時,人們經常會碰到碎片這個詞。Java強調“一次開發,多次利用”,但碎片出現,卻打破了這種傳奇。於是,這就導致應用開發人員不得不在許多不同的裝置進行應用程式的測試,甚至於不得不在應用程式中對某些特殊的裝置進行一步客戶化的工作。

  對程式開發人員來說,碎片真是個惡夢,因為碎片平白無故的增添了程式碼量和測試工作量。當然,對行動電話持有者來說也不是什麼好事,因為碎片消耗了裝置的空間。不管怎麼說,碎片對每個人來說都是件很討厭的事情。

  但對於嵌入開發者而,碎片又意味著什麼呢?

  首先來看看碎片產生的根源。行動電話行業標準本來給不同的產品預留了一定的自由空間,這初衷是好的。但事實上,這種預留的空間,卻導致了不同產品之間的衝突,不能進行很好的相容。這就是碎片產生的最根本原因。於是這種不相容性進而升級到了Java實現的程式裡。這正是Java想花大力氣建立一個統一Java實現的原因所在,如JSR248,MSA(Mobile Service Architecture)的建立。

  從嵌入式開發人員的角度來看,也許並沒有這麼糟糕。其實碎片並不會影響到嵌入式開發人員,因為已經可以確定裝置之間的硬體是完全相容的。如果使用的是原始語言像C/C++的話,嵌入式開發人員可以在任何地方來編寫程式碼,並在不同的裝置上進行程式碼的重用。

  三、 Java平臺的測試

  如果採用Java來實現嵌入式裝置開發,會不會碰到C/C++經常碰到的測試成本太高的難題呢?

  當然,採用Java來開發的話,可以對軟體進行多次的重複測試,儘管這不一定是必需的。而完全需要進行重複測試的只是那些新加的Java實現。如果是Java平臺的合法使用者的話,還可以使用Sun提供的TCK來進行程式相容性的檢測。如果付費的話,還有很多壓力測試可供選擇。只要能保證Java平臺的正常執行並按Java的測試透過了的話,那麼所開發的程式其可移植性是完全可以保證的。

  當然,在此有必須有提醒一下只測試Java實現埠的開發人員。因為有一些埠的實現有可能是採用C/C++來編寫的,這些必須測試。可以使用全新裝置來對整個程式進行測試以達到這一目的。

  1. 測試工具包

  透過採用Java來進行程式設計,可以確保平臺的APIs是否正確的工作。如果採用C/C++或直接對作業系統程式設計,則使用全新的裝置時,無法保證APIs的正常性。由於這些問題取決於所採用的測試包的全面性和可靠性,因此,在開發階段有可能發現不了它們,而在部署的階段發現了它們時,問題已經擴散得超出控制範圍了。而對於Java平臺的測試,一般比較全面。所以,C/C++或直接對作業系統程式設計的問題能比較早的被發現並解決。

  因此,採用Java平臺時,其測試時間有可能跟使用C/C++來開發整個程式的時間差不多。但結果大大不同,使用Java平臺時,其最差的測試效果往往可以與C/C++環境下最好的測試效果媲美。就測試的選擇而言,採用Java平臺時,可以使用Sun的 TCK來確保程式對新裝置的適用性,同時,還可以得到Java的其它測試包,不過是收費的。然而使用C/C++時,則只能依靠開發人員自己來保證程式對新裝置的適應性了。

  2. 埠相容性

  那麼如何知道裝置所依賴的作業系統埠是相容的呢?沒法知道,因為作業系統供應商透過沒有測試它。除非所使用的裝置是標準的硬體,沒有進行任何的客戶化工作,或是可以讓作業系統提供商對這特殊的埠進行單獨的測試。相樣,採用Java平臺時,這又是怎麼的結果呢?可喜的是,由於Java平臺的TCK已經做了這樣的工作,因此,這可以更好的提高其相容性。

  總之,採用Java平臺所需的測試,最差的情況也就跟採用原始語言(C/C++)一樣,但大部分情況下,都優於後者。而且,更具有相容性的保證。
  四、Java很佔記憶體嗎?

  使用Java平臺進行嵌入式裝置開發時,其對內在的使用量,會不會比使用原始語言如C/C++更大些呢?這取決於軟體的複雜性。Java由於虛擬機器和內庫的原因,有可能會導致記憶體開銷的增大。下面比較一下Java平臺記憶體的佔用情況(基於Sun的實現):

  CLDC(Connected Limited Device Configuration,運算功能有限、電力有限的嵌入式裝置,如PDA 、手機等):可工作於100K(RAM),JIT(Just In Time,即時編譯技術)需要最大些。典型的部署要求500K-16M(RAM)。

  CDC(Connected Device Configuration,運算能力相對較佳、並請在電力供應上相對比較充足的嵌入式裝置,如冷氣機、電冰箱等):VM約為250K,JIT小於 300K,VM+JIT+基礎類庫約佔2-2.5M。典型的部署要求:4M-32M。

  當然,記憶體的佔用量還取決於應用的大小及內在的使用情況。可以看出,其實Java平臺不會佔用太大的記憶體。但是,這只是問題的一半。另一半是,Java程式碼最後部署時是以類檔案來部署的,它主要是包括位元組碼和後設資料。透過對CVM資料的分析,可以看出,位元組碼佔據著大概30%的資料量。而採用JIT編譯的程式碼相對於位元組碼而言,可以發現,記憶體的佔有量增加了,並有一個7-8倍的ARM指令集。由於,可以估計:

  Java類轉成位元組碼的速度≈1/30%≈3.3x;

  原始語言轉成位元組碼的速度≈7x。

  這意味著,Java程式碼的記憶體使用量約為原始語言程式碼的一半。當然這只是非常粗略的估算,但卻是合理的估算。

  使用Java的JIT後,只有那些使用頻率高的程式碼才會被編譯。而在系統中只是偶然被執行的程式碼則採用解釋來編譯。同時,JIT儘量使被編譯的程式碼其記憶體佔有量保持在一較小的範圍內。對CVM(CDC所使用虛擬機器),預設值為512K。而在一些較優秀的程式中,可以發現,其值為100K-300K。

  這也就是說,使用Java編寫的程式,只有使用頻率比較高的程式碼才導致記憶體佔用的增加。相反,使用 C/C++編寫的程式,整個程式碼都需要進行編譯。因此,不能說使用Java語言編寫的程式佔用的記憶體就會比使用C/C++編寫的程式大。這決定於軟體相對於平臺程式碼的複雜度及大小。如果軟體規模比較大,Java平臺所消耗的記憶體遠小於Java類檔案簡潔性節約的記憶體,這種情況下,使用Java平臺將有利於節約記憶體。如果軟體的規模比較小,則Java平臺消耗的記憶體就比較明顯了,可以考慮使用C/C++來開發,以節約記憶體。

  五、 結論

  Java語言最初的設計企圖是想用於控制消費性電子產品,本為嵌入式裝置而設計,但隨著因特網的興起, Java在桌上型電腦和伺服器端的應用開發中取得了巨大的成功。Java在應用中充分展示其通用性與完全性等優勢,而這在嵌入式裝置的應用開發中是至關重要的,這使得Java重返嵌入式應用開發領域成為必然。STK Java卡和J2ME的成功應用昭示著Java在嵌入式系統應用開發中的美好前景。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10172717/viewspace-972054/,如需轉載,請註明出處,否則將追究法律責任。

相關文章