1. 程式人生 > >℃江的觀後感--語法分析器、語義分析器和程式碼生成器總結

℃江的觀後感--語法分析器、語義分析器和程式碼生成器總結

其實javac在進行這些個什麼器的實現都是由一些類生成。這裡做一個總結,方便日後檢視吧。

  • 語法分析器

    我記得前面是說過詞法分析器這個東西的,其作用也很直觀,就是將Java原始檔的字元流轉換成對應的Token流,我們我們所謂規範化程式碼程式,讓其將人能看懂的轉換成機器能看懂的第一步。第二部到了語法分析器的時候,說白了就是呼叫了 Tree 介面及其實現類。這個過程其實是在讀取詞法分析後read Token流的過程,並解析成了一個有結構,有一定規則並且可以方便操作的語法樹。

  • 語義分析器

    不知各位是否還記得,我們最開始用記事本‘照葫蘆畫瓢’的時候,有沒有注意到一個細節,我們想在控制檯列印我們語句,需要先進行Javac,然後我們發現目錄下多了一個class 檔案,那其實就是執行過後的位元組碼檔案,之前*.java的檔案是給人看的,這個.class檔案是給機器看的。我們現在闡述的什麼詞法分析、語法分析等等一系列操作,都是為了詳細闡述這個生成.class 檔案javac編譯器都做了啥操作,其實說白了就是做了翻譯的操作,很多的開發工具都是動態編譯的,你前腳寫完程式碼實時同步語法錯誤,這就造成我們理解的偏差,尤其是初學者我們可能會覺得編譯器報錯根本不算報錯。這還是很危險的。我說說這個構成,主要是最近有閱讀一些書籍,看過一些視訊,這個過程在實際工作成其實可以忽略,但是這個過程幾乎不可避免,編譯原理的作用我只說了javac,其實理論上我們能實現將我們寫的Java程式碼,翻譯成任何型別的機器語言。

    語義分析器主要也是呼叫了幾個類:
    1、Enter類:用來操作類中出現的符號,輸入到指定的符號表中,這裡面也是有一個解析的過程。符號的理解可不是標點符號,是類名稱,變數名稱這類的符號。
    2、JavacProcessingEnvironment類:這個類是用來處理註解的,這有點兒類似Spring的那種註解的方式。
    3、Attr類:這個類是用來的標註的,邏輯判斷一些語義的合法性,通俗來講就是生活中的:說人話。
    4、Flow類:顧名思義了,資料流分析,這就是在說人話的前提下,看看是不是能說出一句完整的人話。

  • 程式碼生成器

    經過這步之後,會生成最終的Java位元組碼,其實也是呼叫了一個類來實現的:

    Gen類:就是將一定的組織格式輸出到class檔案中。這就搞定了,最總編譯器完成了他的翻譯工作。