search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

如何理解Java的跨平台性

很多人因為用了跨平台的語言"寫沒有寫的出跨平台的程序而盲目的認為該語言的跨平台性是子虛烏有。

從開發人員或編程語言的角度來理解,平台就是指語言的運行時環境,比如Java的平台就是JRE(Java Runtime Environment)。是不是覺得很奇怪,難道平台不是指WindowsLinux這樣的操作系統嗎?沒錯,WindowsLinux也確實是平 台,但是這個平台對於Java來說太寬泛了,就象從來沒有人說Java的平台是i386arm一樣。簡單理解就是光有操作系統是無法運行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不再跨平台。

除了以上兩點,還有第三個因素,Java針對平台設計的庫,也就是所謂的Jar包,這些jar包雖然大部分都是Java編寫的,但是還是有不少地方是針對平台獨特設計的,比如不同操作系統之間路徑的表示,從這個角度講,平台移植后的Java位元組碼已經被解釋器改變了。

誤區一:Java語言是跨平台的,所以Java程序也是跨平台的 」Java語言」Java程序並非同一個概念,Java語言實際上只是一系列的規範,該規範為程序員規定了Java的語法和語義規則。Java程序 則是根據這些規範產生的可執行體。通常情況下,程序的需求或多或少都會關係到一些操作系統之間的差異,比如,Windws的文件系統是多根的,Unix 文件系統則是單根的;再比如,Java連接資料庫的程序中,用到了與平台相關的ODBC,此時當程序拿到其他平台上去難免會出錯。前面說了,Java工具 集是依賴於操作系統的,也就是說它們不能改變操作系統之間的差異,這就是JNI(Java Native Invoke)存在的原因之一。當一個程序使用了某個操作系統的特性並且移植后的操作系統沒有此特性時,雖然它們能被該平台執行,但是還是會運行出錯。

誤區二:Java語言是跨平台的,所以Java程序是跨Java工具集的 從上面的說明可以看出,Java語言跨平台的本質是因為Java工具集遵循同一套規範。規範是個抽象的概念,那自然需要對應著一種實現,目前常見的有三種 實現,即Sun的官方實現;IBM的實現;GNU的實現。很有可能一套工具集對應與一套實現,使得不同實現之間並不通用,況且,每套實現在滿足規範后還可 能增加自己的特性,比如,GNU可以直接將java源碼、位元組碼、jar包等編譯成本地可執行體。當然它們對源碼規範的實現都是一樣的,但是也並不保證這 些實現一定不會出現不同。因此對於給定的一套工具集,Java語言才是跨平台的,其他工具集則允許不是。

誤區三:Java語言是跨平台的,所以Java程序是跨Java應用伺服器的 在一套給定的工具集上,Java應用伺服器做為JavaEE的容器,從本質上來說是JavaEE規範的實現,這樣結合誤區二就很容易理解了。不過還是要說一點,誤區三其實根本就不該有,因為原因和結果本就不是一個層次的東西。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