出版社:机械工业出版社
年代:2015
定价:129.0
第1章的前半部分首先讲解程序的运行时结构。编译器正是将源代码转化为可执行程序并形成运行时结构的工具。对于只是想提高开发能力的程序员,这部分几乎起到了90%的作用。第1章的后半部分对整体的编译过程做了一个综述。当读者对整体有概念的时候,再去看每个章节的具体内容,会更容易理解。第2章用一个简单案例讲解词法分析,词法分析是把源文件文件中的内容读出并识别出符号的过程。第3章用词法分析的简单案例讲解语法分析,语法分析是在词法分析的结果中识别出语句的过程。第4章仍用前面的简单案例生成中间结构及目标代码。第5、6章用几个更为复杂的案例来分析语法及生成中间结构及目标代码的过程。至此,严格意义上的编译过程已经讲解完毕。为了让读者对可执行程序的最终生成有一个完整的了解,我们专门安排了讲解汇编器、链接器的内容,这就是第7章。第7章详细讲解如何将目标代码转变为可执行程序,包括文件格式、汇编器和链接器的内容。第8章讲预处理,从编译器的执行顺序来看,预处理器的执行是比较靠前的,之所以把预处理放在最后讲,是因为预处理比较独立,在读者已经了解整个编译过程中之后再讲解,会更容易理解。
作者简介
前 言
第1章 运行时结构及编译过程概述 1
1.1 一个简单C程序的运行时结构 1
1.2 更为复杂C程序的运行时结构 16
1.3 编译过程概述 25
1.3.1 词法分析 25
1.3.2 语法分析 26
1.3.3 从语法树到中间代码再到目标代码 26
第2章 词法分析 28
2.1 词法分析概要说明 28
2.2 词法分析过程 31
2.3 状态转换图 36
2.3.1 状态转换图总体介绍 36
2.3.2 依托状态转换图展现词法分析过程 42
2.4 GCC实现词法分析的源代码 55
2.4.1 词法分析源代码总览 55
2.4.2 结合GCC源代码讲解词法分析过程 55
2.4.3 标识符、数字、字符和字符串的详细分析过程 65
第3章 语法分析 74
3.1 语法分析综述 74
3.2 语法分析思路 74
3.3 产生式 78
3.3.1 什么是产生式 78
3.3.2 产生式的具体示例 80
3.4 匹配产生式,消除左递归 89
3.4.1 用标准产生式做匹配,出现左递归 89
3.4.2 消除左递归 93
3.4.3 产生式的工作效率 97
3.5 提取左公因子,消除回溯 100
3.5.1 对“直接声明符”的产生式提取左公因子 100
3.5.2 用提取过左公因子的产生式再去匹配 102
3.5.3 对其他产生式都提取左公因子 103
3.5.4 函数声明和定义两部分产生式的合并 105
3.6 语法分析结果:语法树 107
3.7 GCC关于语法分析的源代码解析 112
3.7.1 GCC语法分析函数调用图 112
3.7.2 全部语句的语法分析 115
第4章 语法树到目标代码 217
4.1 总述语法树到中间代码的转化过程 217
4.2 目标代码到运行时结构的映射 224
4.3 语法树转高端gimple 232
4.3.1 语法树到高端gimple的总体步骤及运行时 236
4.3.2 高端gimple的实际数据结构 241
4.3.3 语法树转高端gimple的GCC源代码解析 246
4.4 高端gimple到低端gimple 286
4.4.1 高端gimple转低端gimple概述 286
4.4.2 高端gimple转化低端gimple的GCC代码解析 293
4.5 低端gimple到cfg 297
4.5.1 低端gimple到cfg的转化概述 297
4.5.2 低端gimple转cfg的实际过程 300
4.6 cfg转ssa 301
4.7 生成RTL 305
4.7.1 为何要有RTL 305
4.7.2 转化RTL阶段的主要步骤 306
4.7.3 确定初始RTL中的运行时信息 320
4.8 RTL生成目标代码(汇编) 332
4.8.1 汇编文件介绍 332
4.8.2 创建汇编文件 334
4.8.3 输出汇编文件总入口 334
4.8.4 全局变量写入汇编文件 335
4.8.5 函数写入汇编文件 340
第5章 语句拓展案例的编译过程 353
5.1 总述各个语句拓展案例的编译过程 353
5.2 if语句的语法分析 376
5.2.1 多个变量的声明语句语法分析 376
5.2.2 if语句的语法分析过程 381
5.2.3 if...else if语句的语法分析过程 387
5.3 带标号语句的语法分析 395
5.4 switch...case、goto、break语句的语法分析过程 399
5.4.1 switch...case 语句 399
5.4.2 goto语句 407
5.4.3 分析break语句 409
5.5 do...while、while、for语句的语法分析过程 420
5.5.1 do...while语句的语法分析 424
5.5.2 while语句的语法分析过程 433
5.5.3 for语句的语法分析过程 444
5.6 各种语句嵌套组合的语法分析过程 472
5.6.1 两条变量声明语句分析的结果 477
5.6.2 分析while循环语句 477
5.6.3 进入if进行分析 480
5.6.4 进入else进行分析 485
5.7 所有案例语法树转中间结构的过程 516
5.7.1 案例1的语法树转高端gimple的总体介绍 516
5.7.2 案例1的语法树转高端gimple的代码分析 528
5.7.3 案例1的高端gimple转低端gimple 552
5.7.4 案例1的低端gimple到cfg 552
5.7.5 转化RTL阶段的主要步骤 562
5.7.6 案例2的语法树转高端gimple 587
5.7.7 案例3的语法树转高端gimple 596
第6章 数据拓展案例的编译过程 612
6.1 数据拓展案例的编译过程总述 612
6.1.1 基础类型数据总述 612
6.1.2 用户自定义类型数据总述 617
6.1.3 指针类型数据总述 626
6.1.4 作用域和生存期总述 640
6.1.5 表达式总述 645
6.2 基础类型数据的语法分析过程 652
6.2.1 非浮点型数据的语法分析 653
6.2.2 浮点型数据的语法分析 662
6.3 复合类型数据的语法分析过程 670
6.3.1 数组的语法分析 670
6.3.2 枚举类型数据的语法分析 675
6.3.3 struct类型数据的语法分析 678
6.3.4 union类型数据的语法分析 683
6.3.5 自定义数据声明和使用的语法分析 684
6.4 指针类型数据的语法分析过程 693
6.4.1 对swap_point函数中指针的语法分析 693
6.4.2 对指针使用的语法分析 696
6.5 关于作用域和生存期的语法分析过程 705
6.5.1 C语言作用域和生存期概述 705
6.5.2 全局变量data语法分析中作用域相关处理过程 706
6.5.3 fun函数定义的语法分析中作用域相关处理 709
6.5.4 main函数定义中局部变量声明data作用域处理过程 716
6.5.5 main函数内部语句块中变量nCount作用域处理过程 719
6.5.6 main函数中引用变量data时选择相应声明节点的过程分析 719
6.5.7 main函数中引用变量nCount时选择相应声明节点的过程分析 720
6.5.8 main函数中退出内部语句块时更新变量作用域过程分析 721
6.5.9 fun函数中静态变量temp生存期信息的语法分析 726
6.6 表达式的语法分析过程 728
6.6.1 if条件中的表达式语法分析 728
6.6.2 if条件下面“语句”部分的表达式语法分析 740
6.7 所有案例语法树转中间结构(RTL)的过程 754
6.7.1 基础类型数据语法树转高端gimple的过程 754
6.7.2 用户自定义数据语法树转高端gimple的过程 794
6.7.3 指针类型数据语法树转高端gimple的过程 838
6.7.4 作用域和生存期案例语法树转高端gimple的过程 878
6.7.5 复杂表达式案例的语法树转高端gimple的过程 887
第7章 汇编与链接 934
7.1 汇编器 934
7.1.1 详细介绍汇编指令到机器指令的转化 934
7.1.2 .o文件格式总体情况介绍 953
7.1.3 代码段、数据段以及其他各个表项间的关系 962
7.1.4 从汇编文件到目标文件的实现 967
7.1.5 汇编器处理的源代码分析 973
7.2 链接器 985
7.2.1 .o文件链接总体介绍 985
7.2.2 多个.o文件链接时通过符号表建立关系 989
7.2.3 链接时统一计算地址并回填 997
7.2.4 链接器源代码介绍 999
7.2.5 库函数的链接 1002
7.2.6 动态链接 1002
第8章 预处理 1012
8.1 文件包含 1012
8.2 宏定义 1017
8.3 条件编译 1019
8.4 带参数的宏定义 1022
附录 RTX定义 1031
作者的话 1039
全书一共8章,具体内容和逻辑如下:
第1章以一个C程序(先简单,后复杂)的运行时结构为依托,对程序编译的整体过程做了宏观讲述,让读者对编译有整体认识,这样更容易理解后面的内容。
第2~6章通过实际的程序案例、结合GCC的源代码,根据程序编译的顺序和流程,依次讲解了词法分析、语法分析、中间结构和目标代码的生成,遵循了由易到难的原则,先是通过简单程序讲解清楚原理,然后再通过复杂程序强化理解。
第7章讲解了与编译器紧密关联的汇编器和链接器,能让读者对可执行程序的最终生成有一个完整的了解。
第8章讲解了预处理,就编译器的执行顺序而言,预处理器的执行比较靠前,之所以放在最后讲,是因为它比较独立,在读者已经了解整个编译过程中之后再讲解,读者会更容易理解。
本书的出版具有里程碑意义:
它第一次让编译原理不再像是一门高深晦涩的“数学课”,而是一个可以调试、可以接触、可以真切感受的理论体系。本书用1140余幅信息量巨大的运行时结构图和视频动画取代了同类书中复杂枯燥的数学公式,更加立体和直观,生动地将编译后的执行程序在内存中的运行时结构图展现了出来;
它第一次将GCC源代码、编译原理、运行时结构、编译系统原理(包含汇编与链接)的内在关系、逻辑与原理梳理清楚了,并将它们结合成一个整体。真正能够让读者透彻掌握编译器如何运行和如何设计,以及为什么要这么设计;
它是第一本系统解读著名商用编译器GCC核心源代码的著作,GCC源代码一共有600万行,为了便于讲解和阅读,本书进行了取舍和裁剪,讲解了与编译本质相关的核心的60万行代码。
书籍详细信息 | |||
书名 | 编译系统透视站内查询相似图书 | ||
丛书名 | 华章原创精品 | ||
9787111498582 如需购买下载《编译系统透视》pdf扫描版电子书或查询更多相关信息,请直接复制isbn,搜索即可全网搜索该ISBN | |||
出版地 | 北京 | 出版单位 | 机械工业出版社 |
版次 | 1版 | 印次 | 1 |
定价(元) | 129.0 | 语种 | 简体中文 |
尺寸 | 22 × 28 | 装帧 | 平装 |
页数 | 400 | 印数 | 3500 |
范志东, 张琼声, 著
何炎祥, 陈勇, 著
(美) 费希尔 (Fischer,C.N.) , (美) 赛特朗 (Cytron,R.K.) , (美) 莱比兰克 (LeBlanc,Jr.) , 著
何炎祥, 吴伟, 著
胡延忠, 刘建舟, 林姗, 编著
刘铭, 等编著
陈英, 陈朔鹰, 主编
(美) 阿霍 (Alfred,V.A.) 等, 著
蒋伟进, 主编