JVM基礎系列第3講:到底什么是虛擬機?


我們都知道在 Windows 系統上一個軟件包裝包是 exe 后綴的,而這個軟件包在蘋果的 Mac OSX 系統上是無法安裝的。類似地,Mac OSX 系統上軟件安裝包則是 dmg 后綴,同樣無法在 Windows 系統上安裝。

為什么不同系統上的軟件無法安裝,這是因為操作系統底層的實現是不一樣的。對於 Windows 系統來說,exe 后綴的軟件代碼最終編譯成 Windows 系統能識別的機器碼。而 Mac OSX 系統來說,dmg 后綴的軟件代碼最終編譯成 Mac OSX 系統能識別的代碼。

系統軟件無法通用是一個常見的問題。但使用過 Java 的同學都知道,Java 代碼可以在服務端(Linux 系統)運行,也可以在 Windows 系統運行,但我們並沒有生成多份不同的代碼。所以 Java 語言是如何做到的呢?

與其他語言不同,Java 語言並不直接將代碼編譯成與系統有關的機器碼,而是編譯成一種特定的語言規范,這種語言規范我們稱之為字節碼。無論 Java 程序要在 Windows 系統,還是 Mac OSX 系統,抑或是 Linux 系統,它首先都得編譯成字節碼文件,之后才能運行。

但即使編譯成字節碼文件了,各個系統還是無法明白字節碼文件的內容,這時候就需要 Java 虛擬機的幫助了。Java 虛擬機會解析字節碼文件的內容,並將其翻譯為各操作系統能理解的機器碼。

簡單地說,對於同樣一份 Java 源碼文件,我們編譯成字節碼之后,無論是 Linux 系統還是 Windows 系統都不認識。這時候 Java 虛擬機就是一個翻譯官,在 Linux 系統上翻譯成 Linux 機器碼給 Linux 系統聽,在 Windows 系統上翻譯成 Windows 機器碼給 Windows 系統聽。這樣一來,Java 就實現了「Write Once,Run Anywhere」的偉大願景了。

在 Java 虛擬機還沒出現之前,為了支持軟件在不同系統上運行,我們必須在多個平台寫多份代碼,分別對應特定的系統。但 Java 虛擬機出現之后,你只需要按照特定規范編譯書寫,編譯器編譯成字節碼文件后,虛擬機會幫你將字節碼生成對應的 Windows Code 和 Mac Code。本質上最終還是會生成 Windows Code 和 Mac Code 兩份機器代碼,但對於開發人員來說,卻只需要寫一次代碼了。Java 虛擬機幫開發人員承擔了重復的工作,讓開發效率更高了。

很多初學者關於 Java 虛擬機有一個誤區,他們會覺得 Java 虛擬機只能運行 Java 代碼。但實際上 Java 虛擬機運行的是字節碼文件。換句話說,如果你用 php 語言寫一段代碼,並自己用特定編譯器能生成符合字節碼規范的字節碼文件,那么 Java 虛擬機也是可以運行的。

所以雖然名字是 Java 虛擬機,但 Java 虛擬機與 Java 語言沒有直接關系,它只按照 Java 虛擬機規范去讀取 Class 文件,並按照規定去解析、執行字節碼指令,僅此而已。

如果你夠牛逼,你完全可以寫一個編譯器,將 PHP 語言代碼編譯成符合 Java 虛擬機規范的字節碼文件,那么 Java 虛擬機也是可以執行的。

准確地說,Java 虛擬機與字節碼文件(Class文件)綁定。

最后,讓我們回顧一下,到底什么是虛擬機?其實 Java 虛擬機就是一個字節碼翻譯器,它將字節碼文件翻譯成各個系統對應的機器碼,確保字節碼文件能在各個系統正確運行。

參考資料


如果只是看,其實無法真正學會知識的。為了幫助大家更好地學習,我建了一個虛擬機群,專門討論學習 Java 虛擬機方面的內容,每周針對我所發文章進行討論答疑。如果你有興趣,關注「陳樹義」公眾號,通過右下角菜單「入群交流」加我好友,小助手會拉你入群。

JVM基礎系列文章目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM