同一個目標,同一個夢想

          One Target,One Dream
          posts - 25, comments - 11, trackbacks - 0, articles - 37

          如何理解語言的跨平臺性

          Posted on 2008-12-27 22:38 J2EE Home工作室 閱讀(780) 評論(0)  編輯  收藏

          英語是國際通用語言,但是我說的英語美國人就聽不懂

          很多人因為用了“跨平臺的語言"寫沒有寫的出跨平臺的程序而盲目的認為該語言的跨平臺性是子虛烏有。
          本文以Java為例就來討論一下”如何理解語言的跨平臺性“。

          從開發(fā)人員或編程語言的角度來理解,”平臺“就是指語言的運行時環(huán)境,比如Java的平臺就是JRE(Java Runtime Environment)。是不是覺得很奇怪,難道平臺不是指Windows、Linux這樣的操作系統(tǒng)嗎?沒錯,Windows和Linux也確實是平臺,但是這個平臺對于Java來說太寬泛了,就象從來沒有人說Java的平臺是i386、arm一樣。簡單理解就是光有操作系統(tǒng)是無法運行Java程序的。而JVM則包含在JRE里。

          如果某個語言對應的可執(zhí)行體能夠不作修改或者只做少量修改就能在其他平臺運行,那么這個語言就是跨平臺的。是的,允許做少量修改,但是這個過程一般是在程序員不知道的情況下進行的,通常這個任務由平臺來完成。但是不管怎么說,這只跟可執(zhí)行體有關,而不是源碼。

          對于一段Java程序,要讓它可以執(zhí)行,得至少經過兩個步驟,第一步,用Java編譯器將源碼編譯成字節(jié)碼;第二步,用Java解釋器執(zhí)行字節(jié)碼??梢娍梢?,Java程序并非像C程序那樣直接執(zhí)行,而是要有個啟動器,也就是所謂的JVM(Java Virtual Machine)來加載并執(zhí)行。由此可見,Java跨平臺的兩個重要因素是:
          1.有個能產生符合Java規(guī)范的字節(jié)碼的編譯器;
          2.有個能解釋上述符合Java規(guī)范的字節(jié)碼的解釋器。
          換句話說,在任何操作系統(tǒng)上,只要存在JRE,就可以運行Java可執(zhí)行體,而無所謂它來源于何處,只要”符合Java規(guī)范“就行。哈哈,到這里是不是有點亂,上面不是說Java的平臺是JRE嗎?難道JRE在不同的操作系統(tǒng)平臺上還會變?是的,正是因為上述Java工具集是隨操作系統(tǒng)的不同而不同的,我們才一再強調”符合Java規(guī)范的字節(jié)碼“。因為Java編譯器和Java解釋器等一系列的工具集本身是依賴于操作系統(tǒng)的,只不過它們的輸入和輸出都符合統(tǒng)一的Java規(guī)范。如果上述兩個條件換了其中任何一個,則很有可能使得Java不再跨平臺。

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

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

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

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

          文章出處:http://www.diybl.com/course/3_program/java/javajs/20081013/150474.html


          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 华蓥市| 清水县| 锡林郭勒盟| 玉门市| 汾阳市| 阳谷县| 佳木斯市| 乐安县| 湖口县| 永城市| 禹州市| 铁岭县| 定州市| 石泉县| 武鸣县| 海兴县| 新绛县| 正安县| 泰宁县| 同德县| 霍林郭勒市| 布尔津县| 海盐县| 甘泉县| 蒙阴县| 陆河县| 明星| 南陵县| 麻城市| 清原| 高雄市| 凌海市| 德化县| 新安县| 东源县| 章丘市| 金溪县| 馆陶县| 阿克陶县| 赤水市| 海阳市|