論Java的跨平臺性
Java有很多優點比如說語法簡單,面向物件,跨平臺性。今天就跨平臺性講講我的看法。
簡單的說,Java跨平臺性主要意思就是開發一次就可以,不同的作業系統安裝不同的虛擬機器就可以了。一次開發可以在多個平臺稍作修改即可。
從開發人員或程式語言的角度來理解,”平臺“就是指語言的執行時環境,比如Java的平臺就是JRE(Java Runtime Environment)。是不是覺得很奇怪,難道平臺不是指Windows、Linux這樣的作業系統嗎?沒錯,Windows和Linux也確實是平臺,但是這個平臺對於Java來說太寬泛了,就象從來沒有人說Java的平臺是i386、arm一樣。簡單理解就是光有作業系統是無法執行Java程式的。而JVM則包含在JRE裡。
對於一段Java程式,要讓它可以執行,得至少經過兩個步驟,第一步,用Java編譯器將原始碼編譯成位元組碼;第二步,用Java直譯器執行位元組碼。可見可見,Java程式並非像C程式那樣直接執行,而是要有個啟動器,也就是所謂的JVM(Java Virtual Machine)來載入並執行。由此可見,Java跨平臺的兩個重要因素是:
1.有個能產生符合Java規範的位元組碼的編譯器;
2.有個能解釋上述符合Java規範的位元組碼的直譯器。
換句話說,在任何作業系統上,只要存在JRE,就可以執行Java可執行體,而無所謂它來源於何處,只要”符合Java規範“就行。哈哈,到這裡是不是有點亂,上面不是說Java的平臺是JRE嗎?難道JRE在不同的作業系統平臺上還會變?是的,正是因為上述Java工具集是隨作業系統的不同而不同的,我們才一再強調”符合Java規範的位元組碼“。因為Java編譯器和Java直譯器等一系列的工具集本身是依賴於作業系統的,只不過它們的輸入和輸出都符合統一的Java規範。如果上述兩個條件換了其中任何一個,則很有可能使得Java不再跨平臺。
很小的時候很多人應該都玩過小霸王遊戲機類似的遊戲裝置,插卡式的。那種微型裝置是8位處理器的。移植到windows平臺是32位或者64位,在上面執行就需要裝模擬器,就是相當於Java的虛擬機器。
”Java 語言“和”Java程式“並非同一個概念,Java語言實際上只是一系列的規範,該規範為程式設計師規定了Java的語法和語義規則。Java程式則是根據這些規範產生的可執行體。通常情況下,程式的需求或多或少都會關係到一些作業系統之間的差異,比如,Windws的檔案系統是多根的,Unix的檔案系統則是單根的;再比如,Java連線資料庫的程式中,用到了與平臺相關的ODBC,此時當程式拿到其他平臺上去難免會出錯。前面說了,Java工具集是依賴於作業系統的,也就是說它們不能改變作業系統之間的差異,這就是JNI(Java Native Invoke)存在的原因之一。當一個程式使用了某個作業系統的特性並且移植後的作業系統沒有此特性時,雖然它們能被該平臺執行,但是還是會執行出錯。
從上面的說明可以看出,Java語言跨平臺的本質是因為Java工具集遵循同一套規範。規範是個抽象的概念,那自然需要對應著一種實現,目前常見的有三種實現,即Sun的官方實現;IBM的實現;GNU的實現。很有可能一套工具集對應與一套實現,使得不同實現之間並不通用,況且,每套實現在滿足規範後還可能增加自己的特性,比如,GNU可以直接將java原始碼、位元組碼、jar包等編譯成本地可執行體。當然它們對原始碼規範的實現都是一樣的,但是也並不保證這些實現一定不會出現不同。因此對於給定的一套工具集,Java語言才是跨平臺的,其他工具集則允許不是。
在一套給定的工具集上,Java應用伺服器做為JavaEE的容器,從本質上來說是JavaEE規範的實現,這樣結合誤區二就很容易理解了。不過還是要說一點,誤區三其實根本就不該有,因為原因和結果本就不是一個層次的東西。
當然還有更多的東西技術界的朋友可以挖掘出來,歡迎與我交流。