噢!我的編譯器 - Introduction II

在上一篇 Introduction to Compiler - I 中簡述了編譯器的工作以及編譯系統的流程,接著我們將更深入的打開 compiler 的盒子,看看它到底是經過了哪些處理完成編譯的!

The Structure of a Compiler

龍書裡面提到,我們可以將編譯器做的事情分為兩階段:

  1. 分析 (analysis): 又稱為 compiler 的 **前端處理 (front-end)**,分析與解構原始碼,並將資訊整理成 中介表示 (intermediate representation)符號表 (symbol table) 傳給下一階段,當中如果發現任何錯誤就會噴錯誤訊息
  2. 生成 (synthesis): 又稱為 compiler 的 **後端處理 (back-end)**,根據符號表與中介表示產出目標程式碼

套入翻譯的時候大腦快速運轉的流程也是說的通的,總是得對 A 語言的句子進行分析才能夠生成 B 語言的句子啊!例如,這幾學期學得很痛苦的法文 XD

中文的「我起床了」是一句多麼直覺且精簡的表達一個動作,句型就是「主詞 + 動詞 + 語末助詞」,其實翻成英文也十分簡單,”I got up.”,一樣的句型構成,但有了過去式,畢竟起床這事兒已經發生了,反觀法文…….

法文文法書有一課提到「反身」,相當於中文的「我自己」、「你自己」還有英文的 yourself、myself 。但法文不太一樣,有些動詞必須要用反身的句型,例如起床、洗臉、梳頭,因為是「我自己起的床」、「我自己梳的頭」。所以同樣的一句話在法文是 “Je me lève.” 而不是 “Je lève.”,因此看到這句絕對不要翻成「我自己起床」,而是「我起床了」,否則其他人一陣嘲笑就是你的錯誤訊息囉!
所以,勢必得對句子進行單字及文法 分析,我們才能 生成 準確的翻譯囉!學了他國語言總是覺得中文最簡單,但法文特別虐腦倒是真的 QAQ

當然,我們還可以再把編譯器的工作從這兩大點再細分出來:

  1. 分析 (analysis):
    • 詞彙分析器 (lexical analyzer),亦稱 scanner,建立 symbol table
    • 語法分析器 (syntax analyzer),亦稱 parser
    • 語意分析器 (semantic analyzer)
    • 中間碼產生器 (intermediate code generator
    • 程式碼最佳化 (code optimizer) (optional & machine-independent)
  2. 生成 (synthesis):
    • 程式碼產生器 (code generator)
    • 機械碼最佳化 (machine-independent code optimizer) (optional & machine-independent)

流程圖如下:

因為 symbol table 在各個步驟都會使用到,因此把它獨立畫出來

compile 的步驟

先有個概觀,接下來我們就要把焦點移到各個步驟囉!