图书介绍
现代编译原理 C语言描述 修订版PDF|Epub|txt|kindle电子书版本网盘下载
![现代编译原理 C语言描述 修订版](https://www.shukui.net/cover/76/34514322.jpg)
- 安德鲁·W.安佩尔(Andrew W.Appel),马亚·金斯伯格(Maia Ginsburg) 著
- 出版社: 北京:人民邮电出版社
- ISBN:9787115476883
- 出版时间:2018
- 标注页数:386页
- 文件大小:60MB
- 文件页数:398页
- 主题词:编译程序-程序设计;C语言-程序设计
PDF下载
下载说明
现代编译原理 C语言描述 修订版PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第一部分 编译基本原理1
第1章 绪论1
1.1 模块与接口1
1.2 工具和软件3
1.3 树语言的数据结构3
程序设计:直线式程序解释器7
推荐阅读8
习题9
第2章 词法分析10
2.1 词法单词10
2.2 正则表达式11
2.3 有限自动机13
2.4 非确定有限自动机15
2.4.1 将正则表达式转换为NFA16
2.4.2 将NFA转换为DFA18
2.5 Lex:词法分析器的生成器20
程序设计:词法分析22
推荐阅读23
习题23
第3章 语法分析27
3.1 上下文无关文法28
3.1.1 推导29
3.1.2 语法分析树29
3.1.3 二义性文法30
3.1.4 文件结束符31
3.2 预测分析32
3.2.1 FIRST集合和FOLLOW集合33
3.2.2 构造预测分析器35
3.2.3 消除左递归36
3.2.4 提取左因子37
3.2.5 错误恢复37
3.3 LR分析39
3.3.1 LR分析引擎40
3.3.2 LR(0)分析器生成器41
3.3.3 SLR分析器的生成43
3.3.4 LR(1)项和LR(1)分析表45
3.3.5 LALR(1)分析表46
3.3.6 各类文法的层次47
3.3.7 二义性文法的LR分析47
3.4 使用分析器的生成器48
3.4.1 冲突49
3.4.2 优先级指导50
3.4.3 语法和语义53
3.5 错误恢复54
3.5.1 用error符号恢复54
3.5.2 全局错误修复55
程序设计:语法分析57
推荐阅读58
习题58
第4章 抽象语法62
4.1 语义动作62
4.1.1 递归下降62
4.1.2 Yacc生成的分析器62
4.1.3 语义动作的解释器64
4.2 抽象语法分析树65
4.2.1 位置67
4.2.2 Tiger的抽象语法68
程序设计:抽象语法71
推荐阅读71
习题72
第5章 语义分析73
5.1 符号表73
5.1.1 多个符号表74
5.1.2 高效的命令式风格符号表75
5.1.3 高效的函数式符号表76
5.1.4 Tiger编译器的符号77
5.1.5 函数式风格的符号表79
5.2 Tiger编译器的绑定79
5.3 表达式的类型检查82
5.4 声明的类型检查84
5.4.1 变量声明84
5.4.2 类型声明85
5.4.3 函数声明85
5.4.4 递归声明86
程序设计:类型检查86
习题87
第6章 活动记录89
6.1 栈帧90
6.1.1 帧指针91
6.1.2 寄存器92
6.1.3 参数传递92
6.1.4 返回地址94
6.1.5 栈帧内的变量94
6.1.6 静态链95
6.2 Tiger编译器的栈帧96
6.2.1 栈帧描述的表示98
6.2.2 局部变量98
6.2.3 计算逃逸变量99
6.2.4 临时变量和标号100
6.2.5 两层抽象100
6.2.6 管理静态链102
6.2.7 追踪层次信息102
程序设计:栈帧102
推荐阅读103
习题103
第7章 翻译成中间代码106
7.1 中间表示树106
7.2 翻译为树中间语言108
7.2.1 表达式的种类108
7.2.2 简单变量111
7.2.3 追随静态链112
7.2.4 数组变量113
7.2.5 结构化的左值113
7.2.6 下标和域选择114
7.2.7 关于安全性的劝告115
7.2.8 算术操作116
7.2.9 条件表达式116
7.2.10 字符串117
7.2.11 记录和数组的创建118
7.2.12 while循环119
7.2.13 for循环119
7.2.14 函数调用120
7.3 声明120
7.3.1 变量定义120
7.3.2 函数定义120
7.3.3 片段121
程序设计:翻译成树122
习题123
第8章 基本块和轨迹125
8.1 规范树126
8.1.1 ESEQ的转换126
8.1.2 一般重写规则126
8.1.3 将CALL移到顶层130
8.1.4 线性语句表131
8.2 处理条件分支131
8.2.1 基本块131
8.2.2 轨迹132
8.2.3 完善133
8.2.4 最优轨迹133
推荐阅读134
习题134
第9章 指令选择136
9.1 指令选择算法138
9.1.1 Maximal Munch算法138
9.1.2 动态规划140
9.1.3 树文法141
9.1.4 快速匹配143
9.1.5 覆盖算法的效率143
9.2 CISC机器144
9.3 Tiger编译器的指令选择146
9.3.1 抽象的汇编语言指令146
9.3.2 生成汇编指令148
9.3.3 过程调用151
9.3.4 无帧指针的情形151
程序设计:指令选择152
推荐阅读153
习题154
第10章 活跃分析155
10.1 数据流方程的解156
10.1.1 活跃性计算156
10.1.2 集合的表示158
10.1.3 时间复杂度158
10.1.4 最小不动点159
10.1.5 静态活跃性与动态活跃性160
10.1.6 冲突图161
10.2 Tiger编译器的活跃分析162
10.2.1 图162
10.2.2 控制流图163
10.2.3 活跃分析164
程序设计:构造流图164
程序设计:活跃分析模块165
习题165
第11章 寄存器分配166
11.1 通过简化进行着色166
11.2 合并168
11.3 预着色的结点171
11.3.1 机器寄存器的临时副本171
11.3.2 调用者保护的寄存器和被调用者保护的寄存器172
11.3.3 含预着色结点的例子172
11.4 图着色的实现175
11.4.1 传送指令工作表的管理176
11.4.2 数据结构176
11.4.3 程序代码177
11.5 针对树的寄存器分配181
程序设计:图着色184
推荐阅读185
习题185
第12章 整合为一体188
程序设计:过程人口/出口189
程序设计:创建一个可运行的编译器191
第二部分 高级主题193
第13章 垃圾收集193
13.1 标记-清扫式收集194
13.2 引用计数197
13.3 复制式收集198
13.4 分代收集201
13.5 增量式收集203
13.6 Baker算法205
13.7 编译器接口205
13.7.1 快速分配205
13.7.2 数据布局的描述206
13.7.3 导出指针207
程序设计:描述字208
程序设计:垃圾收集208
推荐阅读208
习题210
第14章 面向对象的语言211
14.1 类211
14.2 数据域的单继承性213
14.3 多继承214
14.4 测试类成员关系216
14.5 私有域和私有方法218
14.6 无类语言219
14.7 面向对象程序的优化219
程序设计:Object-Tiger220
推荐阅读220
习题221
第15章 函数式程序设计语言222
15.1 一个简单的函数式语言222
15.2 闭包224
15.3 不变的变量225
15.3.1 基于延续的I/O226
15.3.2 语言上的变化227
15.3.3 纯函数式语言的优化228
15.4 内联扩展229
15.5 闭包变换233
15.6 高效的尾递归235
15.7 懒惰计算236
15.7.1 传名调用计算237
15.7.2 按需调用238
15.7.3 懒惰程序的计算239
15.7.4 懒惰函数式程序的优化239
15.7.5 严格性分析241
推荐阅读243
程序设计:编译函数式语言244
习题244
第16章 多态类型246
16.1 参数多态性246
16.1.1 显式带类型的多态语言247
16.1.2 多态类型的检查248
16.2 类型推论253
16.2.1 一个隐式类型的多态语言254
16.2.2 类型推论算法255
16.2.3 递归的数据类型257
16.2.4 Hindley-Milner类型的能力259
16.3 多态变量的表示259
16.3.1 多态函数的扩展260
16.3.2 完全的装箱转换261
16.3.3 基于强制的表示分析262
16.3.4 将类型作为运行时参数传递264
16.4 静态重载的解决方法265
推荐阅读266
习题266
第17章 数据流分析269
17.1 流分析使用的中间表示270
17.2 各种数据流分析271
17.2.1 到达定值271
17.2.2 可用表达式273
17.2.3 到达表达式274
17.2.4 活跃分析274
17.3 使用数据流分析结果的几种274
转换274
17.3.1 公共子表达式删除274
17.3.2 常数传播275
17.3.3 复写传播275
17.3.4 死代码删除275
17.4 加快数据流分析276
17.4.1 位向量276
17.4.2 基本块276
17.4.3 结点排序277
17.4.4 使用-定值链和定值-使用链277
17.4.5 工作表算法278
17.4.6 增量式数据流分析278
17.5 别名分析281
17.5.1 基于类型的别名分析282
17.5.2 基于流的别名分析283
17.5.3 使用可能别名信息284
17.5.4 严格的纯函数式语言中的别名分析285
推荐阅读285
习题285
第18章 循环优化287
18.1 必经结点289
18.1.1 寻找必经结点的算法289
18.1.2 直接必经结点289
18.1.3 循环290
18.1.4 循环前置结点291
18.2 循环不变量计算292
18.3 归纳变量293
18.3.1 发现归纳变量294
18.3.2 强度削弱295
18.3.3 删除296
18.3.4 重写比较296
18.4 数组边界检查297
18.5 循环展开300
推荐阅读301
习题301
第19章 静态单赋值形式303
19.1 转化为SSA形式305
19.1.1 插入φ函数的标准306
19.1.2 必经结点边界306
19.1.3 插入φ函数308
19.1.4 变量重命名309
19.1.5 边分割310
19.2 必经结点树的高效计算310
19.2.1 深度优先生成树310
19.2.2 半必经结点311
19.2.3 Lengauer-Tarjan算法312
19.3 使用SSA的优化算法315
19.3.1 死代码删除315
19.3.2 简单的常数传播316
19.3.3 条件常数传播317
19.3.4 保持必经结点性质319
19.4 数组、指针和存储器320
19.5 控制依赖图321
19.6 从SSA形式转变回来323
19.7 函数式中间形式325
推荐阅读327
习题328
第20章 流水和调度331
20.1 没有资源约束时的循环调度332
20.2 有资源约束的循环流水336
20.2.1 模调度337
20.2.2 寻找最小的启动间距338
20.2.3 其他控制流340
20.2.4 编译器应该调度指令吗340
20.3 分支预测341
20.3.1 静态分支预测342
20.3.2 编译器应该预测分支吗342
推荐阅读343
习题343
第21章 存储层次346
21.1 cache的组织结构346
21.2 cache块对齐349
21.3 预取350
21.4 循环交换354
21.5 分块355
21.6 垃圾收集和存储层次357
推荐阅读358
习题358
附录Tiger语言参考手册360
参考文献368
索引376