我們一般將CPU處理器和操作系統(tǒng)的整體叫做平臺(tái)螟蒸。CPU種類繁多盒使,如Intel、AMD七嫌、PowerPC等等少办。不同的CPU有不同的特定的指令集來(lái)計(jì)算和控制計(jì)算機(jī)系統(tǒng)。操作系統(tǒng)是用戶和計(jì)算機(jī)之間交互的界面軟件抄瑟,不同操作系統(tǒng)支持不同的CPU凡泣,即不同操作系統(tǒng)支持不同的CPU指令集枉疼,但不一定一種操作系統(tǒng)唯一支持一種指令集皮假。像Windows、Linux骂维、Mac都支持Intel和AMD的CPU指令集惹资。
如果我們要開發(fā)程序,則我們需要確認(rèn)平臺(tái)是什么——CPU的類型即指令類型和操作系統(tǒng)航闺。如果用標(biāo)準(zhǔn)C開發(fā)程序褪测,使用不同的編譯器后的可執(zhí)行文件是可以在對(duì)應(yīng)的平臺(tái)上運(yùn)行的。比如使用GCC編譯潦刃,生成可執(zhí)行文件可以在Linux上運(yùn)行侮措。使用特定編譯器編譯的程序只能在對(duì)應(yīng)的平臺(tái)上運(yùn)行,編譯器是與平臺(tái)相關(guān)的乖杠,編譯后的文件也是與平臺(tái)相關(guān)的分扎。這種執(zhí)行方式稱作編譯執(zhí)行,它把源程序與特定平臺(tái)的編譯器一次性編譯成平臺(tái)相關(guān)的機(jī)器碼胧洒。優(yōu)點(diǎn)是執(zhí)行速度快畏吓,缺點(diǎn)是無(wú)法跨平臺(tái)。
接著我們看看Java程序的跨平臺(tái)性是怎么實(shí)現(xiàn)的——Java程序被編譯成一種中間語(yǔ)言卫漫,再由JVM將Java字節(jié)碼(.class文件)翻譯成機(jī)器語(yǔ)言菲饼。Java源程序編譯的結(jié)果是生成Java字節(jié)碼列赎,不同平臺(tái)下生成的Java字節(jié)碼是相同的包吝,但由JVM翻譯成的機(jī)器碼卻不一樣派哲。再次強(qiáng)調(diào)芭届,跨平臺(tái)的是Java程序持隧,因?yàn)槠浜竺鏁?huì)被與平臺(tái)不相關(guān)的編譯器編譯成與平臺(tái)不相關(guān)的中間碼屡拨。JVM不是跨平臺(tái)的呀狼。不同平臺(tái)下需要安裝不同的JVM。
總結(jié)一下,無(wú)論我們使用什么語(yǔ)言編程祖乳,最終要在設(shè)備上運(yùn)行,那一定要被翻譯成機(jī)器能識(shí)別執(zhí)行的機(jī)器碼隙赁。C、C++這種編譯性語(yǔ)言厚掷,在不同的編譯器下直接編譯特定的機(jī)器碼,在特定的平臺(tái)下運(yùn)行抡爹。而Java則屬于先編譯后解釋型的語(yǔ)言欧穴。與平臺(tái)不相關(guān)的編譯器編譯成了與平臺(tái)不相關(guān)的.class文件,然后再由JVM解釋成其平臺(tái)下的機(jī)器碼调缨。就是由于多出的這個(gè)機(jī)制,讓Java程序看起來(lái)與眾不同湾蔓。
有人會(huì)說(shuō)咸包,不同平臺(tái)下使用的機(jī)器碼是不同的烂瘫,所以不同平臺(tái)下的JVM一般不同,這樣才翻譯成不同的機(jī)器碼,這跟C要被翻譯成不同的機(jī)器碼有什么本質(zhì)不同嗎籍琳?怎么多了個(gè)中間碼就跨平臺(tái)了势誊。如果你還冒出這個(gè)疑惑查近,那說(shuō)明你沒(méi)有真正明白跨平臺(tái)指代的對(duì)象勋锤。當(dāng)提出的“跨平臺(tái)性”等概念時(shí)候矮冬,我們一定要緊抓其指的對(duì)象到底是什么胎署。不然云里霧里恢筝,基礎(chǔ)不扎實(shí),人容易心虛不自信巨坊。