淺談JVM編譯原理->.java文件轉變為.class文件的過程


為什么需要編譯?

我們平常寫代碼,有規范的命名方式,都能夠看得懂,但是我們寫的代碼計算機是看不懂的,所以需要編譯,也就是一個轉換的過程,如下:

1.這個是咱們平時寫的代碼,就比較好理解,對人友好

2.編譯后就變成了這樣的字節碼文件,對JVM友好

那么這個轉換的過程是什么樣子呢?

我們可以回想一下,我們在寫代碼的時候,我們使用的開發工具idea或者eclipse編寫代碼的時候,是不是會遇到一些提示,比如說寫了一個if,但是后面的括號內不是一個bool值,就會出現一個紅色的提示波浪線,出現這種情況,那么編譯是肯定不可能通過的,所以我們可以肯定,編譯的過程一定有一個這樣的基本語法的規則;

一個完整的規則可以用下面這張圖來表示(引用,文章結尾給出url)

1)詞法分析:讀取源代碼,一個字節一個字節的讀進來,找出這些詞法中我們定義的語言關鍵詞如:if、else、while等,識別哪些if是合法的哪些是不合法的。這個步驟就是詞法分析過程。

      詞法分析的結果:就是從源代碼中找出了一些規范化的token流,就像人類語言中,給你一句話你要分辨出哪些是一個詞語,哪些是標點符號,哪些是動詞,哪些是名詞。

2)語法分析:就是對詞法分析中得到的token流進行語法分析,這一步就是檢查這些關鍵詞組合在一起是不是符合Java語言規范。如if的后面是不是緊跟着一個布爾型判斷表達式。

      語法分析的結果:就是形成一個符合Java語言規定的抽象語法樹,抽象語法樹是一個結構化的語法表達形式,它的作用是把語言的主要詞法用一個結構化的形式組織在一起。這棵語法樹可以被后面按照新的規則再重新組織。

3)語義分析:語法分析完成之后也就不存在語法問題了,語義分析的主要工作就是把一些難懂的,復雜的語法轉化成更簡單的語法。就如難懂的文言文轉化為大家都懂的百話文,或者是注釋一下一些不懂的成語。

      語義分析結果:就是將復雜的語法轉化為簡單的語法,對應到Java就是將foreach轉化為for循環,還有一些注釋等。最后生成一棵抽象的語法樹,這棵語法樹也就更接近目標語言的語法規則。

4)字節碼生成:將會根據經過注釋的抽象語法樹生成字節碼,也就是將一個數據結構轉化為另外一個數據結構。就像將所有的中文詞語翻譯成英文單詞后按照英文語法組裝文英文語句。

總結如下:

詞法分析就是將關鍵詞組織成token流即檢查源碼中的的關鍵詞是否真確並組織成token流,而語法分析就是檢查源碼是否符合java語法規范並將詞組成語句。語義分析就是簡化復雜的添加缺少的,檢查變量類型是否合法。代碼生成器就是(javac編譯器調用com.sun.tools.javac.jvm.Gen)遍歷這棵樹生成符合JVM規范的代碼。

這些最后生成的二進制文件就是CPU執行的指令。

 

原文學習來自https://blog.csdn.net/fuzhongmin05/article/details/54880257


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM