直面Java 第003期
。 問:什麼是平臺無關性,Java是如何做到平臺無關的? 解: 大家說的都很對,看來大家對這個概念掌握的很可以。我簡單總結一下。 跨平臺指的是一種語言在計算機上的執行不受平臺的約束,一次編譯,到處執行。 平臺無關有兩種:原始碼級和目的碼級。 我們常說的跨平臺,或者平臺無關,指的就是目的碼,或者說是軟體交付件跨平臺。 C和C++具有一定程度的原始碼級平臺無關,表明用C或C++寫的應用程式不用修改只需重新編譯就可以在不同平臺上執行。但是,關鍵是要重新編譯。可是,一般軟體交付都是給你個成品,對於C或者C++開發出的軟體,只能執行在某個平臺的。沒有原始碼,怎麼編譯。 Java編譯出來的是位元組碼,去到哪個平臺都能用,只要有那個平臺的JDK就可以執行,所以,Java程式的最大優勢就是平臺無關。對於Java,交付的就是一堆jar包或者war包,只要系統上有個Java虛擬機器,就可以直接執行,這不就是跨平臺了麼。 我們使用的C、C++還有Java等高階語言,都需要最終被編譯成機器語言,才能被計算機執行。 C語言和C++語言的編譯過程是把原始碼編譯生成機器語言。這樣機器可以直接執行。但是不同系統對同一段“機器語言”的處理結果可能是不一樣的,原因可能有很多,比如CPU的指令集不同的。C語言不能實現跨平臺執行,就是因為它編譯出來的檔案的格式,只適用於某種cpu,其他cpu無法識別。 那麼Java是如何實現跨平臺的呢? 我們編寫的Java原始碼,編譯後會生成一種 .class 檔案,稱為位元組碼檔案。這種位元組碼檔案需要經過JVM虛擬機器,然後翻譯成機器語言,才能被機器執行。 那麼,由於我們可以在不同的作業系統上安裝不同的JVM,而JVM封裝了所有對於.class檔案的處理,即JVM幫我們把位元組碼翻譯成機器語言的過程中就已經充分考慮到對應平臺的特性了。比如,一個.class檔案,在不同機器上最終生成的機器語言可能是不同的,但是這種不同不需要我們關心,JVM會保證他可以正常執行,完整的表達正確的程式語義。