close

*有些圖片太小放大會超過邊界請見諒

1-2編譯器的構造

藍字為書上的內容。

編譯器就是把'源程序 映射為語意上等價的目標程序',映射這個動作會分成兩個部份分別是anaysis(分析)、synthesis(綜合)。

上面這行藍色的字我認為可以簡單的解釋為把'中文翻譯成英文',因為都是把語言翻譯成另一種語言,而意思不變。

analysis(分析):

把程式分成多個部份,在每個部份加上語法結構,'它使用這個結構來創建該源程序的一個中間表示'(老實說我也沒有很清楚這行的意思┐(´д`)┌)。如果你的程式碼有語義、語法上的錯誤,就會報錯,然後它還會把該程式碼的訊息放在一個叫做symbol table(符號表)的數據結構,把symbol table 跟中間表示傳送給綜合。

synthesis(綜合):

把analysis傳過來的資訊構造目標程序(編譯後的程式碼)。

 

analysis被稱為(front end)前端,synthesis被稱為back end(後端)。

 

詞法分析(lexical analyisis)

image

這整個過程被稱為lexical analysis(詞法分析)/scanning(掃描),首先詞法分析器會把字符流(我也不清楚這個東西୧☉□☉୨)組成lexeme在映射為詞法單元

舉個例子:

image

image

所以這行經過了詞法分析器後會變成:

image

=、+、*在詞法單元中稱抽象運算符

 

語法分析(syntax analysis)

這個步驟稱為syntax analysis/parsing(解析),簡單說就是把上方的詞法單元變成一棵語法樹(syntax tree)。

image

這會扯到資料結構(在資料結構中稱為skewed tree(歪斜樹)),不過算是很簡單的概念,從最下面開始,我們把60跟<id,3>相乘,在跟<id,2>相加最後賦予值給<id,1>。

語義分析(semantic analysis)

image

通過semantic analyzer(語義分析器)檢查符號表跟語法樹是否跟定義的一樣,很重要的部分是type checking(類型檢查),只要宣告整數型態如果給予浮點數就會抱錯,但是如果是宣告浮點數轉成整數就會通過coercion(強迫轉型)轉成浮點數,以便後面的中間代碼生成。

中間代碼生成

image

經過上面三個步驟(調教)後,就會產生一個中間代碼,可以更輕易的轉成目標代碼。

 代碼優化 

字面上的意思,把中間代碼更精簡。

image

代碼生成

把中間代碼映射為目標程序,途中必須分配內存的位置,然後被翻譯成目標語言,下面以機器語言為例。

image

符號表管理

存放變數的值、名稱、類型、作用域...等等,方便編譯器使用。

將多個步驟組合成趟

image

就是把前面的步驟組合起來叫做pass(趟),可選趟(不一定要有的步驟=優化),後端趟(生成特殊語言),可以隨便組合出不同目標程序。

 

終於寫完了(ಥ﹏ಥ),寫超久的,我盡量用自己的話去表達,由上到下表示編譯器編譯的過程,那有些圖片是我自己畫的有些則是書上的,以後只會越來越痛苦(つ﹏⊂),反正我能寫多少就寫多少。

arrow
arrow
    創作者介紹
    創作者 讀書小天地 的頭像
    讀書小天地

    書籍分享天地

    讀書小天地 發表在 痞客邦 留言(0) 人氣()