齣版者的話
專傢指導委員會
譯者序
序
前言
第1章 高級主題介紹 1
1.1 編譯器結構迴顧 1
1.2 基本問題中的高級論題 2
1.3 代碼優化的重要性 4
1.4 優化編譯器的結構 5
1.5 激進型優化編譯器中各種優化的位置 7
1.6 本書各章的閱讀流程 10
1.7 本書沒有涉及的相關主題 10
1.8 例子中所用的目標機 11
1.9 數的錶示與數據的大小 11
1.10 小結 11
1.11 進一步閱讀 12
1.12 練習 12
第2章 非形式化編譯算法錶示 13
2.1 擴展的巴科斯-諾爾範式語法錶示 13
2.2 ican簡介 14
2.3 ican概貌 16
2.4 完整的程序 17
2.5 類型定義 18
2.6 聲明 18
2.7 數據類型和錶達式 19
2.7.1 一般簡單類型 20
2.7.2 枚舉類型 20
2.7.3 數組 21
2.7.4 集閤 21
2.7.5 序列 22
2.7.6 元組 23
2.7.7 記錄 23
2.7.8 聯閤 24
2.7.9 函數 24
2.7.10 編譯專用的類型 24
2.7.11 值nil 25
2.7.12 size運算符 25
2.8 語句 25
2.8.1 賦值語句 26
2.8.2 過程調用語句 27
2.8.3 返迴語句 27
2.8.4 goto語句 27
2.8.5 if語句 27
2.8.6 case語句 27
2.8.7 while語句 28
2.8.8 for語句 28
2.8.9 repeat語句 28
2.8.10 ican的關鍵字 28
2.9 小結 29
2.10 進一步閱讀 29
2.11 練習 29
第3章 符號錶結構 31
3.1 存儲類、可見性和生命期 31
3.2 符號屬性和符號錶項 32
3.3 局部符號錶管理 34
3.4 全局符號錶結構 35
3.5 存儲綁定和符號寄存器 38
3.6 生成取數和存數指令的方法 42
3.7 小結 46
3.8 進一步閱讀 46
3.9 練習 47
第4章 中間錶示 49
4.1 與中間語言設計有關的問題 49
4.2 高級中間語言 50
4.3 中級中間語言 51
4.4 低級中間語言 52
4.5 多級中間語言 52
4.6 我們的中間語言:mir、hir和lir 53
4.6.1 中級中間錶示(mir) 53
4.6.2 高級中間錶示(hir) 56
4.6.3 低級中間錶示(lir) 57
4.7 用ican錶示mir、hir和lir 58
4.7.1 用ican錶示mir 59
4.7.2 用ican錶示hir 62
4.7.3 用ican錶示lir 64
4.8 管理中間代碼的若乾數據結構和例程的ican命名 67
4.9 其他中間語言形式 70
4.9.1 三元式 70
4.9.2 樹 71
4.9.3 無環有嚮圖(dag) 72
4.9.4 前綴波蘭錶示 73
4.10 小結 74
4.11 進一步閱讀 74
4.12 練習 74
第5章 運行時支持 77
5.1 數據錶示和指令 77
5.2 寄存器用法 80
5.3 局部棧幀 81
5.4 運行時棧 83
5.5 參數傳遞規則 84
5.6 過程的入口處理、齣口處理、調用和返迴 86
5.6.1 用寄存器傳遞參數:平麵寄存器文件 87
5.6.2 用運行時棧傳遞參數 88
5.6.3 用具有寄存器窗口的寄存器傳遞參數 89
5.6.4 過程值變量 91
5.7 代碼共享與位置無關代碼 91
5.8 符號和多態語言支持 94
5.9 小結 96
5.10 進一步閱讀 96
5.11 練習 97
第6章 自動産生代碼生成器 99
6.1 簡介代碼生成器的自動生成 100
6.2 語法製導技術 100
6.2.1 代碼生成器 102
6.2.2 代碼生成器的産生器 103
6.2.3 刪除鏈循環 110
6.2.4 刪除句法阻滯 112
6.2.5 最後的考慮 115
6.3 語義製導的分析介紹 115
6.4 樹模式匹配和動態規劃 116
6.5 小結 120
6.6 進一步閱讀 120
6.7 練習 121
第7章 控製流分析 123
7.1 控製流分析的方法 125
7.2 深度為主查找、前序遍曆、後序遍曆和寬度為主查找 128
7.3 必經結點和後必經結點 132
7.4 循環和強連通分量 139
7.5 可歸約性 143
7.6 區間分析和控製樹 144
7.7 結構分析 147
7.8 小結 156
7.9 進一步閱讀 157
7.10 練習 157
第8章 數據流分析 159
8.1 一個例子:到達-定值 159
8.2 基本概念:格、流函數和不動點 163
8.3 數據流問題及其解決方法的分類 166
8.4 迭代數據流分析 168
8.5 流函數的格 171
8.6 基於控製樹的數據流分析 172
8.7 結構分析 172
8.7.1 結構分析:嚮前問題 172
8.7.2 結構分析:嚮後問題 178
8.7.3 結構分析方程的錶示 180
8.8 區間分析 181
8.9 其他方法 182
8.10 du鏈、ud鏈和網 183
8.11 靜態單賦值形式 184
8.12 數組、結構和指針的處理 188
8.13 數據流分析器的自動構造 188
8.14 更貪婪的分析 189
8.15 小結 191
8.16 進一步閱讀 192
8.17 練習 192
第9章 依賴關係分析和依賴圖 195
9.1 依賴關係 195
9.2 基本塊依賴dag 196
9.3 循環中的依賴關係 200
9.4 依賴關係測試 204
9.5 程序依賴圖 207
9.6 動態分配的對象之間的依賴關係 209
9.7 小結 210
9.8 進一步閱讀 211
9.9 練習 211
第10章 彆名分析 213
10.1 各種現實程序設計語言中的彆名 215
10.1.1 fortran 77中的彆名 216
10.1.2 pascal中的彆名 216
10.1.3 c中的彆名 217
10.1.4 fortran 90中的彆名 218
10.2 彆名收集器 218
10.3 彆名傳播器 222
10.4 小結 227
10.5 進一步閱讀 227
10.6 練習 228
第11章 優化簡介 229
11.1 第12~18章討論的全局優化 230
11.2 流敏感性和可能與一定信息 231
11.3 各種優化的重要性 231
11.4 優化的順序與重復 232
11.5 進一步閱讀 235
11.6 練習 235
第12章 前期優化 237
12.1 常數錶達式計算(常數摺疊) 237
12.2 聚閤量標量替代 238
12.3 代數化簡和重結閤 240
12.3.1 地址錶達式的代數化簡和重結閤 241
12.3.2 對浮點錶達式應用代數化簡 246
12.4 值編號 247
12.4.1 作用於基本塊的值編號 247
12.4.2 全局值編號 251
12.5 復寫傳播 256
12.6 稀有條件常數傳播 261
12.7 小結 267
12.8 進一步閱讀 269
12.9 練習 269
第13章 冗餘刪除 271
13.1 公共子錶達式刪除 271
13.1.1 局部公共子錶達式刪除 272
13.1.2 全局公共子錶達式刪除 276
13.1.3 嚮前替代 284
13.2 循環不變代碼外提 284
13.3 部分冗餘刪除 292
13.4 冗餘刪除和重結閤 298
13.5 代碼提升 299
13.6 小結 302
13.7 進一步閱讀 302
13.8 練習 304
第14章 循環優化 305
14.1 歸納變量優化 305
14.1.1 識彆歸納變量 306
14.1.2 強度削弱 312
14.1.3 活躍變量分析 319
14.1.4 歸納變量刪除和綫性函數測試替換 320
14.2 不必要邊界檢查的消除 325
14.3 小結 327
14.4 進一步閱讀 329
14.5 練習 329
第15章 過程優化 331
15.1 尾調用優化和尾遞歸刪除 331
15.2 過程集成 334
15.3 內嵌擴展 337
15.4 葉例程優化和收縮包裝 338
15.4.1 葉例程優化 338
15.4.2 收縮包裝 339
15.5 小結 341
15.6 進一步閱讀 343
15.7 練習 343
第16章 寄存器分配 345
16.1 寄存器分配和指派 345
16.2 局部方法 346
16.3 圖著色 347
16.3.1 圖著色寄存器分配概述 347
16.3.2 頂層結構 349
16.3.3 網,可分配對象 350
16.3.4 衝突圖 354
16.3.5 衝突圖的錶示 355
16.3.6 寄存器閤並 358
16.3.7 計算溢齣代價 359
16.3.8 修剪衝突圖 361
16.3.9 指派寄存器 363
16.3.10 溢齣符號寄存器 365
16.3.11 圖著色寄存器分配的兩個例子 367
16.3.12 其他問題 375
16.4 基於優先級的圖著色 376
16.5 其他寄存器分配方法 377
16.6 小結 377
16.7 進一步閱讀 378
16.8 練習 380
第17章 代碼調度 381
17.1 指令調度 381
17.1.1 分支調度 382
17.1.2 錶調度 385
17.1.3 自動生成指令調度器 390
17.1.4 超標量實現有關的調度 390
17.1.5 基本塊調度中的其他問題 390
17.1.6 跨基本塊邊界的調度 392
17.2 前瞻取和上推 392
17.3 前瞻調度 393
17.4 軟流水 393
17.4.1 窗口調度 395
17.4.2 展開-壓實軟流水 397
17.4.3 循環展開 400
17.4.4 變量擴張 403
17.4.5 寄存器重命名 404
17.4.6 軟流水的其他方法 407
17.4.7 層次歸約 407
17.5 蹤跡調度 408
17.6 滲透調度 409
17.7 小結 411
17.8 進一步閱讀 413
17.9 練習 413
第18章 控製流和低級優化 415
18.1 不可到達代碼的刪除 415
18.2 伸直化 417
18.3 if化簡 419
18.4 循環化簡 420
18.5 循環倒置 421
18.6 無開關化 422
18.7 分支優化 422
18.8 尾融閤或交叉轉移 423
18.9 條件傳送 424
18.10 死代碼刪除 425
18.11 分支預測 429
18.12 機器方言和指令歸並 430
18.13 小結 433
18.14 進一步閱讀 433
18.15 練習 435
第19章 過程間分析與優化 437
19.1 過程間控製流分析:調用圖 438
19.2 過程間數據流分析 445
19.2.1 流不敏感副作用分析 445
19.2.2 流敏感副作用:程序概要圖 455
19.2.3 副作用計算中的其他問題 458
19.3 過程間常數傳播 458
19.4 過程間彆名分析 461
19.4.1 流不敏感彆名分析 462
19.4.2 傳值和傳指針語言的過程間彆名分析 471
19.5 過程間優化 473
19.6 過程間寄存器分配 475
19.6.1 連接時的寄存器分配 475
19.6.2 編譯時的過程間寄存器分配 477
19.7 全局引用的聚閤 477
19.8 過程間程序管理中的其他主題 478
19.9 小結 478
19.10 進一步閱讀 480
19.11 練習 480
第20章 存儲層次優化 483
20.1 數據和指令高速緩存的影響 484
20.2 指令高速緩存優化 485
20.2.1 利用硬件輔助:指令預取 485
20.2.2 過程排序 485
20.2.3 過程和基本塊的放置 489
20.2.4 過程內的代碼安置 489
20.2.5 過程分裂 492
20.2.6 過程內和過程間方法的結閤 492
20.3 數組元素的標量替換 493
20.4 數據高速緩存優化 496
20.4.1 過程間的數據安排 497
20.4.2 循環轉換 498
20.4.3 局部性與循環鋪砌 502
20.4.4 利用硬件輔助:數據預取 504
20.5 標量優化與麵嚮存儲器的優化 505
20.6 小結 506
20.7 進一步閱讀 508
20.8 練習 508
第21章 編譯器實例分析與未來的發展趨勢 509
21.1 sun用於sparc的編譯器 510
21.1.1 sparc體係結構 510
21.1.2 sun sparc編譯器 511
21.2 ibm power和powerpc體係結構的xl編譯器 517
21.2.1 power和powerpc體係結構 517
21.2.2 xl編譯器 518
21.3 dec用於alpha的編譯器 524
21.3.1 alpha體係結構 524
21.3.2 alpha的gem編譯器 525
21.4 intel 386體係結構上的intel參考編譯器 530
21.4.1 intel 386體係結構 530
21.4.2 intel編譯器 531
21.5 小結 538
21.6 編譯器設計和實現未來的趨勢 539
21.7 進一步閱讀 539
附錄a 本書使用的匯編語言指南 541
附錄b 集閤、序列、樹、dag和函數的錶示 549
附錄c 軟件資源 557
參考文獻 561
索引 579
· · · · · · (
收起)