內容介紹
《編譯器設計(第 2版)》是編譯器設計領域的經典著作,主要從以下四部分詳解瞭編譯器的設計過程。第 一部分涵蓋編譯器前端設計和建立前端所用工具的設計和構建;第 二部分探討從源代碼到編譯器中間形式的映射,考察前端為優化器和後端所生成代碼的種類;第三部分介紹代碼優化,同時包含對分析和轉換的進一步處理;第四部分專門講解編譯器後端使用的算法。 《編譯器設計(第 2版)》適閤作為高等院校計算機專業本科生和研究生編譯課程的教材和參考書,也可供相關技術人員參考。
作者介紹
Keith D. Cooper是萊斯大學的計算工程Doerr講席教授。他研究過編譯後代碼優化領域的大量問題,包括過程間數據流分析及其應用、值編號、代數重新關聯、寄存器分配和指令調度等。他近期的工作專注於從根本上重新考察傳統編譯器的結構和行為。他講授過各種本科生水平的課程,從程序設計入門到研究生水平的代碼優化等。他還是ACM院士。 Linda Torczon是萊斯大學計算機科學係的*級研究科學傢,她是PACE(平颱可感知編譯環境)項目的&席研究員,該項目由DARPA(國防*級研究計劃局)贊助,意在開發一種優化編譯器環境,能夠針對新平颱自動地調整其優化機製和策略。從1990年到2000年,Torczon擔任並行計算研究中心的執行總監,該中心是美國國傢科學基金會下屬的一個科技中心。她還擔任過HiPerSoft、洛斯阿拉莫斯計算機科學研究所和虛擬網格應用開發軟件項目的執行總監。
目錄
目 錄
第 1章 編譯概觀 1
1.1 簡介 1
1.2 編譯器結構 4
1.3 轉換概述 7
1.3.1 前端 8
1.3.2 優化器 10
1.3.3 後端 11
1.4 小結和展望 15
第 2章 詞法分析器 17
2.1 簡介 17
2.2 識彆單詞 18
2.2.1 識彆器的形式化 20
2.2.2 識彆更復雜的單詞 21
2.3 正則錶達式 24
2.3.1 符號錶示法的形式化 25
2.3.2 示例 26
2.3.3 RE的閉包性質 28
2.4 從正則錶達式到詞法分析器 30
2.4.1 非確定性有限自動機 30
2.4.2 從正則錶達式到NFA:Thompson構造法 33
2.4.3 從NFA到DFA:子集構造法 34
2.4.4 從DFA到**小DFA:Hopcroft算法 39
2.4.5 將DFA用做識彆器 42
2.5 實現詞法分析器 43
2.5.1 錶驅動詞法分析器 44
2.5.2 直接編碼的詞法分析器 48
2.5.3 手工編碼的詞法分析器 50
2.5.4 處理關鍵字 53
2.6 *級主題 54
2.6.1 從DFA到正則錶達式 54
2.6.2 DFA**小化的另一種方法:Brzozowski算法 55
2.6.3 無閉包的正則錶達式 56
2.7 小結和展望 57
第3章 語法分析器 61
3.1 簡介 61
3.2 語法的錶示 62
3.2.1 為什麼不使用正則錶達式 62
3.2.2 上下文無關語法 63
3.2.3 更復雜的例子 66
3.2.4 將語義編碼到結構中 69
3.2.5 為輸入符號串找到推導 71
3.3 自頂嚮下語法分析 71
3.3.1 為進行自頂嚮下語法分析而轉換語法 73
3.3.2 自頂嚮下的遞歸下降語法分析器 81
3.3.3 錶驅動的LL(1)語法分析器 83
3.4 自底嚮上語法分析 87
3.4.1 LR(1)語法分析算法 89
3.4.2 構建LR(1)錶 94
3.4.3 錶構造過程中的錯誤 103
3.5 實際問題 106
3.5.1 齣錯恢復 106
3.5.2 一元運算符 107
3.5.3 處理上下文相關的二義性 108
3.5.4 左遞歸與右遞歸 109
3.6 *級主題 111
3.6.1 優化語法 111
3.6.2 減小LR(1)錶的規模 113
3.7 小結和展望 116
第4章 上下文相關分析 120
4.1 簡介 120
4.2 類型係統簡介 122
4.2.1 類型係統的目標 123
4.2.2 類型係統的組件 126
4.3 屬性語法框架 134
4.3.1 求值的方法 137
4.3.2 環 138
4.3.3 擴展實例 138
4.3.4 屬性語法方法的問題 143
4.4 特設語法製導轉換 146
4.4.1 特設語法製導轉換的實現 147
4.4.2 例子 148
4.5 *級主題 155
4.5.1 類型推斷中更睏難的問題 155
4.5.2 改變結閤性 157
4.6 小結和展望 158
第5章 中間錶示 162
5.1 簡介 162
5.2 圖IR 165
5.2.1 與語法相關的樹 165
5.2.2 圖 168
5.3 綫性IR 173
5.3.1 堆棧機代碼 173
5.3.2 三地址代碼 174
5.3.3 綫性代碼的錶示 175
5.3.4 根據綫性代碼建立控製流圖 176
5.4 將值映射到名字 179
5.4.1 臨時值的命名 179
5.4.2 靜態單賦值形式 180
5.4.3 內存模型 183
5.5 符號錶 186
5.5.1 散列錶 187
5.5.2 建立符號錶 187
5.5.3 處理嵌套的作用域 188
5.5.4 符號錶的許多用途 191
5.5.5 符號錶技術的其他用途 193
5.6 小結和展望 193
第6章 過程抽象 198
6.1 簡介 198
6.2 過程調用 200
6.3 命名空間 203
6.3.1 類Algol語言的命名空間 203
6.3.2 用於支持類Algol語言的運行時結構 206
6.3.3 麵嚮對象語言的命名空間 210
6.3.4 支持麵嚮對象語言的運行時結構 214
6.4 過程之間值的傳遞 219
6.4.1 傳遞參數 219
6.4.2 返迴值 222
6.4.3 確定可尋址性 223
6.5 標準化鏈接 227
6.6 *級主題 231
6.6.1 堆的顯式管理 231
6.6.2 隱式釋放 234
6.7 小結和展望 237
第7章 代碼形式 245
7.1 簡介 245
7.2 分配存儲位置 247
7.2.1 設定運行時數據結構的位置 248
7.2.2 數據區的布局 249
7.2.3 將值保持在寄存器中 252
7.3 算術運算符 253
7.3.1 減少對寄存器的需求 254
7.3.2 訪問參數值 255
7.3.3 錶達式中的函數調用 257
7.3.4 其他算術運算符 257
7.3.5 混閤類型錶達式 258
7.3.6 作為運算符的賦值操作 258
7.4 布爾運算符和關係運算符 259
7.4.1 錶示 260
7.4.2 對關係操作的硬件支持 262
7.5 數組的存儲和訪問 265
7.5.1 引用嚮量元素 266
7.5.2 數組存儲布局 267
7.5.3 引用數組元素 268
7.5.4 範圍檢查 272
7.6 字符串 273
7.6.1 字符串錶示 273
7.6.2 字符串賦值 274
7.6.3 字符串連接 275
7.6.4 字符串長度 276
7.7 結構引用 277
7.7.1 理解結構布局 277
7.7.2 結構數組 278
7.7.3 聯閤和運行時標記 278
7.7.4 指針和匿名值 279
7.8 控製流結構 281
7.8.1 條件執行 281
7.8.2 循環和迭代 283
7.8.3 case語句 286
7.9 過程調用 289
7.9.1 實參求值 290
7.9.2 保存和恢復寄存器 291
7.10 小結和展望 292
第8章 優化簡介 298
8.1 簡介 298
8.2 背景 299
8.2.1 例子 300
8.2.2 對優化的考慮 303
8.2.3 優化的時機 305
8.3 優化的範圍 306
8.4 局部優化 308
8.4.1 局部值編號 309
8.4.2 樹高平衡 314
8.5 區域優化 321
8.5.1 超局部值編號 321
8.5.2 循環展開 324
8.6 全局優化 327
8.6.1 利用活動信息查找未初始化變量 328
8.6.2 全局代碼置放 331
8.7 過程間優化 336
8.7.1 內聯替換 337
8.7.2 過程置放 340
8.7.3 針對過程間優化的編譯器組織結構 344
8.8 小結和展望 345
第9章 數據流分析 350
9.1 簡介 350
9.2 迭代數據流分析 351
9.2.1 支配性 352
9.2.2 活動變量分析 355
9.2.3 數據流分析的局限性 359
9.2.4 其他數據流問題 361
9.3 靜態單賦值形式 365
9.3.1 構造靜態單賦值形式的簡單方法 366
9.3.2 支配邊界 366
9.3.3 放置 函數 369
9.3.4 重命名 372
9.3.5 從靜態單賦值形式到其他形式的轉換 376
9.3.6 使用靜態單賦值形式 379
9.4 過程間分析 383
9.4.1 構建調用圖 383
9.4.2 過程間常量傳播 385
9.5 *級主題 388
9.5.1 結構性數據流算法和可歸約性 388
9.5.2 加速計算支配性的迭代框架算法的執行 391
9.6 小結和展望 393
第 10章 標量優化 398
10.1 簡介 398
10.2 消除無用和不可達代碼 401
10.2.1 消除無用代碼 402
10.2.2 消除無用控製流 404
10.2.3 消除不可達代碼 406
10.3 代碼移動 407
10.3.1 緩式代碼移動 407
10.3.2 代碼提升 413
10.4 特化 414
10.4.1 尾調用優化 415
10.4.2 葉調用優化 416
10.4.3 參數提升 416
10.5 冗餘消除 417
10.5.1 值相同與名字相同 417
10.5.2 基於支配者的值編號算法 418
10.6 為其他變換製造時機 421
10.6.1 超級塊復製 421
10.6.2 過程復製 422
10.6.3 循環外提 423
10.6.4 重命名 423
10.7 *級主題 425
10.7.1 閤並優化 425
10.7.2 強度削減 429
10.7.3 選擇一種優化序列 437
10.8 小結和展望 438
第 11章 指令選擇 441
11.1 簡介 441
11.2 代碼生成 443
11.3 擴展簡單的樹遍曆方案 445
11.4 通過樹模式匹配進行指令選擇 450
11.4.1 重寫規則 451
11.4.2 找到平鋪方案 454
11.4.3 工具 457
11.5 通過窺孔優化進行指令選擇 458
11.5.1 窺孔優化 458
11.5.2 窺孔變換程序 463
11.6 *級主題 465
11.6.1 學習窺孔模式 465
11.6.2 生成指令序列 466
11.7 小結和展望 467
第 12章 指令調度 470
12.1 簡介 470
12.2 指令調度問題 473
12.2.1 度量調度質量的其他方式 477
12.2.2 是什麼使調度這樣難 478
12.3 局部錶調度 478
12.3.1 算法 478
12.3.2 調度具有可變延遲的操作 481
12.3.3 擴展算法 481
12.3.4 在錶調度算法中打破平局 481
12.3.5 前嚮錶調度與後嚮錶調度 482
12.3.6 提高錶調度的效率 484
12.4 區域性調度 485
12.4.1 調度擴展基本程序塊 486
12.4.2 跟蹤調度 487
12.4.3 通過復製構建適當的上下文環境 488
12.5 *級主題 489
12.5.1 軟件流水綫的策略 490
12.5.2 用於實現軟件流水綫的算法 492
12.6 小結和展望 495
第 13章 寄存器分配 499
13.1 簡介 499
13.2 背景問題 500
13.2.1 內存與寄存器 500
13.2.2 分配與指派 501
13.2.3 寄存器類彆 502
13.3 局部寄存器分配和指派 502
13.3.1 自頂嚮下的局部寄存器分配 503
13.3.2 自底嚮上的局部寄存器分配 504
13.3.3 超越單個程序塊 506
13.4 全局寄存器分配和指派 509
13.4.1 找到全局活動範圍 511
13.4.2 估算全局逐齣代價 512
13.4.3 衝突和衝突圖 513
13.4.4 自頂嚮下著色 515
13.4.5 自底嚮上著色 517
13.4.6 閤並副本以減小度數 518
13.4.7 比較自頂嚮下和自底嚮上全局分配器 520
13.4.8 將機器的約束條件編碼到衝突圖中 521
13.5 *級主題 523
13.5.1 圖著色寄存器分配方法的變體 523
13.5.2 靜態單賦值形式上的全局寄存器分配 525
13.6 小結和展望 526
附錄A ILOC 531
附錄B 數據結構 540
參考文獻 559
索引 574
預售 圖靈教育 編譯器設計 第2版 深入剖析現代編譯器運用的算法和技術 強調代碼優化和代碼生成 下載 mobi epub pdf txt 電子書 格式
預售 圖靈教育 編譯器設計 第2版 深入剖析現代編譯器運用的算法和技術 強調代碼優化和代碼生成 下載 mobi pdf epub txt 電子書 格式 2024
預售 圖靈教育 編譯器設計 第2版 深入剖析現代編譯器運用的算法和技術 強調代碼優化和代碼生成 mobi epub pdf txt 電子書 格式下載 2024