posts - 25, comments - 11, trackbacks - 0, articles - 37

          如何理解語言的跨平臺性

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

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

          很多人因?yàn)橛昧?#8220;跨平臺的語言"寫沒有寫的出跨平臺的程序而盲目的認(rèn)為該語言的跨平臺性是子虛烏有。
          本文以Java為例就來討論一下”如何理解語言的跨平臺性“。

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

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

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

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

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

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

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 尉氏县| 金华市| 黑山县| 新龙县| 大丰市| 阿荣旗| 罗江县| 大方县| 玛纳斯县| 金山区| 德清县| 洪雅县| 赤壁市| 太原市| 嘉义县| 府谷县| 南陵县| 开化县| 曲阳县| 亚东县| 莒南县| 连山| 沭阳县| 茌平县| 双柏县| 安阳市| 新龙县| 山丹县| 辉南县| 沈丘县| 筠连县| 日土县| 资讯 | 兴山县| 肥城市| 略阳县| 洛隆县| 永德县| 镇巴县| 安化县| 弋阳县|