概述
-
執行引擎是Java虛擬機的核心組成部分之一
-
虛擬機是一個相對於“物理機”的概念,這兩種機器都有代碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、緩存、指令集和操作系統層面上的,而虛擬機的執行引擎則是由軟件自行實現的,因此可以不受物理條件制約地定制指令集與執行引擎的結構體系,能夠執行那些不被硬件直接支持的指令集格式
-
JVM的主要任務是負責裝載字節碼到其內部,但字節碼並不能夠直接運行在操作系統之上,因為字節碼指令並非等價於本地機器指令,它內部包含的僅僅只是一些能夠被JVM鎖識別的字節碼指令、符號表和其他輔助信息
-
那么,如果想讓一個Java程序運行起來、執行引擎的任務就是將字節碼指令解釋/編譯為對應平台上的本地機器指令才可以。簡單來說,JVM中的執行引擎充當了將高級語言翻譯為機器語言的譯者
-
從外觀上來看,所有的Java虛擬機的執行引擎輸入、輸出都是一致的:輸入的是字節碼二進制流,處理過程是字節碼解析執行的等效過程,輸出的是執行結果
-
執行引擎在執行的過程中究竟需要執行什么樣的字節碼指令完全依賴於PC寄存器
-
每當執行完一項指令操作后,PC寄存器就會更新下一條需要被執行的指令地址
-
當然方法在執行的過程中,執行引擎有可能會通過存儲在局部變量表中的對象引用准確定位到存儲在Java堆區中的對象實例信息,以及通過對象頭中的元數據指針定位到目標對象的類型信息
Java代碼編譯和執行過程
大部分的程序代碼轉換成物理機的目標代碼或虛擬機能執行的指令集之前,都需要經過下面圖中的各個步驟:
Java代碼編譯是由Java源碼編譯器來完成,流程圖如下所示:
Java字節碼的執行是由JVM執行引擎來完成,流程圖如下所示:
解釋器( Interpreter)與 即時編譯器(Just In Time Compiler)
- 解釋器:當Java虛擬機啟動時會根據預定義的規范對字節碼采用逐行解釋的方式執行,將每條字節碼文件中的內容“翻譯”為對應平台的本地機器指令執行
- 即時編譯器:就是虛擬機將源代碼直接編譯成和本地機器平台相關的機器語言
為什么說Java是半編譯半解釋型語言?
JDK1.0時代,將Java語言定位為“解釋執行”還是比較准確的。再后來,Java也發展出可以直接生成本地代碼的編譯器
現在JVM在執行Java代碼的時候,通常都會將解釋執行與編譯執行二者結合起來進行
機器碼、指令、指令集、匯編語言、高級語言
機器碼
- 各種用二進制編碼方式表示的指令,叫做機器指令碼。開始,人們就用它采編寫程序,這就是機器語言
- 機器語言雖然能夠被計算機理解和接受,但和人們的語言差別太大,不易被人們理解和記憶,並且用它編程容易出差錯
- 用它編寫的程序一經輸入計算機,CPU直接讀取運行,因此和其他語言編的程序相比,執行速度最快
- 機器指令與CPU緊密相關,所以不同種類的CPU所對應的機器指令也就不同
指令
- 由於機器碼是有0和1組成的二進制序列,可讀性實在太差,於是人們發明了指令
- 指令就是把機器碼中特定的0和1序列,簡化成對應的指令(一般為英文簡寫,如mov,inc等),可讀性稍好
- 由於不同的硬件平台,執行同一個操作,對應的機器碼可能不同,所以不同的硬件平台的同一種指令(比如mov),對應的機器碼也可能不同
指令集
- 不同的硬件平台,各自支持的指令,是有差別的。因此每個平台所支持的指令,稱之為對應平台的指令集
- 如常見的
- x86指令集,對應的是x86架構的平台
- ARM指令集,對應的是ARM架構的平台
匯編語言
- 由於指令的可讀性還是太差,於是人們又發明了匯編語言
- 在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或操作數的地址
- 在不同的硬件平台,匯編語言對應着不同的機器語言指令集,通過匯編過程轉換成機器指令,由於計算機只認識指令碼,所以用匯編語言編寫的程序還必須翻譯成機器指令碼,計算機才能識別和執行
高級語言
- 為了使計算機用戶編程序更容易些,后來就出現了各種高級計算機語言。高級語言比機器語言、匯編語言更接近人的語言
- 當計算機執行高級語言編寫的程序時,仍然需要把程序解釋和編譯成機器的指令碼。完成這個過程的程序就叫做解釋程序或編譯程序
附:JVM學習目錄