《編譯器設(shè)計(jì)(第2版)》是編譯器設(shè)計(jì)領(lǐng)域的經(jīng)典著作,主要從以下四部分詳解了編譯器的設(shè)計(jì)過程。及時(shí)部分涵蓋編譯器前端設(shè)計(jì)和建立前端所用工具的設(shè)計(jì)和構(gòu)建;第二部分探討從源代碼到編譯器中間形式的映射,考察前端為優(yōu)化器和后端所生成代碼的種類;第三部分介紹代碼優(yōu)化,同時(shí)包含對(duì)分析和轉(zhuǎn)換的進(jìn)一步處理;第四部分專門講解編譯器后端使用的算法。
《編譯器設(shè)計(jì)(第2版)》適合作為高等院校計(jì)算機(jī)專業(yè)本科生和研究生編譯課程的教材和參考書,也可供相關(guān)技術(shù)人員參考。
深入剖析現(xiàn)代編譯器運(yùn)用的算法和技術(shù)。強(qiáng)調(diào)代碼優(yōu)化和代碼生成。體現(xiàn)編譯原理教學(xué)的理念
Keith D. Cooper是萊斯大學(xué)的計(jì)算工程Doerr講席教授。他研究過編譯后代碼優(yōu)化領(lǐng)域的大量問題,包括過程間數(shù)據(jù)流分析及其應(yīng)用、值編號(hào)、代數(shù)重新關(guān)聯(lián)、寄存器分配和指令調(diào)度等。他近期的工作專注于從根本上重新考察傳統(tǒng)編譯器的結(jié)構(gòu)和行為。他講授過各種本科生水平的課程,從程序設(shè)計(jì)入門到研究生水平的代碼優(yōu)化等。他還是ACM院士。 Linda Torczon是萊斯大學(xué)計(jì)算機(jī)科學(xué)系的高級(jí)研究科學(xué)家,她是PACE(平臺(tái)可感知編譯環(huán)境)項(xiàng)目的首席研究員,該項(xiàng)目由DARPA(國防高級(jí)研究計(jì)劃局)贊助,意在開發(fā)一種優(yōu)化編譯器環(huán)境,能夠針對(duì)新平臺(tái)自動(dòng)地調(diào)整其優(yōu)化機(jī)制和策略。從1990年到2000年,Torczon擔(dān)任并行計(jì)算研究中心的執(zhí)行總監(jiān),該中心是美國國家科學(xué)基金會(huì)下屬的一個(gè)科技中心。她還擔(dān)任過HiPerSoft、洛斯阿拉莫斯計(jì)算機(jī)科學(xué)研究所和虛擬網(wǎng)格應(yīng)用開發(fā)軟件項(xiàng)目的執(zhí)行總監(jiān)。
第1章 編譯概觀
1.1 簡(jiǎn)介
1.2 編譯器結(jié)構(gòu)
1.3 轉(zhuǎn)換概述
1.3.1 前端
1.3.2 優(yōu)化器
1.3.3 后端
1.4 小結(jié)和展望
第2章 詞法分析器
2.1 簡(jiǎn)介
2.2 識(shí)別單詞
2.2.1 識(shí)別器的形式化
2.2.2 識(shí)別更復(fù)雜的單詞
2.3 正則表達(dá)式
2.3.1 符號(hào)表示法的形式化
2.3.2 示例
2.3.3 RE的閉包性質(zhì)
2.4 從正則表達(dá)式到詞法分析器
2.4.1 非確定性有限自動(dòng)機(jī)
2.4.2 從正則表達(dá)式到NFA:Thompson構(gòu)造法
2.4.3 從NFA到DFA:子集構(gòu)造法
2.4.4 從DFA到最小DFA:Hopcroft算法
2.4.5 將DFA用做識(shí)別器
2.5 實(shí)現(xiàn)詞法分析器
2.5.1 表驅(qū)動(dòng)詞法分析器
2.5.2 直接編碼的詞法分析器
2.5.3 手工編碼的詞法分析器
2.5.4 處理關(guān)鍵字
2.6 高級(jí)主題
2.6.1 從DFA到正則表達(dá)式
2.6.2 DFA最小化的另一種方法:Brzozowski算法
2.6.3 無閉包的正則表達(dá)式
2.7 小結(jié)和展望
第3章 語法分析器
3.1 簡(jiǎn)介
3.2 語法的表示
3.2.1 為什么不使用正則表達(dá)式
3.2.2 上下文無關(guān)語法
3.2.3 更復(fù)雜的例子
3.2.4 將語義編碼到結(jié)構(gòu)中
3.2.5 為輸入符號(hào)串找到推導(dǎo)
3.3 自頂向下語法分析
3.3.1 為進(jìn)行自頂向下語法分析而轉(zhuǎn)換語法
3.3.2 自頂向下的遞歸下降語法分析器
3.3.3 表驅(qū)動(dòng)的LL(1)語法分析器
3.4 自底向上語法分析
3.4.1 LR(1)語法分析算法
3.4.2 構(gòu)建LR(1)表
3.4.3 表構(gòu)造過程中的錯(cuò)誤
3.5 實(shí)際問題
3.5.1 出錯(cuò)恢復(fù)
3.5.2 一元運(yùn)算符
3.5.3 處理上下文相關(guān)的二義性
3.5.4 左遞歸與右遞歸
3.6 高級(jí)主題
3.6.1 優(yōu)化語法
3.6.2 減小LR(1)表的規(guī)模
3.7 小結(jié)和展望
第4章 上下文相關(guān)分析
4.1 簡(jiǎn)介
4.2 類型系統(tǒng)簡(jiǎn)介
4.2.1 類型系統(tǒng)的目標(biāo)
4.2.2 類型系統(tǒng)的組件
4.3 屬性語法框架
4.3.1 求值的方法
4.3.2 環(huán)
4.3.3 擴(kuò)展實(shí)例
4.3.4 屬性語法方法的問題
4.4 特設(shè)語法制導(dǎo)轉(zhuǎn)換
4.4.1 特設(shè)語法制導(dǎo)轉(zhuǎn)換的實(shí)現(xiàn)
4.4.2 例子
4.5 高級(jí)主題
4.5.1 類型推斷中更困難的問題
4.5.2 改變結(jié)合性
4.6 小結(jié)和展望
第5章 中間表示
5.1 簡(jiǎn)介
5.2 圖IR
5.2.1 與語法相關(guān)的樹
5.2.2 圖
5.3 線性IR
5.3.1 堆棧機(jī)代碼
5.3.2 三地址代碼
5.3.3 線性代碼的表示
5.3.4 根據(jù)線性代碼建立控制流圖
5.4 將值映射到名字
5.4.1 臨時(shí)值的命名
5.4.2 靜態(tài)單賦值形式
5.4.3 內(nèi)存模型
5.5 符號(hào)表
5.5.1 散列表
5.5.2 建立符號(hào)表
5.5.3 處理嵌套的作用域
5.5.4 符號(hào)表的許多用途
5.5.5 符號(hào)表技術(shù)的其他用途
5.6 小結(jié)和展望
第6章 過程抽象
6.1 簡(jiǎn)介
6.2 過程調(diào)用
6.3 命名空間
6.3.1 類Algol語言的命名空間
6.3.2 用于支持類Algol語言的運(yùn)行時(shí)結(jié)構(gòu)
6.3.3 面向?qū)ο笳Z言的命名空間
6.3.4 支持面向?qū)ο笳Z言的運(yùn)行時(shí)結(jié)構(gòu)
6.4 過程之間值的傳遞
6.4.1 傳遞參數(shù)
6.4.2 返回值
6.4.3 確定可尋址性
6.5 標(biāo)準(zhǔn)化鏈接
6.6 高級(jí)主題
6.6.1 堆的顯式管理
6.6.2 隱式釋放
6.7 小結(jié)和展望
第7章 代碼形式
7.1 簡(jiǎn)介
7.2 分配存儲(chǔ)位置
7.2.1 設(shè)定運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)的位置
7.2.2 數(shù)據(jù)區(qū)的布局
7.2.3 將值保持在寄存器中
7.3 算術(shù)運(yùn)算符
7.3.1 減少對(duì)寄存器的需求
7.3.2 訪問參數(shù)值
7.3.3 表達(dá)式中的函數(shù)調(diào)用
7.3.4 其他算術(shù)運(yùn)算符
7.3.5 混合類型表達(dá)式
7.3.6 作為運(yùn)算符的賦值操作
7.4 布爾運(yùn)算符和關(guān)系運(yùn)算符
7.4.1 表示
7.4.2 對(duì)關(guān)系操作的硬件支持
7.5 數(shù)組的存儲(chǔ)和訪問
7.5.1 引用向量元素
7.5.2 數(shù)組存儲(chǔ)布局
7.5.3 引用數(shù)組元素
7.5.4 范圍檢查
7.6 字符串
7.6.1 字符串表示
7.6.2 字符串賦值
7.6.3 字符串連接
7.6.4 字符串長度
7.7 結(jié)構(gòu)引用
7.7.1 理解結(jié)構(gòu)布局
7.7.2 結(jié)構(gòu)數(shù)組
7.7.3 聯(lián)合和運(yùn)行時(shí)標(biāo)記
7.7.4 指針和匿名值
7.8 控制流結(jié)構(gòu)
7.8.1 條件執(zhí)行
7.8.2 循環(huán)和迭代
7.8.3 case語句
7.9 過程調(diào)用
7.9.1 實(shí)參求值
7.9.2 保存和恢復(fù)寄存器
7.10 小結(jié)和展望
第8章 優(yōu)化簡(jiǎn)介
8.1 簡(jiǎn)介
8.2 背景
8.2.1 例子
8.2.2 對(duì)優(yōu)化的考慮
8.2.3 優(yōu)化的時(shí)機(jī)
8.3 優(yōu)化的范圍
8.4 局部?jī)?yōu)化
8.4.1 局部值編號(hào)
8.4.2 樹高平衡
8.5 區(qū)域優(yōu)化
8.5.1 超局部值編號(hào)
8.5.2 循環(huán)展開
8.6 全局優(yōu)化
8.6.1 利用活動(dòng)信息查找未初始化變量
8.6.2 全局代碼置放
8.7 過程間優(yōu)化
8.7.1 內(nèi)聯(lián)替換
8.7.2 過程置放
8.7.3 針對(duì)過程間優(yōu)化的編譯器組織結(jié)構(gòu)
8.8 小結(jié)和展望
第9章 數(shù)據(jù)流分析
9.1 簡(jiǎn)介
9.2 迭代數(shù)據(jù)流分析
9.2.1 支配性
9.2.2 活動(dòng)變量分析
9.2.3 數(shù)據(jù)流分析的局限性
9.2.4 其他數(shù)據(jù)流問題
9.3 靜態(tài)單賦值形式
9.3.1 構(gòu)造靜態(tài)單賦值形式的簡(jiǎn)單方法
9.3.2 支配邊界
9.3.3 放置 函數(shù)
9.3.4 重命名
9.3.5 從靜態(tài)單賦值形式到其他形式的轉(zhuǎn)換
9.3.6 使用靜態(tài)單賦值形式
9.4 過程間分析
9.4.1 構(gòu)建調(diào)用圖
9.4.2 過程間常量傳播
9.5 高級(jí)主題
9.5.1 結(jié)構(gòu)性數(shù)據(jù)流算法和可歸約性
9.5.2 加速計(jì)算支配性的迭代框架算法的執(zhí)行
9.6 小結(jié)和展望
第10章 標(biāo)量?jī)?yōu)化
10.1 簡(jiǎn)介
10.2 消除無用和不可達(dá)代碼
10.2.1 消除無用代碼
10.2.2 消除無用控制流
10.2.3 消除不可達(dá)代碼
10.3 代碼移動(dòng)
10.3.1 緩式代碼移動(dòng)
10.3.2 代碼提升
10.4 特化
10.4.1 尾調(diào)用優(yōu)化
10.4.2 葉調(diào)用優(yōu)化
10.4.3 參數(shù)提升
10.5 冗余消除
10.5.1 值相同與名字相同
10.5.2 基于支配者的值編號(hào)算法
10.6 為其他變換制造時(shí)機(jī)
10.6.1 超級(jí)塊復(fù)制
10.6.2 過程復(fù)制
10.6.3 循環(huán)外提
10.6.4 重命名
10.7 高級(jí)主題
10.7.1 合并優(yōu)化
10.7.2 強(qiáng)度削減
10.7.3 選擇一種優(yōu)化序列
10.8 小結(jié)和展望
第11章 指令選擇
11.1 簡(jiǎn)介
11.2 代碼生成
11.3 擴(kuò)展簡(jiǎn)單的樹遍歷方案
11.4 通過樹模式匹配進(jìn)行指令選擇
11.4.1 重寫規(guī)則
11.4.2 找到平鋪方案
11.4.3 工具
11.5 通過窺孔優(yōu)化進(jìn)行指令選擇
11.5.1 窺孔優(yōu)化
11.5.2 窺孔變換程序
11.6 高級(jí)主題
11.6.1 學(xué)習(xí)窺孔模式
11.6.2 生成指令序列
11.7 小結(jié)和展望
第12章 指令調(diào)度
12.1 簡(jiǎn)介
12.2 指令調(diào)度問題
12.2.1 度量調(diào)度質(zhì)量的其他方式
12.2.2 是什么使調(diào)度這樣難
12.3 局部表調(diào)度
12.3.1 算法
12.3.2 調(diào)度具有可變延遲的操作
12.3.3 擴(kuò)展算法
12.3.4 在表調(diào)度算法中打破平局
12.3.5 前向表調(diào)度與后向表調(diào)度
12.3.6 提高表調(diào)度的效率
12.4 區(qū)域性調(diào)度
12.4.1 調(diào)度擴(kuò)展基本程序塊
12.4.2 跟蹤調(diào)度
12.4.3 通過復(fù)制構(gòu)建適當(dāng)?shù)纳舷挛沫h(huán)境
12.5 高級(jí)主題
12.5.1 軟件流水線的策略
12.5.2 用于實(shí)現(xiàn)軟件流水線的算法
12.6 小結(jié)和展望
第13章 寄存器分配
13.1 簡(jiǎn)介
13.2 背景問題
13.2.1 內(nèi)存與寄存器
13.2.2 分配與指派
13.2.3 寄存器類別
13.3 局部寄存器分配和指派
13.3.1 自頂向下的局部寄存器分配
13.3.2 自底向上的局部寄存器分配
13.3.3 超越單個(gè)程序塊
13.4 全局寄存器分配和指派
13.4.1 找到全局活動(dòng)范圍
13.4.2 估算全局逐出代價(jià)
13.4.3 沖突和沖突圖
13.4.4 自頂向下著色
13.4.5 自底向上著色
13.4.6 合并副本以減小度數(shù)
13.4.7 比較自頂向下和自底向上全局分配器
13.4.8 將機(jī)器的約束條件編碼到?jīng)_突圖中
13.5 高級(jí)主題
13.5.1 圖著色寄存器分配方法的變體
13.5.2 靜態(tài)單賦值形式上的全局寄存器分配
13.6 小結(jié)和展望
附錄A ILOC
附錄B 數(shù)據(jù)結(jié)構(gòu)
參考文獻(xiàn)
索引
"編譯器是一個(gè)內(nèi)容豐富的研究領(lǐng)域,將整個(gè)計(jì)算機(jī)科學(xué)融匯在一個(gè)優(yōu)雅的構(gòu)造中。Cooper和Torczon的這本書很受歡迎,可以指導(dǎo)讀者輕松學(xué)習(xí)編譯器這種軟件系統(tǒng),新版增加了兩位作者的一些設(shè)計(jì)經(jīng)驗(yàn),并明確指出了許多必須注意的細(xì)節(jié),同時(shí)又不忘強(qiáng)調(diào)設(shè)計(jì)的大局觀。對(duì)任何不熟悉編譯器的人來說,本書都是不可多得的參考手冊(cè)。"
——Michael D. Smith,哈佛大學(xué)文理學(xué)院院長,工程與應(yīng)用科學(xué)John H. Finley Jr.講席教授
"本書是構(gòu)建現(xiàn)代優(yōu)化編譯器的指南。作者汲取了編譯器構(gòu)建領(lǐng)域大量的經(jīng)驗(yàn),以幫助學(xué)生掌握整體設(shè)計(jì)思路,同時(shí)引導(dǎo)學(xué)生了解構(gòu)建有效的優(yōu)化編譯器所必需的許多重要而微妙的細(xì)節(jié)。尤其值得一提的是,在我讀過的書中,本書對(duì)靜態(tài)單賦值形式的闡述最為清晰。"
——Jeffery von Ronne,得克薩斯大學(xué)圣安東尼奧分校計(jì)算機(jī)科學(xué)系助理教授
"本書采用了更常規(guī)且一致的結(jié)構(gòu),還包含大量輔助教學(xué)的內(nèi)容,如復(fù)習(xí)題、附加示例、術(shù)語解釋和文本框說明等,這提升了它作為教科書的價(jià)值。本書還包括大量技術(shù)上的更新,包括非傳統(tǒng)語言、實(shí)際編譯器和編譯器技術(shù)非傳統(tǒng)用途方面的更多內(nèi)容。優(yōu)化方面的內(nèi)容是第1版的特色,這一版中變得更為清晰易讀。"
——Michael L. Sccot,羅徹斯特大學(xué)計(jì)算機(jī)科學(xué)系教授,Programming Language Pragmatics的作者
"Keith Cooper和Linda Torczon不僅很好地講述了編譯器的歷史,也從實(shí)踐者的角度闡述了如何開發(fā)編譯器。書中包括了大量頗具實(shí)用價(jià)值的討論和說明,既涉及理論,也涉及眾多現(xiàn)存編譯器的實(shí)例(如Lisp、FORTRAN等)。對(duì)入門和高級(jí)"分配"與"優(yōu)化"概念的討論,實(shí)際上涵蓋了編譯器設(shè)計(jì)的整個(gè)生命周期。對(duì)于計(jì)算機(jī)科學(xué)專業(yè)的學(xué)生以及編譯器設(shè)計(jì)和開發(fā)人員來說,本書都是必備參考書。"
——David Orleans,諾瓦東南大學(xué)
"這本書寫得實(shí)在是棒極了,內(nèi)容翔實(shí),輔以大量圖表和示例說明,作為大學(xué)編譯器課程的教科書和從業(yè)人員的參考書再合適不過了。代碼優(yōu)化是其重點(diǎn)。"
——Reviews網(wǎng)站