編輯器從邏輯上能夠分爲若干個階段,每一個階段將源程序從一種表示變換成另外一種表示。前端
以Pascal語言的 position := initial + rate * 60 爲例子介紹編譯的各個階段後端
詞法分析 又叫線性分析 或者 線性掃描數據結構
逐個讀取源程序的字符,把他們組成詞法記號(token)流,而且把詞法單元填入符號表。編輯器
在這個階段會刪除掉分隔記號的空格優化
語法分析又叫 層次分析編碼
將詞法記號流按照語法結構進行層次分組,造成語法短語,語法短語經常使用分析樹表示spa
1.2.1 層次結構遵循的規則翻譯
e1 * e2code
(e1)token
也都是表達式
進行語義分析,生成語法樹
做用:
(1)進行語義檢查(其中包括類型檢查)、保證各部分能有意義的集合在一塊兒
(2)蒐集類型信息
通過語法分析和語義分析以後,某些編譯器生成源程序的顯式中間表示。
具有兩個性質: 易於產生、易於翻譯成目標程序
功能:
(1)需決定運算完成的次序。(疑問每一個語句之多一個算符)
(2)必須產生臨時變量名。(保留每一個語句的計算結果)
(3)必須處理控制流結構和過程調用
中間表示的經常使用形式: 三地址代碼。
1.4.1 三地址代碼
三地址代碼 由 三地址語句序列組成,最多三個操做數
試圖改進代碼,產生執行較快的機器代碼
生成可重定位的機器代碼或者彙編碼
功能:
(1)爲源程序所用的每一個變量選擇存儲單元 (寄存器分配)
(2) 將中間代碼生成等價的機器指令序列
符號表 :爲每個標識符保存一個記錄的數據結構,記錄的域是標識符的屬性(標識符的存儲分配、類型和做用域信息)
每一個階段都有可能發現源程序的錯誤,在發現錯誤以後,該階段必須處理此錯誤,使得編譯能夠繼續進行,以便進一步發現源程序的其餘錯誤。
詞法分析階段 :診斷當前被掃描的字符串不能造成語言的詞法記號。
語法分析階段:診斷記號流違反的語法規則。
語義分析階段:找到對所含操做無心義的結構。
在實際編譯器中,若干階段能夠組合在一塊兒,各階段之間的中間表示也無需顯示構成
一般將全部階段分爲前端和後端:
前端:只依賴於源程序,由幾乎獨立於目標機器的階段或者階段的一部分組成。
包括:詞法分析、語法分析、符號表創建、語義分析、中間代碼生成、部分代碼優化、與這些階段同時完成的錯誤處理。
後端:依賴於目標機器,通常獨立於源程序,而與中間代碼有關。
包括:代碼優化、代碼生成、伴隨這些階段的符號表操做和錯誤處理
編譯的幾個階段經常使用 一遍掃描來實現,一遍掃描包括讀一個輸入文件和寫一個輸出文件
把幾個階段組成一遍,而且這些階段的活動能夠在該遍中交錯進行。例如:能夠把語法分析當作主導,當它須要記號時,調用詞法分析器去下一個記號。若是已經看出一個語法結構,語法分析器則激活中間代碼生成器,以完成語義分析和生成中間代碼。
翻譯器:可以將 一種語言(源語言)變換成另外一種語言(目標語言)的軟件。
編譯器:編譯器是一種翻譯器,將高級語言變換成一種低級語言的軟件。特色在於 目標語言比源語言低級
解釋器:也須要對源程序進行詞法、語法和語義分析,中間代碼生成。可是不生成目標代碼,而是直接執行源程序所指定的運算