文章目錄
- 程式運行的兩種方式:靜態編譯和動態解釋
- Java嚴格說來是“半解釋半編譯”型的語言
- 通過編譯原理理解java虛擬機編譯和解釋機制
- 位元組碼檔案和JVM的關系
- JVM如何實作跨平臺
程式運行的兩種方式:靜態編譯和動態解釋
- 靜態編譯的程式在執行前全部被翻譯為機器碼
- 動態解釋執行的則是一句一句邊運行邊翻譯
Java嚴格說來是“半解釋半編譯”型的語言
- Java代碼首先由javac編譯器編譯成位元組碼(ByteCode),位元組碼檔案中JVM指令(也稱位元組碼指令)是JVM唯一能夠識別的指令,JVM執行JVM指令時,通過JVM解釋器逐條讀取位元組碼檔案中JVM指令解釋為機器碼執行,當某一方法呼叫次數達到即時編譯定義的閾值時,就會觸發即時編譯器JIT進行優化生成機器碼,
- 位元組碼檔案和JVM指令的規范由JVM規范定義,JVM在不同的硬體平臺上需要有不同實作,以達到所謂“一次撰寫,到處運行”的目標,
解釋器的作用: 省去編譯的時間,使代碼立即執行,
JIT編譯器的作用: 運行時將反復執行的熱點代碼編譯為二進制機器碼,避免解釋器反復解釋,提高運行效率,
通過編譯原理理解java虛擬機編譯和解釋機制
在編譯原理中Javac編譯器被稱為前端編譯器,而JIT編譯器被稱為后端編譯器,
(1)在編譯原理中,通常將編譯分為前端和后端,其中前端會對程式進行詞法分析、語法分析、語意分析,然后生成一個中間表達形式(稱為IR:Intermediate Representation),后端再講這個中間表達形式進行優化,最終生成目標機器碼,
注意:在Java中,javac之后生成的就是中間表達形式(.class)
(2)JVM在執行時,首先會逐條讀取IR的指令來執行,這個程序就是解釋執行的程序,當某一方法呼叫次數達到即時編譯定義的閾值時,就會觸發即時編譯,這時即時編譯器會將IR進行優化,并生成這個方法的機器碼,后面再呼叫這個方法,就會直接呼叫機器碼執行,這個就是編譯執行的程序,
位元組碼檔案和JVM的關系

- JVM虛擬機只能識別位元組碼檔案,任何語言只需要按照JVM規范中關于位元組碼檔案的標準生成位元組碼檔案,就可以在JVM中運行,而不僅僅只有java可以在JVM中運行,其他如Groovy、kotlin也可以在JVM編譯器中運行,
- JVM指令是JVM規范中定義的指令集,在不同的平臺JVM指令對應了不同的實作,從而實作了一次撰寫到處運行,
- 不同的語言需要不同的前端編譯器(如javac、groovyc編譯器)等,JVM只和位元組碼有關系,而與具體語言沒關系,
JVM如何實作跨平臺
不同CPU架構的匯編指令集不一致,jvm為了實作跨平臺,在JVM規范里定義了JVM指令集,針對同一指令在不同平臺架構做不同實作(既有C++代碼也行內了匯編代碼),從而實作了跨平臺,
不同語言的源檔案通過各自的編譯器按照JVM規范編譯為位元組碼檔案,JVM加載到記憶體中,通過解釋器解釋或通過JIT即時編譯器將JVM指令翻譯為二進制機器碼,交給CPU執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255667.html
標籤:其他
下一篇:Linux內核同步機制之基本概念
