出版時(shí)間:2008年12月 出版社:機(jī)械工業(yè)出版社 作者:Alfred V. Aho,Monica S.Lam,Ravi Sethi,Jeffrey D. Ullman 頁數(shù):631 譯者:趙建華,鄭滔,戴新宇
Tag標(biāo)簽:無
前言
絕大部分軟件是使用高級程序設(shè)計(jì)語言來編寫的。用這些語言編寫的軟件必須經(jīng)過編譯器的編譯,才能轉(zhuǎn)換為可以在計(jì)算機(jī)上運(yùn)行的機(jī)器代碼。編譯器所生成代碼的正確性和質(zhì)量會直接影響成千上萬個(gè)軟件。因此,編譯器構(gòu)造原理和技術(shù)是計(jì)算機(jī)科學(xué)技術(shù)領(lǐng)域中的一個(gè)非常重要的組成部分。不僅如此,編譯技術(shù)在當(dāng)前已經(jīng)廣泛應(yīng)用于編譯器構(gòu)造之外的其他領(lǐng)域,比如程序分析/驗(yàn)證、模型轉(zhuǎn)換、語言處理等領(lǐng)域。因此,雖然大部分讀者不會參與設(shè)計(jì)商用編譯器,但擁有編譯的相關(guān)知識仍然會對他們的研究開發(fā)生涯產(chǎn)生有益的影響。A.V.Aho等人撰寫的《Compilers:Principles,Techniques,andYools》被譽(yù)為編譯教科書中的“龍書”。這說明這本書具有很高的權(quán)威性。我們有幸受機(jī)械工業(yè)出版社的委托,翻譯龍書的第2版。本書不僅包含了詞法分析、語法分析、語義分析、代碼生成等傳統(tǒng)、經(jīng)典的編譯知識,還詳細(xì)介紹了一些最新研究成果,比如過程間指針分析的最新進(jìn)展。這使得本書不僅適用于編譯原理的初學(xué)者,還可以作為研究人員的參考書目。本書不僅介紹編譯器構(gòu)造的基本原理和技術(shù),還詳細(xì)介紹一些有用的編譯器構(gòu)造工具,比如對Lex和Yacc的介紹使得讀者可以了解這些工具的工作原理和使用方法。除此之外,讀者還可以看到很多其他領(lǐng)域的概念在編譯器構(gòu)造中的應(yīng)用。比如在第9章,讀者可以看到群論中的抽象概念“格”被完美地應(yīng)用于數(shù)據(jù)流分析算法的設(shè)計(jì)。而在第11章,線性規(guī)劃和整數(shù)規(guī)劃技術(shù)被成功地應(yīng)用于程序并行化技術(shù)。這些內(nèi)容對拓展讀者的視野和思路有很大的好處。由于本書覆蓋的范圍非常廣,不可能在一個(gè)學(xué)期內(nèi)講完本書的全部內(nèi)容。因此我建議采用本書作為本科生教材的老師只選擇講授其中的基礎(chǔ)部分,即第1章到第9章中的大部分內(nèi)容。第2章是對后面各章內(nèi)容的介紹,可以在講授相應(yīng)內(nèi)容之前指導(dǎo)學(xué)生預(yù)習(xí)。最后感謝機(jī)械工業(yè)出版社的溫莉芳女士以及姚蕾和朱劫兩位編輯在本書的翻譯過程中給予我們的有力幫助,也感謝其他給予我們支持的同事。由于水平有限,翻譯中的錯(cuò)漏之處在所難免,歡迎讀者批評指正。
內(nèi)容概要
本書全面、深入地探討了編譯器設(shè)計(jì)方面的重要主題,包括詞法分析、語法分析、語法制導(dǎo)定義和語法制導(dǎo)翻譯、運(yùn)行時(shí)刻環(huán)境、目標(biāo)代碼生成、代碼優(yōu)化技術(shù)、并行性檢測以及過程間分析技術(shù),并在相關(guān)章節(jié)中給出大量的實(shí)例。與上一版相比,本書進(jìn)行了全面修訂,涵蓋了編譯器開發(fā)方面最新進(jìn)展。每章中都提供了大量的實(shí)例及參考文獻(xiàn)。
本書是編譯原理課程方面的經(jīng)典教材,內(nèi)容豐富,適合作為高等院校計(jì)算機(jī)及相關(guān)專業(yè)本科生及研究生的編譯原理課程的教材,也是廣大技術(shù)人員的極佳參考讀物。
作者簡介
Alfred
V.Aho,美國歌倫比亞大學(xué)教授,美國國家工程院院士,ACM和IEEE會士,曾獲得IEEE的馮·諾伊曼獎(jiǎng)。著有多部算法、數(shù)據(jù)結(jié)構(gòu)、編譯器、數(shù)據(jù)庫系統(tǒng)及計(jì)算機(jī)科學(xué)基礎(chǔ)方面的著作。
書籍目錄
出版者的話
譯者序
前言
第1章 引論
1.1 語言處理器
1.2 一個(gè)編譯器的結(jié)構(gòu)
1.2.1 詞法分析
1.2.2 語法分析
1.2.3 語義分析
1.2.4 中間代碼生成
1.2.5 代碼優(yōu)化
1.2.6 代碼生成
1.2.7 符號表管理
1.2.8 將多個(gè)步驟組合成趟
1.2.9 編譯器構(gòu)造工具
1.3 程序設(shè)計(jì)語言的發(fā)展歷程
1.3.1 走向高級程序設(shè)計(jì)語言
1.3.2 對編譯器的影響
1.3.3 1.3節(jié)的練習(xí)
1.4 構(gòu)建一個(gè)編譯器的相關(guān)科學(xué)
1.4.1 編譯器設(shè)計(jì)和實(shí)現(xiàn)中的建模
1.4.2 代碼優(yōu)化的科學(xué)
1.5 編譯技術(shù)的應(yīng)用
1.5.1 高級程序設(shè)計(jì)語言的實(shí)現(xiàn)
1.5.2 針對計(jì)算機(jī)體系結(jié)構(gòu)的優(yōu)化
1.5.3 新計(jì)算機(jī)體系結(jié)構(gòu)的設(shè)計(jì)
1.5.4 程序翻譯
1.5.5 軟件生產(chǎn)率工具
1.6 程序設(shè)計(jì)語言基礎(chǔ)
1.6.1 靜態(tài)和動(dòng)態(tài)的區(qū)別
1.6.2 環(huán)境與狀態(tài)
1.6.3 靜態(tài)作用域和塊結(jié)構(gòu)
1.6.4 顯式訪問控制
1.6.5 動(dòng)態(tài)作用域
1.6.6 參數(shù)傳遞機(jī)制
1.6.7 別名
1.6.8 1.6節(jié)的練習(xí)
1.7 第1章的總結(jié)
1.8 第1章的參考書目
第2章 一個(gè)簡單的語法制導(dǎo)翻譯器
2.1 引言
2.2 語法定義
2.2.1 文法定義
2.2.2 推導(dǎo)
2.2.3 語法分析樹
2.2.4 二義性
2.2.5 運(yùn)算符的結(jié)合性
2.2.6 運(yùn)算符的優(yōu)先級
2.2.7 2.2節(jié)的練習(xí)
2.3 語法制導(dǎo)翻譯
2.3.1 后綴表示
2.3.2 綜合屬性
2.3.3 簡單語法制導(dǎo)定義
2.3.4 樹的遍歷
2.3.5 翻譯方案
2.3.6 2.3節(jié)的練習(xí)
2.4 語法分析
2.4.1 自頂向下分析方法
2.4.2 預(yù)測分析法
2.4.3 何時(shí)使用產(chǎn)生式
2.4.4 設(shè)計(jì)一個(gè)預(yù)測語法分析器
2.4.5 左遞歸
2.4.6 2.4節(jié)的練習(xí)
2.5 簡單表達(dá)式的翻譯器
2.5.1抽象語法和具體語法
2.5.2調(diào)整翻譯方案
2.5.3非終結(jié)符號的過程
2.5.4 翻譯器的簡化
2.5.5 完整的程序
2.6 詞法分析
2.6.1 剔除空白和注釋
2.6.2 預(yù)讀
2.6.3 常量
2.6.4 識別關(guān)鍵字和標(biāo)識符
2.6.5 詞法分析器
2.6.6 2.6節(jié)的練習(xí)
2.7 符號表
2.7.1 為每個(gè)作用域設(shè)置一個(gè)符號表
2.7.2 符號表的使用
2.8 中間代碼生成
2.8.1 兩種中間表示形式
2.8.2 語法樹的構(gòu)造
2.8.4 三地址碼
2.8.5 2.8節(jié)的練習(xí)
2.9 第2章的總結(jié)
第3章 詞法分析
3.1 詞法分析器的作用
3.1.1 詞法分析及解析
3.1.2 詞法單元、模式、詞素
3.1.3 詞法單元的屬性
3.1.4 詞法錯(cuò)誤
3.1.5 3.1節(jié)的練習(xí)
3.2 輸入緩沖
3.2.1 緩沖區(qū)對
3.2.2 哨兵標(biāo)記
3.3 詞法單元的規(guī)約
3.3.1 串和語言
3.3.2 語言上的運(yùn)算
3.3.3 正則表達(dá)式
3.3.4 正則定義
3.3.5 正則表達(dá)式的擴(kuò)展
3.3.6 3.3節(jié)的練習(xí)
3.4 詞法單元的識別
3.4.1 狀態(tài)轉(zhuǎn)換圖
3.4.2 保留字和標(biāo)識符的識別
3.4.3 完成我們的連續(xù)性例子
3.4.4 基于狀態(tài)轉(zhuǎn)換圖的詞法分析器的體系結(jié)構(gòu)
3.4.5 3.4節(jié)的練習(xí)
3.5 詞法分析器生成工具Lex
3.5.1 Lex的使用
3.5.2 Lex程序的結(jié)構(gòu)
3.5.3 Lex中的沖突解決
3.5.4 向前看運(yùn)算符
3.5.5 3.5節(jié)練習(xí)
3.6 有窮自動(dòng)機(jī)
3.6.1 不確定的有窮自動(dòng)機(jī)
3.6.2 轉(zhuǎn)換表
3.6.3 NFA接受輸入字符串
3.6.4 確定的有窮自動(dòng)機(jī)
3.6.5 3.6節(jié)的練習(xí)
3.7 從正則表達(dá)式到自動(dòng)機(jī)
3.7.1 從NFA到DFA的轉(zhuǎn)換
3.7.2 NFA的模擬
3.7.3 NFA模擬效率
3.7.4 從正則表達(dá)式構(gòu)造NFA
3.7.5 字符串處理算法的效率
3.7.6 3.7節(jié)的練習(xí)
3.8 詞法分析器生成工具的設(shè)計(jì)
3.8.1 被生成的詞法分析器的結(jié)構(gòu)
3.8.2 基于NFA的模式匹配
3.8.3 詞法分析器使用的DFA
3.8.4 實(shí)現(xiàn)向前看運(yùn)算符
3.8.5 3.8的練習(xí)
3.9 基于DFA的模式匹配器的優(yōu)化
3.9.1 NFA的重要狀態(tài)
3.9.2 根據(jù)抽象語法樹計(jì)算得到的函數(shù)
3.9.3 計(jì)算nullable、firstpos及l(fā)astpos
3.9.4 計(jì)算followpos
3.9.5 根據(jù)正則表達(dá)式構(gòu)建DFA
3.9.6 最小化一個(gè)DFA的狀態(tài)數(shù)
3.9.7 詞法分析器的狀態(tài)最小化
3.9.8 在DFA模擬中用時(shí)間換取空間
3.9.9 3.9節(jié)的練習(xí)
3.9.10 第3章的總結(jié)
3.11 第3章參考文獻(xiàn)
第4章 語法分析
4.1 引論
4.1.1 語法分析器的角色
4.1.2 代表性的文法
4.1.3 語法錯(cuò)誤的處理
4.1.4 錯(cuò)誤恢復(fù)策略
4.2 上下文無關(guān)文法
4.2.1 上下文無關(guān)文法的正式定義
4.2.2 符號表示的慣例
4.2.3 推導(dǎo)
4.2.4 語法分析樹和推導(dǎo)
4.2.5 二義性
4.2.6 驗(yàn)證文法生成的語言
4.2.7上下文無關(guān)文法和正則表達(dá)式
4.2.8 4.2節(jié)的練習(xí)
4.3 設(shè)計(jì)文法
4.3.1 詞法分析和語法分析
4.3.2 消除二義性
4.3.3 左遞歸的消除
4.3.4 提取左公因子
4.3.5 非上下文無關(guān)的語言構(gòu)造
4.3.6 4.3節(jié)的練習(xí)
4.4 自頂向下的語法分析
4.4.1 遞歸下降的語法分析
4.4.2 FIRST和FOLLOW
4.4.3 LL(1)文法
4.4.4 非遞歸的預(yù)測分析
4.4.5 預(yù)測分析中的錯(cuò)誤恢復(fù)
4.4.6 4.4節(jié)的練習(xí)
4.5 自底向上的語法分析
4.5.1 歸約
4.5.2 句柄剪枝
4.5.3 移入-歸約語法分析技術(shù)
4.5.4 移入-歸約語法分析中的沖突
4.5.5 4.5節(jié)的練習(xí)
4.6 LR語法分析技術(shù)介紹:簡單LR技術(shù)
4.6.1 為什么使用LR語法分析器?
4.6.2 項(xiàng)和LR(0)自動(dòng)機(jī)
4.6.3 LR-語法分析算法
4.6.4 構(gòu)造SLR-分析表
4.6.5 可行前綴
4.6.6 4.6節(jié)的練習(xí)
4.7 更強(qiáng)大的LR語法分析器
4.7.1 規(guī)范LR(1)項(xiàng)
4.7.2 構(gòu)造LR(1)項(xiàng)集
4.7.3 規(guī)范LR(1)分析表
4.7.4 構(gòu)造LALR語法分析表
4.7.5 LALR語法分析表的高效構(gòu)造方法
4.7.6 LR語法分析表的壓縮
4.7.7 4.7節(jié)的練習(xí)
4.8 使用二義性文法
4.8.1 用優(yōu)先級和結(jié)合性解決沖突
4.8.2 “懸空-else”二義性
4.8.3 LR語法分析中的錯(cuò)誤恢復(fù)
4.8.4 4.8節(jié)的練習(xí)
4.9 語法分析器的生成工具
4.9.1 語法分析器的生成工具Yacc
4.9.2 使用Yacc處理二義性文法
4.9.3 用Lex創(chuàng)建Yacc的詞法分析器
4.9.4 Yacc中的錯(cuò)誤恢復(fù)
4.9.5 4.9節(jié)的練習(xí)
4.10:第4章的小結(jié)
4.11 第4章的參考文獻(xiàn)
第5章 語法制導(dǎo)的翻譯
5.1 語法制導(dǎo)定義
5.1.1 繼承屬性和綜合屬性
5.1.2 在一棵語法分析樹的結(jié)點(diǎn)上對一個(gè)SDD求值
5.1.3 5.1節(jié)的練習(xí)
5.2 SDD的求值順序
5.2.1 依賴圖
5.2.2 屬性求值的順序
5.2.3 S-屬性定義
5.2.4 L-屬性定義
5.2.5 具有受控副作用的語義規(guī)則
5.2.6 5.2節(jié)的練習(xí)
5.3 語法制導(dǎo)翻譯的應(yīng)用
5.3.1 抽象語法樹的構(gòu)造
5.3.2 類型的結(jié)構(gòu)
5.3.3 5.3節(jié)的練習(xí)
5.4 語法制導(dǎo)的翻譯方案
5.4.1 后綴翻譯方案
5.4.2 后綴SDT的語法分析棧實(shí)現(xiàn)
5.4.3 產(chǎn)生式內(nèi)部帶有語義動(dòng)作的SDT
5.4.4 從SDT中消除左遞歸
5.4.5 L-屬性定義的SDT
5.4.6 5.4節(jié)的練習(xí)
5.5 實(shí)現(xiàn)L-屬性的SDD
5.5.1 在遞歸下降語法分析過程中進(jìn)行翻譯
5.5.2 邊掃描邊生成代碼
5.5.3 L-屬性的SDD和LL語法分析
5.5.4 L-屬性的SDD的自底向上語法分析
5.5.5 5.5節(jié)的練習(xí)
5.6 第5章的總結(jié)
5.7 第5章的參考文獻(xiàn)
第6章 中間代碼生成
第7章 運(yùn)行時(shí)刻環(huán)境
第7章 總結(jié)
第8章 代碼生成
第9章 機(jī)器無關(guān)優(yōu)化
第10章 指令級并行
第11章 并行性和局部性的優(yōu)化
第12章 過程間分析
章節(jié)摘錄
插圖:第二個(gè)目標(biāo)是編譯器應(yīng)該有效提高很多輸入程序的性能。性能通常意味著程序執(zhí)行的速度。我們也希望能夠盡可能降低生成代碼的大小,在嵌入式系統(tǒng)中更是如此。而對于移動(dòng)設(shè)備的情況,盡量降低代碼的能耗也是我們期待的。在通常情況下,提高執(zhí)行效率的優(yōu)化也能夠節(jié)約能耗。除了性能,錯(cuò)誤報(bào)告和調(diào)試等的可用性方面也是很重要的。第三,我們需要使編譯時(shí)間保持在較短的范圍內(nèi),以支持快速的開發(fā)和調(diào)試周期。當(dāng)機(jī)器變得越來越快,這個(gè)要求會越來越容易達(dá)到。開始時(shí),一個(gè)程序經(jīng)常在沒有進(jìn)行優(yōu)化的情況下開發(fā)和調(diào)試。這么做不僅可以降低編譯時(shí)間,更重要的是未經(jīng)優(yōu)化的程序比較容易調(diào)試。這是因?yàn)榫幾g器引入的優(yōu)化經(jīng)常使得源代碼和目標(biāo)代碼之間的關(guān)系變得模糊。在編譯器中開啟優(yōu)化有時(shí)會暴露出源程序中的新問題,因此需要對經(jīng)過優(yōu)化的代碼再次進(jìn)行測試。因?yàn)榭赡苄枰~外的測試工作,有時(shí)會阻止人們在應(yīng)用中使用優(yōu)化技術(shù),當(dāng)應(yīng)用的性能不很重要的時(shí)候更是如此。最后,編譯器是一個(gè)復(fù)雜的系統(tǒng),我們必須使系統(tǒng)保持簡單以保證編譯器的設(shè)計(jì)和維護(hù)費(fèi)用是可管理的。我們可以實(shí)現(xiàn)的優(yōu)化技術(shù)有無窮多種,而創(chuàng)建一個(gè)正確有效的優(yōu)化過程需要相當(dāng)大的工作量。我們必須劃分不同優(yōu)化技術(shù)的優(yōu)先級別,只實(shí)現(xiàn)那些可以對實(shí)踐中遇到的源程序帶來最大好處的技術(shù)。因此,我們在研究編譯器時(shí)不僅要學(xué)習(xí)如何構(gòu)造一個(gè)編譯器,還要學(xué)習(xí)解決復(fù)雜和開放性問題的一般方法學(xué)。在編譯器開發(fā)中用到的方法涉及理論和實(shí)驗(yàn)。在開始的時(shí)候,我們通常根據(jù)直覺確定有哪些重要的問題并把它們明確描述出來。
編輯推薦
《編譯原理(第2版)》是編譯領(lǐng)域無可替代的經(jīng)典著作,被廣大計(jì)算機(jī)專業(yè)人士譽(yù)為"龍書"。《編譯原理(第2版)》上一版自1986年出版以來,被世界各地的著名高等院校和研究機(jī)構(gòu)(包括美國哥倫比亞大學(xué)、斯坦福大學(xué)、哈佛大學(xué)、普林斯頓大學(xué)、貝爾實(shí)驗(yàn)室)作為本科生和研究生的編譯原理課程的教材。該書對我國高等計(jì)算機(jī)教育領(lǐng)域也產(chǎn)生了重大影響。編譯領(lǐng)域里程碑式的經(jīng)典著作——龍書,20年后終于出版新版!這是一個(gè)延綿30年的故事,這是一部關(guān)于龍書的傳奇!最新版本,增添兩章節(jié)內(nèi)容,使龍書地位更權(quán)威!第2版對每一章都進(jìn)行了全面的修訂,以反映自上一版出版20多年來軟件工程。程序設(shè)計(jì)語言和計(jì)算機(jī)體系結(jié)構(gòu)方面的發(fā)展對編譯技術(shù)的影響?!毒幾g原理(第2版)》全面介紹了編譯器的設(shè)計(jì),并強(qiáng)調(diào)編譯技術(shù)在軟件設(shè)計(jì)和開發(fā)中的廣泛應(yīng)用。每章中都包含大量的習(xí)題和豐富的參考文獻(xiàn)。1977年,AlfredV.Aho和JeffreyD.Ullman合作出版了《PrincipiesofCompiletDesign》,封面是一位騎士和一只恐龍,那恐龍是綠色的,因此被稱為龍書或綠龍書。1986年,原來的兩位作者加上RaviSethi,升級了前一《編譯原理(第2版)》,書名改為《compiIers:Principles,TechniquesandTools》,封面依然沿用騎士和恐龍,那恐龍是紅色的,因此被稱為龍書二或者紅龍書。又過了一個(gè)9年又一個(gè)9年,編譯領(lǐng)域的巨無霸——龍書始終都沒有升級。終于在2006年底,龍書升級了。作者又增加了MonicaS.Lam,名字與龍書二相同,封面依然沿用恐龍和武士的設(shè)計(jì),這次的龍是紫色的,因此被稱為龍書三或者紫龍書。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載