内容简介 · · · · · ·
《自己动手写编译器、链接器》讲述了一个真实编译器的开发过程,源语言是以C语言为蓝本,进行适当简化定义的一门新语言,称之为SC语言(简化的C语言),目标语言是大家熟悉的Intelx86机器语言。在本书中,读者将看到从SC语言定义,到SCC编译器开发的完整过程。本书介绍的SCC编译器,没有借助Lex与Yacc这些编译器自动生成工具,纯手工编写而成,更便于学习和理解。为了生成可以直接运行EXE文件,本书还实现了一个链接器。读完本书读者将知道一门全新的语言如何定义,一个真实的编译器、链接器如何编写。
本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校编译原理课程的实践教材。
郑重声明:本书源代码作者已申请版权,仅供读者用于学习研究之目的。未经作者允许,严禁任何组织与个人将其在网络上传播或用于商业用途。对于侵权行为,作者保留提起法律诉讼的权利。源代码相关...
《自己动手写编译器、链接器》讲述了一个真实编译器的开发过程,源语言是以C语言为蓝本,进行适当简化定义的一门新语言,称之为SC语言(简化的C语言),目标语言是大家熟悉的Intelx86机器语言。在本书中,读者将看到从SC语言定义,到SCC编译器开发的完整过程。本书介绍的SCC编译器,没有借助Lex与Yacc这些编译器自动生成工具,纯手工编写而成,更便于学习和理解。为了生成可以直接运行EXE文件,本书还实现了一个链接器。读完本书读者将知道一门全新的语言如何定义,一个真实的编译器、链接器如何编写。
本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校编译原理课程的实践教材。
郑重声明:本书源代码作者已申请版权,仅供读者用于学习研究之目的。未经作者允许,严禁任何组织与个人将其在网络上传播或用于商业用途。对于侵权行为,作者保留提起法律诉讼的权利。源代码相关问题,请与作者联系。
自己动手写编译器、链接器的创作者
· · · · · ·
-
张宇 作者
目录 · · · · · ·
1.1 HelloWorld编译过程分析 1
1.1.1 HelloWorld程序源文件 1
1.1.2 词法分析 2
1.1.3 语法分析 3
1.1.4 语义分析 3
· · · · · · (更多)
1.1 HelloWorld编译过程分析 1
1.1.1 HelloWorld程序源文件 1
1.1.2 词法分析 2
1.1.3 语法分析 3
1.1.4 语义分析 3
1.1.5 链接器 4
1.2 SCC编译器简介 7
1.2.1 SCC编译器架构 7
1.2.2 SCC编译器开发环境 7
1.2.3 SCC编译器运行环境 8
第2章 文法知识 10
2.1 语言概述 10
2.2 形式语言 11
2.2.1 字母表和符号串 11
2.2.2 文法与语言的形式定义 12
2.2.3 文法与语言的类型 13
2.2.4 程序设计语言描述工具 15
2.3 词法分析方法 16
2.3.1 词法定义例举 17
2.3.2 状态转换图 17
2.3.3 词法分析程序流程图 17
2.4 语法分析方法 18
2.4.1 LL分析器 18
2.4.2 LL(k)文法 19
2.4.3 LL(1)文法 19
2.4.4 递归子程序法 21
2.4.5 文法的等价变换 24
第3章 SC语言定义 26
3.1 SC语言的蓝本选择 26
3.1.1 K&R C 26
3.1.2 C89 26
3.1.3 C99 27
3.2 SC语言对C89简化原则 27
3.3 SC语言的字符集 27
3.3.1 基本字符集 28
3.3.2 扩展字符集 28
3.4 SC语言词法定义 29
3.4.1 关键字 29
3.4.2 标识符 30
3.4.3 整数常量 31
3.4.4 字符常量 31
3.4.5 字符串常量 32
3.4.6 运算符及分隔符 32
3.4.7 注释 33
3.5 SC语言语法定义 33
3.5.1 外部定义 33
3.5.2 语句 35
3.5.3 表达式 39
3.6 SC语言与C语言功能对比 46
3.6.1 关键字 46
3.6.2 数据类型 46
3.6.3 存储类型 47
3.6.4 常量 47
3.6.5 变量 47
3.6.6 函数 48
3.6.7 语句 48
3.6.8 表达式 50
第4章 SC语言词法分析 52
4.1 词法分析任务的官方说法 52
4.2 单词编码 53
4.3 词法分析用到的数据结构 55
4.3.1 动态字符串 56
4.3.2 动态数组 58
4.3.3 哈希表 61
4.3.4 单词表 62
4.4 错误处理,未雨绸缪 67
4.5 词法分析过程 72
4.5.1 词法分析主程序 72
4.5.2 预处理 76
4.5.3 解析标识符 79
4.5.4 解析整数 80
4.5.5 解析字符串 80
4.5.6 词法分析流程图 82
4.6 词法着色 84
4.7 控制程序 85
4.8 词法分析成果展示 86
第5章 SC语言语法分析 87
5.1 外部定义 87
5.1.1 翻译单元 87
5.1.2 外部声明 88
5.1.3 类型区分符 90
5.1.4 结构区分符 92
5.1.5 函数调用约定 95
5.1.6 结构成员对齐 95
5.1.7 声明符 96
5.1.8 初值符 100
5.2 语句 101
5.2.1 复合语句 102
5.2.2 表达式语句 103
5.2.3 选择语句 104
5.2.4 循环语句 104
5.2.5 跳转语句 105
5.3 表达式 107
5.3.1 赋值表达式 108
5.3.2 相等类表达式 109
5.3.3 关系表达式 109
5.3.4 加减类表达式 110
5.3.5 乘除类表达式 111
5.3.6 一元表达式 112
5.3.7 后缀表达式 113
5.3.8 初值表达式 114
5.4 语法缩进 116
5.4.1 用到的全局变量及枚举 116
5.4.2 语法缩进程序 117
5.5 总控程序 118
5.6 成果展示 119
第6章 符号表 120
6.1 符号表简介 121
6.1.1 收集符号属性 121
6.1.2 语义的合法性检查 122
6.2 符号表用到的主要数据结构 123
6.2.1 栈结构 123
6.2.2 符号表结构 127
6.2.3 数据类型结构 132
6.2.4 存储类型 133
6.3 符号表的构造过程 134
6.3.1 外部声明 134
6.3.2 类型区分符 137
6.3.3 结构区分符 138
6.3.4 声明符 144
6.3.5 变量初始化 149
6.3.6 复合语句 150
6.3.7 sizeof表达式 150
6.3.8 初等表达式 152
6.4 控制程序 153
6.5 成果展示 155
第7章 生成COFF目标文件 157
7.1 COFF文件结构 157
7.1.1 基本概念 157
7.1.2 总体结构 158
7.1.3 COFF文件头 158
7.1.4 节头表 161
7.1.5 代码节内容 168
7.1.6 数据节与导入节内容 168
7.1.7 COFF符号表 169
7.1.8 COFF字符串表 173
7.1.9 COFF重定位信息 173
7.2 生成COFF目标文件 175
7.2.1 生成节表 176
7.2.2 生成符号表 178
7.2.3 生成重定位信息 182
7.2.4 生成目标文件 183
7.3 成果展示 185
第8章 x86机器语言 187
8.1 x86机器语言简介 187
8.2 通用指令格式 188
8.2.1 指令前缀 188
8.2.2 操作码 190
8.2.3 ModR/M字节 190
8.2.4 SIB字节 191
8.2.5 偏移量与立即数 193
8.3 x86寄存器 193
8.3.1 数据寄存器 193
8.3.2 变址寄存器 193
8.3.3 指针寄存器 194
8.3.4 段寄存器 194
8.3.5 指令指针寄存器 194
8.3.6 标志寄存器 195
8.4 指令参考 196
8.4.1 符号说明 196
8.4.2 数据传送指令 198
8.4.3 算术运算指令 200
8.4.4 逻辑运算指令 203
8.4.5 控制转移指令 205
8.4.6 串操作指令 208
8.4.7 处理器控制指令 208
8.5 生成x86机器语言 208
8.5.1 操作数栈 209
8.5.2 生成通用指令 210
8.5.3 生成数据传送指令 213
8.5.4 生成算术与逻辑运算指令 217
8.5.5 生成控制转移指令 221
8.5.6 寄存器使用 224
8.5.7 本章用到的全局变量 227
8.6 成果展示 227
第9章 SCC语义分析 229
9.1 外部定义 229
9.1.1 声明与函数定义 229
9.1.2 初值符 232
9.1.3 函数体 234
9.2 语句 237
9.2.1 表达式语句 237
9.2.2 选择语句 238
9.2.3 循环语句 239
9.2.4 跳转语句 241
9.3 表达式 244
9.3.1 赋值表达式 244
9.3.2 相等类表达式 245
9.3.3 关系表达式 246
9.3.4 加减类表达 248
9.3.5 乘除类表达式 249
9.3.6 一元表达式 250
9.3.7 后缀表达式 253
9.3.8 初值表达式 257
9.4 成果展示 259
第10章 链接器 261
10.1 链接方式与库文件 261
10.2 PE文件格式 263
10.2.1 总体结构 263
10.2.2 DOS部分 264
10.2.3 NT头 265
10.2.4 节头表 272
10.2.5 代码节 272
10.2.6 数据节 274
10.2.7 导入节 274
10.3 链接器代码实现 278
10.3.1 生成PE文件头 278
10.3.2 加载目标文件 281
10.3.3 加载引入库文件 282
10.3.4 解析外部符号 285
10.3.5 计算节区的RVA地址 288
10.3.6 重定位符号地址 291
10.3.7 修正需要重定位的地址 292
10.3.8 写PE文件 293
10.3.9 生成EXE文件 295
10.4 SCC编译器、链接器总控程序 297
10.5 成果展示 301
10.6 全书代码架构 302
第11章 SC语言程序开发 304
11.1 SC语言程序开发流程 304
11.2 SCC编译器测试程序 304
11.2.1 表达式测试 304
11.2.2 语句测试 308
11.2.3 结构体测试 310
11.2.4 函数参数传递测试 312
11.2.5 字符串测试 314
11.2.6 全局变量测试 315
11.3 语言举例 316
11.3.1 可接收命令行参数的控制台程序 316
11.3.2 可接收命令行参数的Win32应用程序 317
11.3.3 HelloWindows窗口程序 318
11.3.4 文件复制程序 323
11.3.5 九九乘法表 325
11.3.6 打印菱形 326
11.3.7 屏幕捕捉程序 328
参考文献 336
附录A SC语言文法定义中英文对照表 337
· · · · · · (收起)
喜欢读"自己动手写编译器、链接器"的人也喜欢 · · · · · ·
- 编译系统透视 7.4
- 两周自制脚本语言 8.5
- 自制编译器 8.1
- 深入理解并行编程 8.4
- 操作系统设计:Xinu方法 8.7
- 汇编语言 7.2
- TCP/IP高效编程 7.8
- 高级C/C++编译技术 7.3
自己动手写编译器、链接器的书评 · · · · · · ( 全部 4 条 )
还不错,源代码在VS2010已经编译通过了
这篇书评可能有关键情节透露
买到书后,没看到源代码光盘,就给出版社打电话,还好出版社给了源代码下载地址。现在源代码在VS2010已经编译通过了,源代码量并不是很大。书已经翻了一遍,读起来感觉比较轻松,印象比较深的是第二章,对编译原理知识的讲解有点意思,不像其他书那么刻板 (展开)中等评价的教材,优评的略读了解教材
这篇书评可能有关键情节透露
这本书说实话细看确实令我有点难受,就算是代码,细看的话会发现好多都在后面,而且很多东西感觉不是“自己的东西”,但是值得称赞的是这本书构建的词法表符号表使用数据结构是效率最高的了吧,由于我是出以学习COFF,PE文件结构为目的学的这本书,并且社团要求一个中期检查作... (展开)> 更多书评 4篇
以下书单推荐 · · · · · · ( 全部 )
- 技术常读书 (谢小漫)
- 2022要看的书 (谢小漫)
- 1# 16th (陶隐)
- 3## 中国原创IT力量 (陶隐)
- 生动学编程 (葡萄)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
- 在豆瓣转让 有234人想读,手里有一本闲着?
订阅关于自己动手写编译器、链接器的评论:
feed: rss 2.0
1 有用 lidon 2016-04-16 09:43:04
龙书偏重理论,这本书偏重实践,很喜欢这本书
1 有用 没法收的烂摊子 2017-03-17 09:54:36
VS2010编译提示警告,可以通过编译,但不能正常执行。看起来作者并没有很好的测试过代码,不像是花了六年时间写的书(也许是让学生写的代码?)。此书的另一位作者在序中只字未提,呵呵。建议别买。
0 有用 佚名 2019-01-15 10:22:46
词法分析和语法分析部分比较中规中矩,手写还不错. 语义分析部分很糟糕,直接使用的语法制导翻译,没有使用中间形态,从语法分析直接生成符号表和机器码,抽象程度非常高. 相比有ast和ir的多遍处理过程,这样的方式太难了,需要对后端机器码非常熟悉才行.
1 有用 chen_yiqun80 2015-07-07 18:13:36
市面上编译类书籍偏向于理论,实践类确实少,也许是工程好大!也许这本书会是编译器领域的 minix操作系统设计与实现!
1 有用 阅微草堂 2022-06-28 15:48:21
符号表和链接部分讲的特别好。作者的视频值得初学者听的----https://www.bilibili.com/video/BV11h411a7zq?p=6&vd_source=829e7e318824005fe97eb0868603ce57值得听一两遍!!书的内容和相对应的代码可以多研读,TCC代码和这里代码有部分重合。
1 有用 2023-09-27 15:47:22 广东
就会贴代码,彻头彻尾的垃圾,当厕纸都嫌硬!
1 有用 阅微草堂 2022-06-28 15:48:21
符号表和链接部分讲的特别好。作者的视频值得初学者听的----https://www.bilibili.com/video/BV11h411a7zq?p=6&vd_source=829e7e318824005fe97eb0868603ce57值得听一两遍!!书的内容和相对应的代码可以多研读,TCC代码和这里代码有部分重合。
0 有用 豆友181317479 2021-09-02 22:40:31
不错的实操模板,在源代码的基础上略加修改(改了半个月)完成了编译原理的课程设计(C艹版本),可惜后面的链接器部分理论知识不足,没法读懂。
0 有用 不想科研 2020-04-12 15:56:40
刚开始词法分析,语法分析,节的数据生成看的还可以,但是到后面的语义分析和gencode部分太抽象,不得已把代码down下来,一遍一遍跑自己写的test,跟踪函数... 花了两个月时间一天一两个小时,终于把所有代码都理解了。收获很大,但是由于其没有中间代码,这样的话导致在此基础上的优化很难搞...
0 有用 谢小漫 2019-08-12 17:17:25
终于看完,对于程序的编译原理和程序到底存储了什么东西,看完会有不错的体会,可以作为代码练习教程。后续重读一遍《程序员的自我修养》再来读其他编译相关的书籍。