什麼是編譯?
程序員寫完代碼是.java文件,我們的機器是不認識的。需要通過JVM把字節碼翻譯成機器語言,而不同平臺安裝不同版本的JVM即可編譯成具有對應平臺特性的機器語言。
編譯步驟
前端編譯
我們所熟知的javac的編譯就是前端編譯。將.java文件編譯成.class文件
下面的步驟歌跟英語語句理解一樣
詞法分析
先分析每個單詞有沒有拼寫錯誤。
這裏指找出其中我們定義好的關鍵字,找出規範化的Token流。
語法分析
語法有沒有錯誤,比如主謂賓。
這裏指java語言規範(如在if後面是不是緊跟着一個布爾判斷表達式),形成一個符合java語言規範的抽象語法樹。
語義分析
這段語句所表達的意思是否正確。
這裏指將一些難懂的、複雜的語法轉化成更加簡單的語法,結果形成最簡單的語法(如將foreach轉換成for循環、註解等)。形成一個註解過後的抽象語法樹,這個語法樹更爲接近目標語言的語法規則。
中間代碼
通過字節碼生產器將經過註解的抽象語法樹轉化成符合jvm規範的字節碼
該中間代碼有兩個重要的性質:
- 易於生成
- 能夠輕鬆地翻譯爲目標機器上的語言
後端編譯
後端編譯主要指與目標機有關的部分,包括代碼優化和目標代碼生成等。
這部分編譯主要是JVM通過解釋字節碼將其翻譯成對應的機器指令,逐條讀入,逐條解釋翻譯成機器碼
JIT優化
上面說的後端編譯
,每次方法執行JVM通過解釋字節碼將其翻譯成對應的機器指令,逐條讀入,逐條解釋翻譯成機器碼。很顯然,經過解釋執行,其執行速度必然會比直接執行的二進制字節碼程序慢很多。爲了解決這種效率問題,引入了 JIT 技術。
JAVA程序先通過解釋器進行解釋執行,當JVM發現某個方法或代碼塊運行特別頻繁的時候,就會認爲這是“熱點代碼”(Hot Spot Code)。然後JIT會把部分“熱點代碼”翻譯成本地機器相關的機器碼,並進行優化,然後再把翻譯後的機器碼緩存起來,以備下次使用。
優化技術
- 公共子表達式消除
- 數組範圍檢查消除
- 方法內聯
- 逃逸分析
上面優化技術,具體的不展開了。因爲工作上沒怎麼用到過,只需要瞭解就行了