咱們都知道在 Windows 系統上一個軟件包裝包是 exe 後綴的,而這個軟件包在蘋果的 Mac OSX 系統上是沒法安裝的。相似地,Mac OSX 系統上軟件安裝包則是 dmg 後綴,一樣沒法在 Windows 系統上安裝。php
爲何不一樣系統上的軟件沒法安裝,這是由於操做系統底層的實現是不同的。對於 Windows 系統來講,exe 後綴的軟件代碼最終編譯成 Windows 系統能識別的機器碼。而 Mac OSX 系統來講,dmg 後綴的軟件代碼最終編譯成 Mac OSX 系統能識別的代碼。操作系統
系統軟件沒法通用是一個常見的問題。但使用過 Java 的同窗都知道,Java 代碼能夠在服務端(Linux 系統)運行,也能夠在 Windows 系統運行,但咱們並無生成多份不一樣的代碼。因此 Java 語言是如何作到的呢?翻譯
與其餘語言不一樣,Java 語言並不直接將代碼編譯成與系統有關的機器碼,而是編譯成一種特定的語言規範,這種語言規範咱們稱之爲字節碼。不管 Java 程序要在 Windows 系統,仍是 Mac OSX 系統,抑或是 Linux 系統,它首先都得編譯成字節碼文件,以後才能運行。blog
但即便編譯成字節碼文件了,各個系統仍是沒法明白字節碼文件的內容,這時候就須要 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 文件,並按照規定去解析、執行字節碼指令,僅此而已。it
若是你夠牛逼,你徹底能夠寫一個編譯器,將 PHP 語言代碼編譯成符合 Java 虛擬機規範的字節碼文件,那麼 Java 虛擬機也是能夠執行的。編譯
準確地說,Java 虛擬機與字節碼文件(Class文件)綁定。
最後,讓咱們回顧一下,到底什麼是虛擬機?其實 Java 虛擬機就是一個字節碼翻譯器,它將字節碼文件翻譯成各個系統對應的機器碼,確保字節碼文件能在各個系統正確運行。