編譯的各個階段

白色風車發表於2019-05-09

編譯器的工作可以分成若干階段,每個階段把源程式從一種表示變換成另一種表示。

詞法分析

詞法分析閱讀構成源程式的字元流,按程式語言的詞法規則把它們組成詞法記號( token )流。

語法分析

語法分析( syntax analysis )簡稱分析( parsing ),它檢查詞法分析輸出的記號流是否符合程式語言的語法規則,並依據這些規則所體現出的語言構造( construct,如函式、語句、表示式等 )的層次性,用各記號的第一元建成一種樹形的中間表示,這個中間表示用抽象語法的方式描繪了該記號流的語法情況。一種典型的中間表示是語法樹,其中內部結點表示運算,它們的子結點代表該運算的運算物件。

語義分析

語義分析階段使用語法樹和符號表中的資訊,依據語言定義來檢查源程式各部分之間的語義一致性,以保證程式各部分能有意義地結合在一起。它還收集型別資訊,把它們儲存在符號表或語法樹中。

語義分析的一個重要部分是型別檢查,編譯器檢查每個算符的運算物件,看它們的型別是否適當。例如,當實數作為陣列的下標時,許多語言的定義都要求編譯器報告錯誤。語言定義也可能允許運算物件的型別作隱式轉換,例如當二元算術算符作用於一個整數和一個實數時,編譯器會把其中的整數轉換為實數。

中間程式碼生成

經過語法分析和語義分析後,許多編譯器為源程式產生更低階的顯式中間表示,可以把這種中間表示想像成一種抽象機的程式。這種中間表示必須具有兩個性質:它易於產生並且易於翻譯成目標程式。

程式碼優化

獨立於機器的程式碼優化階段試圖改進中間程式碼,以便產生較好的目的碼。通常,“較好”是指執行較快,但也可能期望其他目標,如目的碼較短或目的碼執行時能耗較低。

程式碼生成

程式碼生成是指取源程式的一種中間表示作為輸入並把它對映到一種目標語言。如果目標語言是機器程式碼,則需要為源程式所用的變數選擇暫存器或記憶體單元,然後把中間指令序列翻譯為完成同樣任務的機器指令序列。

相關文章