自己动手写编译器、链接器

自己动手写编译器、链接器 pdf epub mobi txt 电子书 下载 2026

出版者:清华大学出版社
作者:王博俊
出品人:
页数:0
译者:
出版时间:2015-1-1
价格:37.80
装帧:平装
isbn号码:9787302381365
丛书系列:
图书标签:
  • 编译原理
  • 编译器
  • 计算机科学
  • 编译
  • C/C++
  • 计算机
  • 链接
  • 连接器
  • 编译器
  • 链接器
  • 编程
  • 计算机科学
  • 软件开发
  • 底层原理
  • 代码生成
  • 目标文件
  • 汇编语言
  • 系统编程
想要找书就要到 小哈图书下载中心
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

《自己动手写编译器、链接器》讲述了一个真实编译器的开发过程,源语言是以C语言为蓝本,进行适当简化定义的一门新语言,称之为SC语言(简化的C语言),目标语言是大家熟悉的Intelx86机器语言。在本书中,读者将看到从SC语言定义,到SCC编译器开发的完整过程。本书介绍的SCC编译器,没有借助Lex与Yacc这些编译器自动生成工具,纯手工编写而成,更便于学习和理解。为了生成可以直接运行EXE文件,本书还实现了一个链接器。读完本书读者将知道一门全新的语言如何定义,一个真实的编译器、链接器如何编写。

本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校编译原理课程的实践教材。

郑重声明:本书源代码作者已申请版权,仅供读者用于学习研究之目的。未经作者允许,严禁任何组织与个人将其在网络上传播或用于商业用途。对于侵权行为,作者保留提起法律诉讼的权利。源代码相关问题,请与作者联系。

作者简介

目录信息

第1章 引言 1
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
· · · · · · (收起)

读后感

评分

书中有几个函数没有给出具体的实现,需要自行填补,部分指针没有初始化造成编译程序的崩溃,但是总体上通俗易懂,适合入门自行学习。在WINDOWS下编写可使用较新的编译器,由于代码书写在vc6.0环境下,在改写过程中能比较好的发现问题.

评分

评分

评分

书中有几个函数没有给出具体的实现,需要自行填补,部分指针没有初始化造成编译程序的崩溃,但是总体上通俗易懂,适合入门自行学习。在WINDOWS下编写可使用较新的编译器,由于代码书写在vc6.0环境下,在改写过程中能比较好的发现问题.

评分

书中有几个函数没有给出具体的实现,需要自行填补,部分指针没有初始化造成编译程序的崩溃,但是总体上通俗易懂,适合入门自行学习。在WINDOWS下编写可使用较新的编译器,由于代码书写在vc6.0环境下,在改写过程中能比较好的发现问题.

用户评价

评分

翻开这本书,我的第一印象是它是否能真正触及现代软件开发的核心痛点。在这个充斥着高层抽象框架的时代,深入理解编译器和链接器的工作机制,犹如掌握了内功心法。我期望看到作者能将理论知识与最新的技术趋势相结合,比如如何处理多核架构下的代码优化,或者面对新型内存模型的挑战。如果书中能对不同的目标架构(比如x86、ARM)进行对比分析,讲解编译器后端如何针对特定硬件生成高效代码,那将极大地提升其实用价值。对于链接器,我希望它能详尽解释重定位表的构造、GOT/PLT的机制,以及如何处理复杂的依赖关系。这本书的成功与否,很大程度上取决于它能否在保持学术严谨性的同时,保持面向读者的实用性,提供可操作的步骤和清晰的流程图,让那些有志于深入系统层面的工程师们能够真正“玩转”这些基础工具。

评分

这本书的标题着实吸引人,它承诺了一场关于计算机底层构建的深度探险。我期待的这本书应当是一本详尽、实用的指南,能够带领读者从零开始,亲手搭建起一个能够理解和执行程序的工具链。我希望看到对编译器设计原理的清晰阐述,比如词法分析、语法分析、语义分析和代码生成的各个阶段,它们是如何协同工作,将高级语言转化为机器可读的指令。理想情况下,作者会用深入浅出的方式,结合具体的编程语言示例,展示如何实现一个功能完备的解析器和优化器。同时,对于链接器部分,我期待它能揭示符号解析、地址重定位、静态链接与动态链接之间的核心区别和技术细节,这对于理解程序如何被加载和运行至关重要。这本书如果能提供足够多的代码实例和调试技巧,让读者在实践中遇到问题时能找到方向,那它将是一本真正的“案头宝典”。我尤其看重那种能够激发读者对底层原理好奇心的叙述方式,而不是干巴巴的理论堆砌。

