###### tags: `compiler` `note` `thu` # 簡介 ## 1. 廣義的解釋 編譯器就是一個可以將我們寫的程式轉換成電腦可以執行的程式的黑盒子。 ![](https://i.imgur.com/eaWR2g5.jpg) ### a. Programming Language (source programs): - 通常為高階(非組合語言等)語言。 ### b. Machine Language (target programs) - 通常為組合語言/機械碼等低階語言。 ## 2. 各種名詞 - 如果再進行細分的話,還可以分為下面幾個階段: ![](https://i.imgur.com/Tvc4JmM.jpg) ### a. Preprocessor - 處理程式裡包含的macro, 並合並各個被引用的檔案(e.g. `import`, `include`等)。 ### b. Compiler - 將處理過後的程式碼轉換為機械碼/組合語言(要看目標的平台要求)。 - 根據轉換的結果會決定是否需要Assembler。 ### c. Assembler (Optional) - 如果Compiler產出的是組合語言,那麼就會交由Assembler將其轉換為機械碼。 ### d. Linker - 將程式中用到的Library的Object code (已編譯過的)連結至編譯好的程式。 ### e. Loader (執行階段) - 將程式中需要用到的外部資源都載入記憶體(包含外部的Library, 環境變數等) ## 3. 編譯器的詳細架構 ![](https://i.imgur.com/RUycYAO.jpg) ### Frontend: #### a. Scanner - 將程式掃描一次,找出最小的有意義的單元: token,並將其輸出給Parser。 - token可以是關鍵字、運算元等字詞。 #### b. Parser - 取得token後,用其建立起AST(Abstract Syntax Tree) #### c. Type Checker - 建好AST後,檢查並標記出token的屬性。 ### Backend: #### d. Translator - 將AST翻譯成IR(Intermediate Representation, 中間表示型式) - IR通常為three-address code的型式: (轉換前/轉換後) ```c int main() { int x = 2; int y = 3; int z = x + y; return z; } ``` ``` 1: x = 2 2: y = 3 3: t1 = x + y 4: z = t1 5: return z ``` #### e. Optimizer - 對程式進行最佳化(e.g. 調換順序,去除用不到的code etc) #### f. Code Generator - 將程式直接翻譯成Assembly / Machine Code。