文章目錄
-
-
- 概覽
- 詞法分析(Lexical analysis)/ 掃描(Scanning)
- 文法分析(Syntax analysis)/ 解析(Parsing)
- 語義分析(Semantic analysis)
- 中間代碼(intermediate code)生成
- 代碼優化(Code optimization)
- 代碼生成
- 符号表(symbol table)管理
- 出錯處理(Error handling)
- 一些概念
-
概覽
編譯:
将源語言翻譯成目智語言的過程
分析源語言包括:
詞法分析->文法分析->語義分析
編譯器的結構:
![]() | |
詞法分析(Lexical analysis)/ 掃描(Scanning)
從左到右掃描源程式字元(讀入組成源程式的字元流),識别出各個單詞(組成有意義的單詞),确定單詞類型,将識别出的單詞轉化為統一的機内表示——詞法單元(token)
t o k e n token token: <token-name,attribute-value>
單詞類型 | 種别 |
---|---|
關鍵字 | program、if、else、then…… |
辨別符(identifier) | 變量名、數組名、記錄名、過程名…… |
常量 | 整型、浮點型、字元型、布爾型…… |
運算符 | 算術(+ - * / ++ –)、關系(> < == != >= <=)、邏輯(& | ~) |
界限符 | ;、()、=、{}…… |
例子:
| |
文法分析(Syntax analysis)/ 解析(Parsing)
從詞法分析器輸出的 t o k e n token token 序列,依據源程式的文法規則組成文法短語,表示成文法樹(syntax tree)
例子:
| |
語義分析(Semantic analysis)
使用文法樹和符号表中的資訊來檢查源程式是否和語言定義的語義一緻。
-
類型檢查(type checking)
例如數組下标如果為浮點數,編譯器必須報告錯誤。
-
自動類型轉換(coercion)
例如運算符應用于一個整數和一個浮點數,編譯器會把整數轉換成浮點數。
中間代碼(intermediate code)生成
在把一個源程式翻譯成目标代碼的過程中,一個編譯器可能構造出一個或多個中間表示。
主要包括:
- 文法樹(syntax tree)
- 三位址碼(three-address code)
- 由類似于彙編語言的指令序列組成,每個指令最多三個操作數
這邊簡單了解一下,後面還會學習。。
| |
| |
表示:
- t1 = inttofloat(60)
- t2 = id3 * t1
- t3 = id2 + t2
- id1 = t3
代碼優化(Code optimization)
機器無關的代碼優化步驟試圖改進中間代碼,以便生成更好的目标代碼。
| |
代碼生成
以源程式的中間表示形式作為輸入,并把它映射到目智語言。
符号表(symbol table)管理
符号表資料結構為每個變量名字建立了一個記錄條目。記錄的字段就是名字的各個屬性。
可以允許編譯器迅速查找每個名字的記錄,并向記錄中快速存放和擷取記錄中的資料。
出錯處理(Error handling)
- 檢查錯誤
- 報告出錯資訊
- 排錯
- 恢複編譯工作
一些概念
- 遍(pass):對源程式(包括源程式中間形式)從頭到尾掃描一次,并做有關加工處理,生成新的源程式中間形式或目标程式,稱為一遍。
- 前端:與源程式有關的編譯部分。
- 後端:與目标機有關的部分。
- 交叉編譯:由于目标機指令系統和主控端的指令系統不同,編譯時将應用程式的源程式在主控端上生成目标機代碼,稱為交叉編譯。