四大階段概覽
- 預處理:展開巨集、包含檔案、條件編譯 →
.i
- 編譯:詞法/語法/語義分析、優化 → 匯編碼
.s
- 匯編:匯編碼 → 機器碼目標檔
.o
- 連結:合併多目標檔與函式庫 → 可執行檔
編譯器前端五步驟(以 array[index] = (index+4)*(2+6); 為例)
1. 詞法分析
掃描器(Scanner)將字元流切分為 Token:
| Token 類別 | 範例 |
| 關鍵字 | — |
| 識別符 | array, index |
| 字面量 | 4, 2, 6 |
| 特殊符號 | [ ] = ( ) + * ; |
工具:lex / flex。
2. 語法分析
語法分析器依上下文無關文法建構語法樹(Syntax Tree),節點為運算式。錯誤如括號不匹配、缺運算元即在此報出。工具:yacc / bison。
3. 語義分析
為樹節點標註型別、檢查型別相容、隱性轉換。僅處理靜態語義(編譯期可決),動態語義(如除零)屬執行期。
4. 中間代碼生成與優化
將語法樹線性化為中間碼(三地址碼、P-code),便於優化。例:(2+6) 常數摺疊為 8。
5. 目標代碼生成與優化
後端依目標架構(x86、ARM…)產生機器指令,進行指令選擇、暫存器分配、窺孔優化(如位移代替乘法)。
連結器的角色
解決跨模組符號引用(extern 變數/函式),確定最終位址,產出可執行檔(ELF/PE/Mach-O)。
參考資源
《程式設計師的自我修養——鏈接、裝載與庫》第 41-48 頁。
- 上一篇文章: C語言指標宣告完全指南:從基礎到函式指標陣列
- 下一篇文章: iOS 7 原生二維碼掃描:AVFoundation 完整實作教學
Copyright ©
程式碼之家 All Rights Reserved