前言
第1章 概述 1
1.1 編譯技術概述 1
1.1.1 程序設計語言基礎 1
1.1.2 程序設計語言的翻譯機製 4
1.1.3 編譯器的基本結構 5
1.2 Pascal語言基礎 8
1.2.1 Pascal語言簡介 8
1.2.2 Pascal程序基本組成 9
1.2.3 Pascal的聲明部分 10
1.2.4 Pascal的類型 12
1.2.5 Pascal的運算符 15
1.2.6 Pascal的語句 17
1.3 開發環境與Delphi基礎 18
1.3.1 開發環境與文件列錶 18
1.3.2 Delphi基礎 19
1.4 深入學習 24
1.5 實踐與思考 25
1.6 大師風采——Niklaus Wirth 25
第2章 詞法分析 26
2.1 詞法分析概述 26
2.1.1 詞法分析的任務 26
2.1.2 單詞的分類 28
2.2 詞法分析器的設計 28
2.2.1 識彆單詞 28
2.2.2 轉換圖 29
2.2.3 構造詞法分析器 31
2.3 詞法分析器的實現 35
2.3.1 詞法定義 35
2.3.2 構造轉換圖與轉換錶 36
2.3.3 相關數據結構 38
2.3.4 源代碼實現 40
2.4 深入學習 44
2.5 實踐與思考 45
2.6 大師風采——Dennis M. Ritchie 45
第3章 語法分析 47
3.1 程序設計語言的語法描述 47
3.1.1 上下文無關文法 47
3.1.2 推導 52
3.1.3 語法樹 54
3.1.4 歸約簡介 57
3.2 語法分析概述 58
3.2.1 語法分析的任務 58
3.2.2 自上而下的語法分析法 59
3.2.3 構造語法分析器 64
3.3 語法分析器的實現 71
3.3.1 文法定義 71
3.3.2 語法分析錶 76
3.3.3 源代碼實現 86
3.4 深入學習 90
3.5 實踐與思考 91
3.6 大師風采——Edsger Wybe
Dijkstra 92
第4章 符號錶係統 93
4.1 語義分析概述 93
4.1.1 程序設計語言的語義 93
4.1.2 語義分析與IR生成的任務 94
4.1.3 語法製導翻譯 95
4.2 符號錶設計 98
4.2.1 符號錶概述 98
4.2.2 符號錶的邏輯結構 99
4.2.3 符號錶的實例分析 109
4.3 聲明部分的實現 111
4.3.1 相關數據結構 111
4.3.2 主程序首部聲明 113
4.3.3 包含文件聲明部分 114
4.3.4 標號聲明部分 118
4.3.5 常量聲明部分 119
4.3.6 類型聲明部分 120
4.3.7 變量聲明部分 149
4.3.8 過程、函數聲明部分 152
4.4 深入學習 154
4.5 實踐與思考 155
4.6 大師風采——John Backus 155
第5章 中間錶示 156
5.1 IR概述 156
5.1.1 IR的作用 156
5.1.2 IR設計及其級彆 157
5.1.3 設計IR的重要意義 159
5.2 IR生成 160
5.2.1 三地址代碼概述 160
5.2.2 Neo Pascal三地址代碼的
實現 164
5.2.3 翻譯機製概述 168
5.3 語句翻譯概述 170
5.3.1 語句翻譯基礎 170
5.3.2 翻譯輔助函數及其實現 173
5.4 if 語句 176
5.4.1 if 語句的翻譯 176
5.4.2 源代碼實現 177
5.5 while/repeat語句 181
5.5.1 while 語句的翻譯 181
5.5.2 源代碼實現 181
5.5.3 repeat語句的翻譯 184
5.6 for語句 184
5.6.1 for語句的翻譯 184
5.6.2 源代碼實現 186
5.7 case語句 192
5.7.1 case語句的翻譯 192
5.7.2 源代碼實現 193
5.8 其他語句 199
5.8.1 break、continue語句的翻譯 199
5.8.2 goto 語句的翻譯 201
5.8.3 asm 語句的翻譯 204
5.9 深入學習 208
5.10 實踐與思考 208
5.11 大師風采——Kenneth E.
Iverson 209
第6章 錶達式語義 210
6.1 錶達式概述 210
6.2 類型係統基礎 211
6.2.1 類型基礎 211
6.2.2 類型係統 212
6.2.3 類型轉換 217
6.3 類型係統的實現 218
6.3.1 類型係統的設計 218
6.3.2 IR的操作數 221
6.3.3 類型相容的實現 222
6.3.4 類型推斷的實現 223
6.4 錶達式翻譯 226
6.4.1 錶達式翻譯基礎 226
6.4.2 深入錶達式翻譯 229
6.4.3 錶達式翻譯的實現 230
6.5 操作數翻譯 247
6.5.1 操作數的地址與形態 247
6.5.2 操作數翻譯基礎 248
6.5.3 簡單變量操作數的翻譯 252
6.5.4 記錄字段操作數的翻譯 262
6.5.5 數組翻譯基礎 265
6.5.6 數組元素操作數的翻譯 270
6.5.7 指針運算的翻譯 280
6.6 深入學習 286
6.7 實踐與思考 286
6.8 大師風采——Alan Kay 287
第7章 優化技術 288
7.1 優化概述 288
7.1.1 什麼是優化 288
7.1.2 優化級彆 289
7.2 控製流分析 290
7.2.1 流圖與基本塊 290
7.2.2 流圖的數據結構 292
7.2.3 流圖的構造 293
7.2.4 優化的分類 297
7.3 數據流分析 298
7.3.1 數據流的相關概念 298
7.3.2 數據流分析的策略 298
7.3.3 活躍變量分析 299
7.3.4 ud鏈與du鏈 301
7.3.5 更多數據流問題 302
7.4 數據流分析的實現 303
7.4.1 定值點與引用點分析的基礎 303
7.4.2 定值點、引用點分析的相關
數據結構 305
7.4.3 定值點、引用點分析的實現 307
7.4.4 活躍變量分析的實現 312
7.4.5 ud鏈、du鏈分析的實現 314
7.5 常量傳播與常量摺疊 321
7.5.1 常量傳播基礎 321
7.5.2 常量傳播的實現 324
7.6 復寫傳播 328
7.6.1 復寫傳播的基礎 328
7.6.2 復寫傳播的實現 330
7.7 代數簡化 333
7.7.1 代數簡化基礎 333
7.7.2 代數簡化的實現 334
7.8 跳轉優化 339
7.8.1 跳轉優化基礎 339
7.8.2 條件跳轉優化的實現 341
7.8.3 連續跳轉優化的實現 343
7.9 冗餘代碼刪除 345
7.9.1 冗餘代碼刪除基礎 345
7.9.2 死代碼刪除的實現 346
7.9.3 不可到達代碼刪除的實現 348
7.10 深入學習 350
7.11 實踐與思考 350
7.12 大師風采—Richard
Stallman 351
第8章 運行時刻的存儲管理 352
8.1 存儲管理概述 352
8.1.1 存儲區域 352
8.1.2 存儲布局 354
8.1.3 存儲分配基礎 356
8.2 棧式存儲分配 357
8.2.1 棧式存儲分配基礎 357
8.2.2 i386棧式存儲分配 360
8.2.3 深入理解棧式存儲分配 365
8.3 存儲分配的實現 368
8.4 存儲優化 372
8.4.1 存儲優化基礎 372
8.4.2 存儲優化的實現 374
8.5 深入學習 381
8.6 實踐與思考 382
8.7 大師風采—Bjarne
Stroustrup 382
第9章 目標代碼生成 383
9.1 目標代碼生成概述 383
9.1.1 目標代碼生成基礎 383
9.1.2 指令選擇 384
9.1.3 寄存器分配 385
9.2 目標機簡介 386
9.2.1 目標機結構 386
9.2.2 浮點處理單元 387
9.2.3 操作數尋址方式 391
9.2.4 ptr操作符 392
9.2.5 一個完整的匯編程序 393
9.3 構造代碼生成器 393
9.3.1 自動代碼生成器基礎 393
9.3.2 指令模闆 394
9.3.3 寄存器描述 397
9.3.4 寄存器分配 398
9.3.5 代碼生成器的基本結構 402
9.4 深入學習 413
9.5 實踐與思考 413
9.6 大師風采——Peter Naur 413
第10章 GCC內核與現代編譯
技術概述 414
10.1 編譯技術的現狀及發展 414
10.2 GCC內核分析 415
10.2.1 GCC的基本結構 415
10.2.2 GENERIC 416
10.2.3 GIMPLE 416
10.2.4 SSA 426
10.2.5 RTL概述 428
10.2.6 RTX 430
10.3 動態編譯技術簡介 436
10.3.1 動態編譯技術基礎 436
10.3.2 運行時特定化 437
10.3.3 動態二進製翻譯 439
10.4 並行編譯技術簡介 441
10.4.1 並行編譯技術基礎 441
10.4.2 並行計算機及其編譯係統 443
10.5 深入學習 446
10.6 大師風采——Alan Perlis 447
參考文獻 448
· · · · · · (
收起)