Java程式執行機制簡介
Java程式執行機制
Java語言是一種特殊的高階語言,它既具有解釋型語言的特徵,也具有編譯型語言的特徵,因為Java程式要經過先編譯,後解釋兩個步驟。
高階語言的執行機制
計算機高階語言按程式的執行方式可以分為編譯型和解釋型兩種。編譯型語言是指使用專門的編譯器,針對特定平臺(作業系統)將某種高階語言原始碼一次性“翻譯”成可被該平臺硬體執行的機器碼(包括機器指令和運算元),幷包裝成該平臺所能識別的可執行性程式的格式,這個轉換過程稱為編譯(Compile),編譯生成的可執行性程式可以脫離開發環境,在特定的平臺上獨立執行。
有些程式編譯結束後,還可能需要對其他編譯好的目的碼進行連結,即組裝兩個以上的目的碼模組生成最終的可執行性程式,通過這種方式實現低層次的程式碼複用。
因為編譯型語言是一次性地編譯成機器碼,所以可以脫離開發環境獨立執行,而且通常執行效率較:高:但因為編譯型語言的程式被編譯成特定平臺上的機器碼,因此編譯生成的可執行性程式通常無法移植到其他平臺上執行;如果需要移植,則必須將原始碼複製到特定平臺上,針對特定平臺進行修改,至少也需要採用特定平臺上的編譯器重新編譯。
現有的C. C++, Objective-C. Swift. Kotlin等高階語言都屬於編譯型語言。
解釋型語言是指使用專門的直譯器對源程式逐行解釋成特定平臺的機器碼並立即執行的語言。解釋型語言通常不會進行整體性的編譯和連結處理,解釋型語言相當於把變異性語言中的編譯和解釋過程混合到一起同時完成。
可以認為:每次執行解釋型語言的程式都需要進行一次編譯,因此解釋型語言的程式執行效率通常較低,而且不能脫離直譯器獨立執行。但解釋型語言有一個優勢:跨平臺比較容易,只提供特定平臺的直譯器即可,每個特定平臺上的直譯器負責將源程式解釋成 特定平臺的機器指令即可。解釋型語言可以方便的實現原程式的移至,但這是以犧牲程式的執行效率為代價。
Java程式的執行機制與JVM
Java語言比較特殊,由Java語言編寫的程式需要經過編譯步驟,但這個編譯步驟並不會生成特定平臺的機器碼,而是生成與平臺無關的位元組碼(也就是class檔案)。當然,這種位元組碼不是可執行的,必須使用Java直譯器來解釋執行。因此可以認為:Java語言既是編譯型語言,也是解釋型語言。或者說,Java語言既不是純粹的解釋型語言,也不是純粹的編譯型語言。Java程式的執行過程必須經過編譯,後解釋兩個步驟。
Java語言負責解釋執行位元組碼檔案的是JVM(Java Virtual Machine)虛擬機器。JVM是可以執行Java位元組碼的虛擬機器。所有的平臺上的JVM想變一起提供相同的程式設計介面,而編譯器只需要面向虛擬機器,生成虛擬機器能夠理解的程式碼,然後由虛擬機器執行。在一些虛擬機器的實現中,還會將一些虛擬機器程式碼轉換成特定系統的機器碼執行,從而提高效率。
JVM的實現細節:
- 指令集
- 儲存器
- 類檔案的格式
- 棧
- 垃圾回收堆
- 儲存區