本书以作者实现的一个基于Intelx86指令集的编译系统为例,结合程序代码的主要部分详细阐述了编译系统的实现原理和过程。本书对编译器、汇编器、链接器、编译优化器涉及的关键算法、数据结构和程序实现流程,以及ELF文件的格式、Intel指令格式均作了详细的说明,并结合大量的图表,展示了编译系统工作过程中代码信息的流动和存储格式的变化。是一本“手把手”教读者实现编译系统的贴心手册。
序
前言
第1章代码背后1
从编程聊起 1
历史渊源 2
GCC的工作流程 3
1.3.1预编译 4
1.3.2编译 5
1.3.3汇编 6
1.3.4链接 7
设计自己的编译系统 8
本章小结 9
第2章编译系统设计 11
2.1编译程序的设计 11
2.1.1词法分析 12
2.1.2语法分析 13
2.1.3符号表管理 14
2.1.4语义分析 15
2.1.5代码生成 16
2.1.6编译优化 16
2.2 x86指令格式 18
2.3 ELF文件格式 19
2.4汇编程序的设计 21
2.4.1汇编词法、语法分析 22
2.4.2表信息生成 23
2.4.3指令生成 24
2.5链接程序的设计 25
2.5.1地址空间分配 25
2.5.2符号解析 26
2.5.3重定位 27
2.6本章小结 27
第3章编译器构造 29
3.1词法分析 29
3.1.1扫描器 30
3.1.2词法记号 32
3.1.3有限自动机 36
3.1.4解析器 40
3.1.5错误处理 53
3.2语法分析 55
3.2.1文法定义 55
3.2.2递归下降子程序 65
3.2.3错误处理 70
3.3符号表管理 74
3.3.1符号表数据结构 75
3.3.2作用域管理 78
3.3.3变量管理 82
3.3.4函数管理 88
第4章编译优化147
第5章二进制表示191
第6章汇编器构造219
第7章连接器构造263
参考文献
爱因斯坦曾说过:“好奇心是科学工作者产生无穷的毅力和耐心的源泉。”
对于实现一个编译系统来说,打通编译、汇编和链接的全部流程确非易事。然而,当我满怀新奇地将问题抽丝剥茧,最终触及本质的那一刻,才体会到所有的坚持和努力都是值得的。那些抱着和我当初一样好奇心的人,想必也是为了解开心中长埋的疑惑而翻开此书的吧。从对程序语言在计算机上如何运行的不解,到看到自己设计的程序语言执行出正确结果的兴奋,也许只有好奇心才能驱使我们在这条看似枯燥的探索道路上一步一个脚印地走下去。最后套用一句名言:“Stay curious, Stay patient.”希望看到本书的人,能找到心中一直想要的答案。
——范志东
本书介绍编译器设计与实现中的理论和技术,对构造编译器的基本知识与关键技术进行了全新的讲解,受众主要是计算机相关专业的本科生和研究生,以及需要相关知识的程序员,也可以作为教师的参考书。这是近年来在该领域比较全面的一本专业书籍。
—— 葛永文
科锐安网络公司全球副总裁兼大中国区总裁
本书*大的亮点是它具有很强的应用性和可读性。作者不是从复杂深奥的计算机编译理论入手,而是在各个章节中使用有代表性的程序模块作为范例,将它们放入编译系统中运行以描述它们的编译过程,然后对代码和结果给出详细的诠释。 这就像对编译过程进行细致解剖一样。我相信本书会大大降低编译系统理解的门槛,提高读者对编译系统的兴趣。
—— 梁红卫
南京大学少年班本科
中科院自动化所硕士
佐治亚理工学院PHD
定居美国,现就职于Maxim 集成芯片公司
本书知识量很大,作者叙述清晰。基于作者完整实现编译系统的*一手经验和体会,本书集合了所有的主要步骤,对编译原理课堂项目的选题、编程具有非常好的借鉴作用。完整的可运行示例代码使得专注于编译系统的一个特定模块的课堂项目实践更加真实。本书将有力地促进编译原理的实践教学。
—— Jian Cheng (程坚)
CEO, Analytic Measures Inc., Palo Alto, California, USA
正如作者在前言中所言,这本书既能帮助读者在学习编译原理时通过阅读分析这些代码从而加深理解,也能让有兴趣的读者在此基础上进一步进行实践。即便对普通的计算机编程人员而言,通过本书也能了解到不同方面的东西。就我个人而言,虽然熟知优化过程中的那些概念,但*一次看到了那些方法的具体实现仍让我很高兴。尤其是寄存器分配一节,让我更加理解了程序的局部性原则。总之,这是一本值得拥有的好书。
—— 王晓云
前Nokia高级软件架构师