Java能扮演嵌入式應用開發(fā)的主角嗎?
Java自從推出以來一直備受關注,尤其是宣布開源之后,就更加為開發(fā)者所歡迎。不過在嵌入式系統(tǒng)設計師看來,其性能并不能令人滿意。運行Java虛擬機(JVM)解釋Java字節(jié)碼,這種方式對大多數(shù)嵌入式應用來說占用空間過多,運行速度過慢。不過Sun的Java 2 Micro Edition(J2ME)改變了這種狀況。
對嵌入式系統(tǒng)設計師來說,Java有許多優(yōu)點。作為一門開源的編程語言,Java允許面向對象編程,又沒有C中存在的嚴重問題。Java運行時環(huán)境還提供了有用屬性。Java提供的內存管理功能使得編程人員不必分配及釋放內存。運行時環(huán)境甚至可以通過整合核心類庫來簡化程序分配。 但大多數(shù)嵌入式應用面臨Java沒有處理好的兩大約束:沒有足夠的空間和時間。
那么,Java作為一種在C++基礎上改進了的面向對象的開源語言,在嵌入式應用開發(fā)方面能挑大梁嗎?能否為它自己撐起一片蔚藍的天空呢?
一、為什么會是Java?
對于嵌入式系統(tǒng)來說,Java技術比C語言和匯編語言具有很明顯的優(yōu)越性。最顯著的特點是減少了系統(tǒng)的開發(fā)和維護,增強了代碼的重利用能力,提高了Java代碼與系統(tǒng)原有代碼的可整合性。
1. 提高開發(fā)效率和可維護性
在項目的整個生命周期中,Java環(huán)境大大的簡化了開發(fā)和維護。由于目標環(huán)境是建立在一個虛擬機上,代碼可以很容易的編寫、調試、分析、更改、維護。加上將來要連接的外接設備,未來的系統(tǒng)可能比目前的嵌入式系統(tǒng)復雜很多。升級手冊也許不會在整個項目的生命周期中都能起到作用。取而代之的是,硬件設備的可連接性使得能夠遠程管理模塊,這樣就保證了開發(fā)人員能在產品上增加新的性能,同時解決了在產品生產后軟件升級和維護的問題。
2. 重復利用代碼
由于嵌入式系統(tǒng)有特殊的需求,以及不同的專門硬件要協(xié)同工作,嵌入式軟件開發(fā)者通常使用非常原始的方法來開發(fā),有時每一個新的項目都要從頭再來一遍?,F(xiàn)在,隨著嵌入式技術的成熟以及系統(tǒng)本身變得更大更優(yōu)化,很多人開始對于把一個產品的模塊甚至是全部的應用程序用到另一個產品感興趣。這種可重新利用性使得"一次開發(fā),多次利用"成為了可能。
Java環(huán)境使得一個模塊可以只要做很少的工作就可以適應多個項目和平臺。甚至包括有時客戶需要一個新的目標板,或者采用新的硬件(CPU或外設)和軟件,或者使用不同的Linux都可以進行移植。
3. 集成Java代碼和源代碼
使用源代碼明顯是指應用程序的多可用性以及代碼的重利用能力。在開源的Java語言的應用中,一個設計很好的界面,或者虛擬機,或者是底層的硬件都可以很好的兼容到嵌入式系統(tǒng)中。盡管無法移植,對于很多功能和硬件界面來說,在本地環(huán)境下開發(fā)的代碼也許仍然是最好的解決方案。在C、C++或者匯編語言中,加入標準的通信、接口模塊、用戶界面、安全特性會花費很多時間與金錢。與之相比較,Java的基本庫本身就提供了這些東西甚至還更多,這樣就可以加速開發(fā)。
二、Java碎片真的會有影響嗎?
在使用JavaME CLDC進行移動電話開發(fā)時,人們經常會碰到碎片這個詞。Java強調“一次開發(fā),多次利用”,但碎片出現(xiàn),卻打破了這種傳奇。于是,這就導致應用開發(fā)人員不得不在許多不同的設備進行應用程序的測試,甚至于不得不在應用程序中對某些特殊的設備進行一步客戶化的工作。
對程序開發(fā)人員來說,碎片真是個惡夢,因為碎片平白無故的增添了代碼量和測試工作量。當然,對移動電話持有者來說也不是什么好事,因為碎片消耗了設備的空間。不管怎么說,碎片對每個人來說都是件很討厭的事情。
但對于嵌入開發(fā)者而,碎片又意味著什么呢?
首先來看看碎片產生的根源。移動電話行業(yè)標準本來給不同的產品預留了一定的自由空間,這初衷是好的。但事實上,這種預留的空間,卻導致了不同產品之間的沖突,不能進行很好的兼容。這就是碎片產生的最根本原因。于是這種不兼容性進而升級到了Java實現(xiàn)的程序里。這正是Java想花大力氣創(chuàng)建一個統(tǒng)一Java實現(xiàn)的原因所在,如JSR248,MSA(Mobile Service Architecture)的建立。
從嵌入式開發(fā)人員的角度來看,也許并沒有這么糟糕。其實碎片并不會影響到嵌入式開發(fā)人員,因為已經可以確定設備之間的硬件是完全兼容的。如果使用的是原始語言像C/C++的話,嵌入式開發(fā)人員可以在任何地方來編寫代碼,并在不同的設備上進行代碼的重用。
三、 Java平臺的測試
如果采用Java來實現(xiàn)嵌入式設備開發(fā),會不會碰到C/C++經常碰到的測試成本太高的難題呢?
當然,采用Java來開發(fā)的話,可以對軟件進行多次的重復測試,盡管這不一定是必需的。而完全需要進行重復測試的只是那些新加的Java實現(xiàn)。如果是Java平臺的合法用戶的話,還可以使用Sun提供的TCK來進行程序兼容性的檢測。如果付費的話,還有很多壓力測試可供選擇。只要能保證Java平臺的正常運行并按Java的測試通過了的話,那么所開發(fā)的程序其可移植性是完全可以保證的。
當然,在此有必須有提醒一下只測試Java實現(xiàn)端口的開發(fā)人員。因為有一些端口的實現(xiàn)有可能是采用C/C++來編寫的,這些必須測試。可以使用全新設備來對整個程序進行測試以達到這一目的。
1. 測試工具包
通過采用Java來進行編程,可以確保平臺的APIs是否正確的工作。如果采用C/C++或直接對操作系統(tǒng)編程,則使用全新的設備時,無法保證APIs的正常性。由于這些問題取決于所采用的測試包的全面性和可靠性,因此,在開發(fā)階段有可能發(fā)現(xiàn)不了它們,而在部署的階段發(fā)現(xiàn)了它們時,問題已經擴散得超出控制范圍了。而對于Java平臺的測試,一般比較全面。所以,C/C++或直接對操作系統(tǒng)編程的問題能比較早的被發(fā)現(xiàn)并解決。
因此,采用Java平臺時,其測試時間有可能跟使用C/C++來開發(fā)整個程序的時間差不多。但結果大大不同,使用Java平臺時,其最差的測試效果往往可以與C/C++環(huán)境下最好的測試效果媲美。就測試的選擇而言,采用Java平臺時,可以使用Sun的TCK來確保程序對新設備的適用性,同時,還可以得到Java的其它測試包,不過是收費的。然而使用C/C++時,則只能依靠開發(fā)人員自己來保證程序對新設備的適應性了。
2. 端口兼容性
那么如何知道設備所依賴的操作系統(tǒng)端口是兼容的呢?沒法知道,因為操作系統(tǒng)供應商通過沒有測試它。除非所使用的設備是標準的硬件,沒有進行任何的客戶化工作,或是可以讓操作系統(tǒng)提供商對這特殊的端口進行單獨的測試。相樣,采用Java平臺時,這又是怎么的結果呢?可喜的是,由于Java平臺的TCK已經做了這樣的工作,因此,這可以更好的提高其兼容性。
總之,采用Java平臺所需的測試,最差的情況也就跟采用原始語言(C/C++)一樣,但大部分情況下,都優(yōu)于后者。而且,更具有兼容性的保證。
四、Java很占內存嗎?
使用Java平臺進行嵌入式設備開發(fā)時,其對內在的使用量,會不會比使用原始語言如C/C++更大些呢?這取決于軟件的復雜性。Java由于虛擬機和內庫的原因,有可能會導致內存開銷的增大。下面比較一下Java平臺內存的占用情況(基于Sun的實現(xiàn)):
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代碼最后部署時是以類文件來部署的,它主要是包括字節(jié)碼和元數(shù)據(jù)。通過對CVM數(shù)據(jù)的分析,可以看出,字節(jié)碼占據(jù)著大概30%的數(shù)據(jù)量。而采用JIT編譯的代碼相對于字節(jié)碼而言,可以發(fā)現(xiàn),內存的占有量增加了,并有一個7-8倍的ARM指令集。由于,可以估計:
Java類轉成字節(jié)碼的速度≈1/30%≈3.3x;
原始語言轉成字節(jié)碼的速度≈7x。
這意味著,Java代碼的內存使用量約為原始語言代碼的一半。當然這只是非常粗略的估算,但卻是合理的估算。
使用Java的JIT后,只有那些使用頻率高的代碼才會被編譯。而在系統(tǒng)中只是偶然被執(zhí)行的代碼則采用解釋來編譯。同時,JIT盡量使被編譯的代碼其內存占有量保持在一較小的范圍內。對CVM(CDC所使用虛擬機),默認值為512K。而在一些較優(yōu)秀的程序中,可以發(fā)現(xiàn),其值為100K-300K。
這也就是說,使用Java編寫的程序,只有使用頻率比較高的代碼才導致內存占用的增加。相反,使用C/C++編寫的程序,整個代碼都需要進行編譯。因此,不能說使用Java語言編寫的程序占用的內存就會比使用C/C++編寫的程序大。這決定于軟件相對于平臺代碼的復雜度及大小。如果軟件規(guī)模比較大,Java平臺所消耗的內存遠小于Java類文件簡潔性節(jié)約的內存,這種情況下,使用Java平臺將有利于節(jié)約內存。如果軟件的規(guī)模比較小,則Java平臺消耗的內存就比較明顯了,可以考慮使用C/C++來開發(fā),以節(jié)約內存。
五、結論
Java語言最初的設計企圖是想用于控制消費性電子產品,本為嵌入式設備而設計,但隨著因特網的興起,Java在臺式機和服務器端的應用開發(fā)中取得了巨大的成功。Java在應用中充分展示其通用性與完全性等優(yōu)勢,而這在嵌入式設備的應用開發(fā)中是至關重要的,這使得Java重返嵌入式應用開發(fā)領域成為必然。STK Java卡和J2ME的成功應用昭示著Java在嵌入式系統(tǒng)應用開發(fā)中的美好前景。
評論