评分

坦白讲,我对这类“动手实践”的书籍总是抱持着一种审慎的期待。真正好的实践指南,绝不仅仅是“如何做”的流水账,它更应该解释“为什么必须这么做”。我希望这本书能深入剖析编译器设计中那些经典的权衡取舍(Trade-offs),比如速度与体积的矛盾、安全与性能的博弈。例如,在描述中间表示(IR)时,它是否能清晰地展示不同IR如何影响后续的优化阶段?在链接器的部分,我希望能看到关于链接时代码生成(LTO)的讨论,以及它如何改变传统的链接流程。如果作者能够提供一套完整的、可编译的小型语言环境作为贯穿全书的案例,让读者每学完一个章节,就能看到自己项目的一部分功能得以实现,那无疑是极佳的学习体验。这需要作者对教学法有深刻的理解,能够将复杂的概念分解成易于消化的模块。

评分

作为一名对系统编程有浓厚兴趣的学习者,我非常看重这种自底向上构建复杂系统的体验。这本书如果能成功,它应该能填补市面上许多教材中理论有余而实践不足的空白。我特别关注其在错误处理和调试方面的论述。编译器和链接器是公认的调试“黑洞”,如果书中能提供一套系统性的方法来诊断如“未定义引用”、“栈溢出”、“指令编码错误”等棘手问题,并解释这些错误在编译/链接流程中的具体位置,那价值将不可估量。此外,对于编译器前端的LLVM等现代基础设施的引用和应用,也是检验其是否与时俱进的标准之一。我期待看到的是,读者读完后不仅能“写”出一个编译器,更能“理解”现有工业级工具链的内在逻辑。

评分

这本书的潜力在于它能够培养一种构建者的思维模式。我希望它不仅仅是关于语法和指令集的罗列,而是关于设计哲学和工程决策的讨论。例如,在设计自己的汇编器时,如何选择合适的指令集表示?在设计运行时环境时,内存管理策略如何影响链接器的输出?我期待看到作者能就某些设计选择进行深入的辩论,展示不同路径的优劣。如果书中能巧妙地穿插一些历史典故或经典论文的解读,阐明某些设计理念是如何演变而来的,那会让阅读过程更加丰富。最终,我希望这本书能成为一个坚实的垫脚石,让读者有信心去修改、扩展甚至设计全新的语言处理工具,而不仅仅是照猫画虎地复制书中的代码。

评分

#读万卷书行万里路# 很喜欢正文前的引言。 “纸上得来终觉浅,觉知此事要躬行”。

评分

感谢它拯救了我的解释器实践课。 如果有配套讲解视频更佳啊。

评分

作者邮箱居然只会自动回复。高冷干脆不留邮箱啊,浪费我写邮件的时间。这样的书本来就比较小众,会给作者写邮件的大概少之又少。懒得写了,一星不能再多。 -------------------------------------------------------------------------------------------------------// 更新:作者王先生专门回复了,再次感谢王先生。好书,好作者。为我的浅薄道歉。

评分

词法分析和语法分析部分比较中规中矩,手写还不错. 语义分析部分很糟糕,直接使用的语法制导翻译,没有使用中间形态,从语法分析直接生成符号表和机器码,抽象程度非常高. 相比有ast和ir的多遍处理过程,这样的方式太难了,需要对后端机器码非常熟悉才行.

评分

上学期上的编译原理课,感觉学的很枯燥,理论很空洞。在图书馆也看了其它一些编译方面的书,没找到特别合适的编译器实验方面的书。这本书拿一个完整编译器来讲,称得上手把手来教写编译器,感觉很过瘾,也逐步理解编译原理讲的内容怎么应用了。

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2026 qciss.net All Rights Reserved. 小哈图书下载中心 版权所有