JVM之編譯

什麼是編譯?

程序員寫完代碼是.java文件,我們的機器是不認識的。需要通過JVM把字節碼翻譯成機器語言,而不同平臺安裝不同版本的JVM即可編譯成具有對應平臺特性的機器語言。

編譯步驟

前端編譯

我們所熟知的javac的編譯就是前端編譯。將.java文件編譯成.class文件

下面的步驟歌跟英語語句理解一樣

詞法分析

先分析每個單詞有沒有拼寫錯誤。

這裏指找出其中我們定義好的關鍵字,找出規範化的Token流。

語法分析

語法有沒有錯誤,比如主謂賓。

這裏指java語言規範(如在if後面是不是緊跟着一個布爾判斷表達式),形成一個符合java語言規範的抽象語法樹。

語義分析

這段語句所表達的意思是否正確。

這裏指將一些難懂的、複雜的語法轉化成更加簡單的語法,結果形成最簡單的語法(如將foreach轉換成for循環、註解等)。形成一個註解過後的抽象語法樹,這個語法樹更爲接近目標語言的語法規則。

中間代碼

通過字節碼生產器將經過註解的抽象語法樹轉化成符合jvm規範的字節碼

該中間代碼有兩個重要的性質:

  • 易於生成
  • 能夠輕鬆地翻譯爲目標機器上的語言

後端編譯

後端編譯主要指與目標機有關的部分,包括代碼優化和目標代碼生成等。

這部分編譯主要是JVM通過解釋字節碼將其翻譯成對應的機器指令,逐條讀入,逐條解釋翻譯成機器碼

JIT優化

上面說的後端編譯,每次方法執行JVM通過解釋字節碼將其翻譯成對應的機器指令,逐條讀入,逐條解釋翻譯成機器碼。很顯然,經過解釋執行,其執行速度必然會比直接執行的二進制字節碼程序慢很多。爲了解決這種效率問題,引入了 JIT 技術。

JAVA程序先通過解釋器進行解釋執行,當JVM發現某個方法或代碼塊運行特別頻繁的時候,就會認爲這是“熱點代碼”(Hot Spot Code)。然後JIT會把部分“熱點代碼”翻譯成本地機器相關的機器碼,並進行優化,然後再把翻譯後的機器碼緩存起來,以備下次使用。

優化技術

  1. 公共子表達式消除
  2. 數組範圍檢查消除
  3. 方法內聯
  4. 逃逸分析

上面優化技術,具體的不展開了。因爲工作上沒怎麼用到過,只需要瞭解就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章