我們一般將CPU處理器和操作系統(tǒng)的整體叫做平臺。CPU種類繁多,如Intel、AMD、PowerPC等等。不同的CPU有不同的特定的指令集來計算和控制計算機系統(tǒng)。操作系統(tǒng)是用戶和計算機之間交互的界面軟件,不同操作系統(tǒng)支持不同的CPU,即不同操作系統(tǒng)支持不同的CPU指令集,但不一定一種操作系統(tǒng)唯一支持一種指令集。像Windows、Linux、Mac都支持Intel和AMD的CPU指令集。
如果我們要開發(fā)程序,則我們需要確認(rèn)平臺是什么——CPU的類型即指令類型和操作系統(tǒng)。如果用標(biāo)準(zhǔn)C開發(fā)程序,使用不同的編譯器后的可執(zhí)行文件是可以在對應(yīng)的平臺上運行的。比如使用GCC編譯,生成可執(zhí)行文件可以在Linux上運行。使用特定編譯器編譯的程序只能在對應(yīng)的平臺上運行,編譯器是與平臺相關(guān)的,編譯后的文件也是與平臺相關(guān)的。這種執(zhí)行方式稱作編譯執(zhí)行,它把源程序與特定平臺的編譯器一次性編譯成平臺相關(guān)的機器碼。優(yōu)點是執(zhí)行速度快,缺點是無法跨平臺。

接著我們看看Java程序的跨平臺性是怎么實現(xiàn)的——Java程序被編譯成一種中間語言,再由JVM將Java字節(jié)碼(.class文件)翻譯成機器語言。Java源程序編譯的結(jié)果是生成Java字節(jié)碼,不同平臺下生成的Java字節(jié)碼是相同的,但由JVM翻譯成的機器碼卻不一樣。再次強調(diào),跨平臺的是Java程序,因為其后面會被與平臺不相關(guān)的編譯器編譯成與平臺不相關(guān)的中間碼。JVM不是跨平臺的。不同平臺下需要安裝不同的JVM。

總結(jié)一下,無論我們使用什么語言編程,最終要在設(shè)備上運行,那一定要被翻譯成機器能識別執(zhí)行的機器碼。C、C++這種編譯性語言,在不同的編譯器下直接編譯特定的機器碼,在特定的平臺下運行。而Java則屬于先編譯后解釋型的語言。與平臺不相關(guān)的編譯器編譯成了與平臺不相關(guān)的.class文件,然后再由JVM解釋成其平臺下的機器碼。就是由于多出的這個機制,讓Java程序看起來與眾不同。
有人會說,不同平臺下使用的機器碼是不同的,所以不同平臺下的JVM一般不同,這樣才翻譯成不同的機器碼,這跟C要被翻譯成不同的機器碼有什么本質(zhì)不同嗎?怎么多了個中間碼就跨平臺了。如果你還冒出這個疑惑,那說明你沒有真正明白跨平臺指代的對象。當(dāng)提出的“跨平臺性”等概念時候,我們一定要緊抓其指的對象到底是什么。不然云里霧里,基礎(chǔ)不扎實,人容易心虛不自信。