编译系统透视 图解编译原理 内容简介
本书是编译原理领域的鸿篇巨著,中文版尚未出版,英文版权已经输出到美国,将在世界范围内产生重要影响。从以下多个角度讲,本书都具有重要的里程碑意义:
它让编译原理不再像是一门高深晦涩的“数学课”,而是一个可以调试、可以接触、可以真切感受的理论体系。本书用1140余幅信息量巨大的运行时结构图和视频动画取代了同类书中复杂枯燥的数学公式,更加立体和直观,生动地将编译后的执行程序在内存中的运行时结构图展现了出来;
它将GCC源代码、编译原理、运行时结构、编译系统原理(包含汇编与链接)的内在关系、逻辑与原理梳理清楚了,并将它们结合成一个整体。真正能够让读者透彻掌握编译器如何运行和如何设计,以及为什么要这么设计;
它是系统解读著名商用编译器GCC核心源代码的著作,GCC源代码一共有600万行,为了便于讲解和阅读,本书进行了取舍和裁剪,讲解了与编译本质相关的最核心的60万行代码。
全书一共8章,具体内容和逻辑如下:
第1章以一个C程序(先简单,后复杂)的运行时结构为依托,对程序编译的整体过程做了宏观讲述,让读者对编译有整体认识,这样更容易理解后面的内容。
第2~6章通过实际的程序案例、结合GCC的源代码,根据程序编译的顺序和流程,依次讲解了词法分析、语法分析、中间结构和目标代码的生成,遵循了由易到难的原则,先是通过简单程序讲解清楚原理,然后再通过复杂程序强化理解。
第7章讲解了与编译器紧密关联的汇编器和链接器,能让读者对可执行程序的最终生成有一个完整的了解。
第8章讲解了预处理,就编译器的执行顺序而言,预处理器的执行比较靠前,之所以放在*后讲,是因为它比较独立,在读者已经了解整个编译过程中之后再讲解,读者会更容易理解。
编译系统透视 图解编译原理 目录
前言
第1章 运行时结构及编译过程概述
1.1 一个简单C程序的运行时结构
1.2 更为复杂C程序的运行时结构
1.3 编译过程概述
第2章 词法分析
2.1 词法分析概要说明
2.2 词法分析过程
2.3 状态转换图
2.4 GCC实现词法分析的源代码
第3章 语法分析
3.1 语法分析综述
3.2 语法分析思路
3.3 产生式
3.4 匹配产生式,消除左递归
3.5 提取左公因子,消除回溯
3.6 语法分析结果:语法树
3.7 GCC关于语法分析的源代码解析
第4章 语法树到目标代码
4.1 总述语法树到中间代码的转化过程
4.2 目标代码到运行时结构的映射
4.3 语法树转高端gimple
4.4 高端gimple到低端gimple
4.5 低端gimple到cfg
4.6 cfg转ssa
4.7 生成RTL
4.8 RTL生成目标代码(汇编)
第5章 语句拓展案例的编译过程
5.1 总述各个语句拓展案例的编译过程
5.2 if语句的语法分析
5.3 带标号语句的语法分析
5.4 switch...case、goto、break语句的语法分析过程
5.5 do...while、while、for语句的语法分析过程
5.6 各种语句嵌套组合的语法分析过程
5.7 所有案例语法树转中间结构的过程
第6章 数据拓展案例的编译过程
6.1 数据拓展案例的编译过程总述
6.2 基础类型数据的语法分析过程
6.3 复合类型数据的语法分析过程
6.4 指针类型数据的语法分析过程
6.5 关于作用域和生存期的语法分析过程
6.6 表达式的语法分析过程
6.7 所有案例语法树转中间结构(RTL)的过程
第7章 汇编与链接
7.1 汇编器
7.2 链接器
第8章 预处理
8.1 文件包含
8.2 宏定义
8.3 条件编译
8.4 带参数的宏定义
附录 RTX定义
编译系统透视 图解编译原理 精彩文摘
为了让读者能更直观和更容易地理解本章的内容,我们针对本章内容精心制作了视频内容,感兴趣的读者可以扫描二维码观看和学习。
解决编程过程中的实际问题,需要透彻了解程序在内存中的运行时结构,而透彻的程度自然成为衡量计算机语言学习水平的重要标准,也成为衡量软件项目开发水平的重要标准。
C程序运行的核心是函数的执行和调用,它构成了整个C程序运行时结构的基础框架。这一运行过程主要是在程序指令的驱动以及数据压栈、清栈的支持下实现的。为了介绍这一过程,我们设计了一个简单C程序,如下所示:
int fun(int a,int b);
int m=10;
int main()
{
inti=4;
int j=5;
m = fun(i,j);
return 0;
}
int fun(int a,int b)
{
int c=0;
c=a+b;
return c;
}
程序很简单,却凸现了函数调用和执行的最基本情况。我们把此情景展现在内存中,共有三个区域,分别是代码区、静态数据区和动态数据区。情景如图1-1所示。
代码区装载了这个程序所对应的机器指令,main函数和fun函数的机器指令装载位置如图1-2所示。
全局变量m的数值装载在静态数据区中,情景如图1-3所示。
程序开始执行前,动态数据区中没有数据,情景如图1-4所示。
图1-2 main函数和fun函数在代码区的位置
这是因为,只有程序开始执行后,在指令的驱动下,这一区域才会产生数据,压栈和清栈的工作就是在这一区域完成的,情景如图1-5所示。
图1-3 全局变量m在静态数据区的位置
图1-4 动态数据区没有数据
程序执行的本质就是代码区的指令不断执行,驱使动态数据区和静态数据区产生数据变化。这一过程需要计算机的管控。下面我们着重介绍对代码区和动态数据区的管控。CPU中有三个寄存器,分别是eip、ebp和esp,情景如图1-6所示。
本文来自挽梦忆笙歌投稿,不代表电子书资源网立场,如若转载,请联系原作者获取。