出版社: 人民邮电出版社
出品方: 图灵教育
原作名: Engineering a Compiler, 2nd Edition
译者: 郭旭
出版年: 2012-12
页数: 592
定价: 99.00元
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115301949
内容简介 · · · · · ·
深入剖析现代编译器运用的算法和技术
强调代码优化和代码生成
体现编译原理教学的最新理念
本书旨在介绍编译器构造法中的艺术和科学。书中深入分析现代编译器后端所用的算法和技术,重点讨论代码优化和代码生成,详细介绍了用几个编程语言编写的示例等。
Keith D. Cooper 莱斯大学计算机科学系计算工程专业Doerr特聘教授,曾任该系系主任。Cooper博士的研究课题涵盖过程间数据流分析、标量指令优化、寄存器分配以及指令调度等方面。
Linda Torczon 莱斯大学计算机科学系高级研究员。Torczon的研究内容主要包括代码生成、过程间数据流分析和优化、编程环境。
作者简介 · · · · · ·
作者 | Keith D. Cooper
莱斯大学计算机科学系计算工程专业Doerr特聘教授,曾任该系系主任。Cooper博士的研究课题涵盖过程间数据流分析、标量指令优化、寄存器分配以及指令调度等方面。
作者 | Linda Torczon
莱斯大学计算机科学系高级研究员。Torczon的研究内容主要包括代码生成、过程间数据流分析和优化、编程环境。
译者 | 郭旭
资深软件设计师。主要兴趣是复杂软件系统的分析和设计,目前从事高性能数据集成工具的研发。译有《深入Linux内核架构》《C语言接口及实现》等书。
目录 · · · · · ·
第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
中间表示的分类 163
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
· · · · · · (收起)
"编译器设计"试读 · · · · · ·
前 言 构建编译器的实践方法一直在不断变化,部分是因为处理器和系统的设计会发生变化。例如,当我们在1998年开始写作本书初版时,一些同事对书中指令调度方面的内容颇感疑惑,因为乱序执行威胁到了指令调度,很有可能会使其变得不再重要。现在第2版已经付印,随着多核处理器的崛起和争取更多核心的推动,顺序执行流水线再次展现吸引力,因为这种流水线占地较少,设计者能够将更..
丛书信息 · · · · · ·
喜欢读"编译器设计"的人也喜欢的电子书 · · · · · ·
喜欢读"编译器设计"的人也喜欢 · · · · · ·
- 深入分析GCC 7.8
- 编译原理 9.0
- 程序设计语言 8.4
- 自制编程语言 基于C语言 8.3
- 垃圾回收的算法与实现 8.4
- 自制编译器 8.2
- 程序员的自我修养 8.9
- 调试九法 8.9
- 具体数学 9.6
编译器设计的书评 · · · · · · ( 全部 6 条 )
Compiler was My First Facebook Interview
> 更多书评 6篇
-
这个树高平衡算法作者没解释清楚,一个字一个字的读就是读不懂,后来去作者主页一看,才发现这节被重写了。 地址在这里 https://www.clear.rice.edu/comp412/Lectures/THB.pdf
2019-03-13 18:40:23 3人喜欢
-
勘误: (此处不算错误, 而是描述的不清楚) 第370页, 倒数第6行, 在"其中包含B1和B5."之后插入半句话"先从Worklist中删除B1, ". 倒数第5行, 将语句"该操作也将B1加入到"改为"该操作再次将B1加入到". 修改后逻辑通顺不少. 第371页, 图9-11 下一个段落, 段落中提到两次"x", 应该修改为"z". 第380页, 第一段, 引入了"半格"概念, 这完全就是个坑. 用了很高端概念去描述简单问题. 书中属于格论的Join和Meet操作, 可以认为是一种自定...
2018-11-08 10:30:18 1人喜欢
-
prife (相濡以沫,不如相忘于江湖)
361页,倒数第二段 当且仅当在从某过程的入口点到p处的每条代码路径上e都已经求值,且从求值处到p之间e的任何成分子表达式都没有重新定义时,表达式e在该过程位置p处是可用的。An expression e is available at point p in a procedure if and only if on every path from the procedure’s entry to p, e is evaluated and none of its constituent subexpressions is redefined between that evaluation and p. 由于中文表...2016-01-07 22:14:00 1人喜欢
-
全神贯注 (广度是深度的副产品)
LR(1)语法分析 Action表: 移进/规约/出错 Goto表: 状态转移 移进: 栈移进一个终结符,进入下一状态 规约: 按照第几条产生式规约 然后(根据旧栈顶状态和刚刚规约的产生式左部)查询Goto表进入下一状态 关键在于Action表和Goto表的构建2023-10-11 11:06:28
-
程序设计语言应该避免二义性,二义的程序没有语义。
2013-01-13 21:39:53
-
prife (相濡以沫,不如相忘于江湖)
阅读本章时,并未发现明显错误,只觉得个别翻译值得商榷,记录如下。 216页,倒数第三段。 通常,后一个要求意味着在引用OR时,需要另增加一层间接(Typically, the latter requirement requires an extra level of indirection on references to ORs.) 后一个要求意味着当引用OR时,需要一个额外的间接层。 本章其它地方也把“间接”当成名词来用。如221页中部。 223页,倒数第三段。 名字重整(name mangling)。 严格说并不...2016-01-04 00:26:05
-
prife (相濡以沫,不如相忘于江湖)
阅读过程中发现的一些疏漏之处记录如下。 309页,倒数第三段。 它可以发现基本程序块内部的冗余,并重新该程序块以避免冗余(rewrite the block to avodi them)。 “重新”应为“重写” 310页,倒数第二段。 如果我们将a替换为3、c替换为5,那么上述两种计算顺序都不会产生常数运算3x5,因为运算是可以被合并的。(if we replace a with 3 and c with 5, neither ordering produces the constant operation 3 × 5, which can ...2016-01-03 23:56:21
-
这个树高平衡算法作者没解释清楚,一个字一个字的读就是读不懂,后来去作者主页一看,才发现这节被重写了。 地址在这里 https://www.clear.rice.edu/comp412/Lectures/THB.pdf
2019-03-13 18:40:23 3人喜欢
-
全神贯注 (广度是深度的副产品)
LR(1)语法分析 Action表: 移进/规约/出错 Goto表: 状态转移 移进: 栈移进一个终结符,进入下一状态 规约: 按照第几条产生式规约 然后(根据旧栈顶状态和刚刚规约的产生式左部)查询Goto表进入下一状态 关键在于Action表和Goto表的构建2023-10-11 11:06:28
-
全神贯注 (广度是深度的副产品)
有限的物理寄存器,无限的虚拟寄存器 局部分配根据下一次最远使用,来驱逐寄存器 全局分配使用图着色处理调度和冲突2023-10-11 10:51:49
-
全神贯注 (广度是深度的副产品)
本章主要讲代码生成 1 基于树模式和成本生成代码 2 窥孔优化,借用「管中窥豹」这个成语,望远镜看某个地方,只能看到一片,窥孔优化就是在这个滑动窗口的范围内优化,滑动窗口是物理的还是逻辑的,会影响优化效果2023-10-10 11:55:25
论坛 · · · · · ·
这本书的习题答案哪里能找到吗 | 来自就中文吧 | 4 回应 | 2023-10-05 04:32:53 |
这本书的其他版本 · · · · · · ( 全部6 )
-
Morgan Kaufmann (2011)9.2分 57人读过
-
机械工业出版社 (2006)暂无评分 17人读过
-
Morgan Kaufmann (2022)暂无评分 5人读过
-
Morgan Kaufmann (2003)暂无评分 12人读过
在哪儿借这本书 · · · · · ·
以下书单推荐 · · · · · · ( 全部 )
- 程序解体诸因 (在坡华子)
- 从码熊到码雄之路 (不在服务区)
- DIY类计算机书籍 (Joshz)
- 计算机 (徐永冰)
- 评分9分以上的计算机图书 (子苓)
谁读这本书? · · · · · ·
二手市场 · · · · · ·
订阅关于编译器设计的评论:
feed: rss 2.0
10 有用 隐士 2016-06-15 19:35:09
翻译的其实一般,编译书的确难翻译。除非译者自己根据伪代码实现一遍,否则难以真正理解其含义并准确表达出来。
0 有用 道满 2024-11-30 19:08:24 上海
靠这本大致撸了一遍shader complier,感觉有点talk too much。
1 有用 prife 2016-12-01 00:17:03
2014/10/11日开始读
4 有用 var this=that; 2019-12-25 18:43:37
好书烂翻译,就举一个例子吧: 5.1简介 Compilers are typically organized as a series of passes. 译成“编译器通常组织为一连串的处理趟” 译者是认为这样很接地气易于理解嘛…🙄 而且后面还在不厌其烦地使用 趟。
0 有用 回答 2019-10-28 21:37:49
放弃,看了1/3,没时间看了
0 有用 道满 2024-11-30 19:08:24 上海
靠这本大致撸了一遍shader complier,感觉有点talk too much。
0 有用 狂人总角 2024-03-08 10:43:26 湖南
没翻译好,更有可能是这本书的学习曲线太陡
0 有用 全神贯注 2023-10-11 10:55:23 广东
写的太好了,内容的结构组织特别好,表达很棒,翻译也很流畅。 有一部分原文的bug,第三版已经修复;有一部分翻译引入的错误,理解不了时可以参考原版,就知道怎么回事了。发现错误的过程就是学会的过程
0 有用 yjhmelody 2023-08-30 21:41:40 浙江
看完一半就好久没看了,记得21年特意买来收藏,没想到22年出英文版第三版了
0 有用 koAla_pierce 2023-08-16 19:21:01 北京
内容丰富,知识点很杂,读起来很累