本文作者岑永洪來自中科院軟件所
Java語言最大的一個特點就是他的跨平台特性,也就是平時廣告語中說得最多的“write once run anywhere”。跨平台最明顯的一個優點就是,你寫的程序地球人都能運行,這對程序員來說就是減少了工作量,對於公司來說就是減少了投入。但是,天底下沒有免費的午餐,跨平台是需要有代價的,最明顯的一個就是我們的代碼將會被編譯為所謂的“字節碼”,這些代碼在運行時由虛擬機進行解釋執行,正是因為這種解釋執行的方式導致了Java程序的執行速度一直不如其他的C和C++程序。
雖然,跨平台特性是如此優秀,但是很多時候,我們是否真正考慮過我們是否需要這種特性呢,或者這種特性對我們來說是利大還是弊大呢。
在國外,版權是一個很嚴重的問題,因此,在國外雖然Windows系統占有比較大的市場,但是在大學,在政府部門,在程序員當中,大量使用的是類Unix和Linux的操作系統,只要對Unix操作系統稍有了解,就會知道Unix系統發展到今天,已經出現了好幾個不同的發行版本,這些版本雖然沒有大的區別,但是還是存在著或多或少的不兼容,因此,一個程序如果需要在不同的平台間運行,那麼移植將是必不可少的。因此,對於國外的桌面系統環境,Java程序的跨平台性顯然比他的性能因素更重要。但是,反觀國內,占據市場主導的都是Windows系統,而程序員所開發的程序也基本上是運行於該平台下,很少需要考慮程序移植的問題。因此,一個程序是否能跨平台運行,對於我們來說不如國外強烈,所以,從我們的現實情況出發,性能比跨平台顯然更為重要。但是,從長遠來說,如果我們希望我們自己寫的程序能夠沖出亞洲,走向世界,那麼跨平台性顯然也是一種很有利的特性。
除了桌面應用以外,Java程序還主要運行於服務器端和嵌入式終端,對於服務器端,我覺得沒必要多加評論,因為與桌面應用的PC不同,服務器端應用所依賴的硬件平台尚未呈現一個一家獨大的情況,因此跨平台性是非常重要的,而且現有的應用也表明J2EE平台已經成為了事實的標准,因此,不管他合適與否,我們也只能繼續使用。
而對於嵌入式終端,特別是智能手機,我覺得是一個很值得討論的部分。嵌入式市場在最近幾年表現出非常迅猛的發展勢頭。在終端方面,現在市場上存在著大量的終端生產商,而根據過去幾年的市場份額分析,各大生產商的份額雖然一直在改變,但是總體趨勢仍是保持著的一個各方均衡的情況;對應於多個生產商,在操作系統和應用系統方面也是呈現出一個群雄割據的局面,在操作系統方面,主要是SymBian,Linux,WinCE,Palm;而在應用系統方面則包括了J2ME,Brew及其他與操作系統相應的系統。在這種情況下,如果應用是特定於某一平台的話,那麼不管是對生產商,開發商或最終用戶都是一件不利的事情,為此,一個能跨平台運行的程序將是嵌入式應用中最受歡迎和被接受的。因此,在嵌入式方面,Java的跨平台性顯得非常重要。雖然跨平台性觸進了J2ME平台在手機領域的發展,但也正是因為這個跨平台性使得運行在J2ME之上的程序一直未如理想。
J2ME通過CLDC和MIDP來定義運行於手機之上的Java虛擬機的特性,這兩個規范定義的都是最低要求,而為了能夠增加J2ME在不同手機上的移植,這兩個規范所定義的配置門檻都非常的低,低的門檻雖然一方面能擴大市場,但是另一方面也制約了上層應用的開發,這表現在性能和應用模式上。
游戲是手機應用中一個非常熱門的方面,但是由於她的性能和表現與下層的硬件直接相關,所以,如果我們使用J2ME所提供的API來開發游戲的話,那麼我們只能假定我們所開發的游戲所能使用的資源就是規范中所規定的,這無疑會對我們的創意和實現帶來影響。而從市場上現有的運行於J2ME之上的手機游戲,我們也不難看到,這些游戲無論從品質和層次上都有待提高。
一般的桌面軟件,都是通過一個頁面來獲取用戶的多個輸入,但是由於手機並不像PC那樣配有在控件之間進行切換的“Tab”鍵或者鼠標,因此,當需要向用戶獲取多個輸入時,一般情況下,我們都需要通過多個頁面來完成,這顯得非常冗余而且低效。從這裡,我們不難看出點選設備的存在與否,對於我們的應用模式,存在非常大的影響。但是,這在J2ME規范中並未對此加以區分。
跨平台是一個好事情,但是有時候我們需要做出一些折中,因為,一個技術是否能夠存活和發展不僅看他是否優秀,很多時候還需要看他是否能夠占領市場,因此為了市場而犧牲一部分的特性,我覺得也是合適的。