1. Java語言比較特殊, 由Java編寫的程序需要經過編譯步驟,但這個編譯步驟不會產生特定平台的機器碼,而是生成一種與平台無關的字節碼(也就是.class文件)。這種字節碼不是可執行性的,必須使用Java解釋器來解釋執行。因此可以認為: Java語言既是編譯型語言,也是解釋型語言。 或者說,Java語言既不是純粹的編譯型語言,也不是純粹的解釋型語言。
Java程序的執行過程,必須經過先編譯,后解釋兩個步驟。
2. Java語言里,
負責解釋執行字節碼文件的是Java虛擬機,即JVM(Java Virtual Machine)。JVM是可以運行Java字節碼文件的虛擬計算機。所有平台上的JVM向編譯器提供相同的編程接口,而編譯器只需要面向虛擬機,生成虛擬機能理解的代碼,然后由虛擬機來解釋執行。在一些虛擬機的實現中,還會將虛擬機代碼轉換成特定系統的機器碼執行,從而提高運行效率。
3. 當使用Java編譯器編譯Java程序時,生成的是與平台無關的字節碼,這些字節碼不面向任何具體的平台。 只面向JVM。不同平台上的JVM都是不同的,但他們都提供了相同的接口。
JVM是Java程序跨平台的關鍵部分。只要為不同的平台實現了相應的虛擬機,編譯后的Java字節碼就可以在該平台上運行。顯然,相同的字節碼程序需要在不同的平台上運行,這幾乎是“不可能的”, 只有通過中間的轉換器才可以實現,JVM就是這轉換器。
4. JVM是一個抽象的計算機,和實際的計算機一樣,它具有指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。
Oracle公司制定的Java虛擬機規范在技術上規定了JVM的統一標准,具體定義了如下細節:
指令集
寄存器
類文件的格式
棧
垃圾回收堆
存儲區
Oracle公司制定的這些規范的目的是為了提供統一的標准,最終實現了Java程序的平台無關性。