编译系统透视:图解编译原理
深入分析GCC 源码分析系列书籍 GCC设计与实现 GCC总体设计 代码架构
9787111556329 9787111498582
深入分析GCC
定价:¥99.00
基本信息
作者:王亚刚
丛书名:源码分析系列
出版社:机械工业出版社
ISBN:9787111556329
上架时间:2017-2-10
出版日期:2017 年2月
开本:16开
版次:1-1
所属分类: 计算机
编辑推荐
国内不可多得的全面系统介绍GCC设计与实现的书籍,对GCC的总体设计、主要代码架构及实现细节进行了深入的分析和总结本书结合GCC4 4.0源代码,围绕GCC编译过程,以GCC中的中间表示AST、GlMPLE及RTL为主线,为读者描述了一条从源代码到目标机器汇编代码的清晰路线图
目录
前言
第1章 GCC概述 1
1.1 GCC的产生与发展 1
1.2 GCC的特点 2
1.3 GCC代码分析 3
第2章 GCC源代码分析工具 4
2.1 vim+ctags代码阅读工具 4
2.2 GNU gdb调试工具 6
2.3 GNU binutils工具 8
2.4 shell工具及graphviz绘图工具 11
2.5 GCC调试选项 13
第3章 GCC总体结构 16
3.1 GCC的目录结构 16
3.2 GCC的逻辑结构 18
3.3 GCC源代码编译 20
3.3.1 配置 21
3.3.2 编译 23
3.3.3 安装 25
第4章 从源代码到AST/GENERIC 26
4.1 抽象语法树 26
4.2 树节点的声明 28
4.3 树节点结构 33
4.3.1 struct tree_base 35
4.3.2 struct tree_common 36
4.3.3 常量节点 38
4.3.4 标识符节点 42
4.3.5 声明节点 44
4.3.6 struct tree_decl_minimal 46
4.3.7 struct tree_decl_common 46
4.3.8 struct tree_field_decl 49
4.3.9 struct tree_decl_with_rtl 55
4.3.10 struct tree_label_decl 55
4.3.11 struct tree_result_decl 56
4.3.12 struct tree_const_decl 57
4.3.13 struct tree_parm_decl 57
4.3.14 struct tree_decl_with_vis 59
4.3.15 struct tree_var_decl 59
4.3.16 struct tree_decl_non_common 62
4.3.17 struct tree_function_decl 62
4.3.18 struct tree_type_decl 64
4.3.19 类型节点 67
4.3.20 tree_list节点 68
4.3.21 表达式节点 71
4.3.22 语句节点 73
4.3.23 其他树节点 75
4.4 AST输出及图示 76
4.5 AST的生成 83
4.5.1 词法分析 84
4.5.2 词法分析过程 90
4.5.3 语法分析 98
4.5.4 语法分析过程 99
4.5.5 c_parse_file 103
4.5.6 c_parser_translation_unit 105
4.5.7 c_parser_external_declaration 105
4.5.8 c_parser_declaration_or_fndef 107
4.5.9 c_parser_declspecs 112
4.6 小结 114
第5章 从AST/GENERIC到GIMPLE 115
5.1 GIMPLE 115
5.2 GIMPLE语句 119
5.3 GIMPLE的表示与存储 122
5.4 GIMPLE语句的操作数 128
5.5 GIMPLE语句序列的基本操作 132
5.6 GIMPLE的生成 135
5.6.1 gimplify_function_tree 136
5.6.2 gimplify_body 138
5.6.3 gimlify_parameters 139
5.6.4 gimplify_stmt 144
5.6.5 gimplify_expr 144
5.7 GIMPLE转换实例 157
5.7.1 BIND_EXPR节点的GIMPLE生成 158
5.7.2 STATEMENT_LIST_EXPR节点的GIMPLE生成 159
5.7.3 MODIFY_EXPR节点的GIMPLE生成 160
5.7.4 POSTINCREMENT_EXPR节点的GIMPLE生成 162
5.8 实例分析 172
5.9 小结 176
第6章 GIMPLE处理及其优化 177
6.1 GCC Pass 177
6.1.1 核心数据结构 177
6.1.2 Pass的类型 179
6.1.3 Pass链的初始化 182
6.1.4 Pass的执行 184
6.2 Pass列表 187
6.3 GIMPLE Pass实例 193
6.3.1 pass_remove_useless_stmts 193
6.3.2 pass_lower_cf 195
6.3.3 pass_build_cfg 197
6.3.4 pass_build_cgraph_edges 203
6.3.5 pass_build_ssa 205
6.3.6 pass_all_optimizations 206
6.3.7 pass_expand 207
6.4 小结 207
第7章 RTL 208
7.1 RTL中的对象类型 209
7.2 RTX_CODE 210
7.3 RTX类型 210
7.4 RTX输出格式 212
7.5 RTX操作数 213
7.6 RTX的机器模式 216
7.7 RTX的存储 219
7.8 RTX表达式 222
7.8.1 常量 225
7.8.2 寄存器和内存 227
7.8.3 算术运算 228
7.8.4 比较运算 230
7.8.5 副作用 230
7.9 IR-RTL 232
7.9.1 INSN 233
7.9.2 JUMP_INSN 234
7.9.3 CALL_INSN 235
7.9.4 BARRIER 235
7.9.5 CODE_LABEL 236
7.9.6 NOTE 237
7.10 小结 238
第8章 机器描述文件${target}.md 239
8.1 机器描述文件 240
8.2 指令模板 241
8.2.1 模板名称 242
8.2.2 RTL模板 246
8.2.3 条件 256
8.2.4 输出模板 256
8.2.5 属性 256
8.3 定义RTL序列 257
8.4 指令拆分 263
8.5 枚举器 266
8.5.1 mode枚举器 266
8.5.2 code枚举器 268
8.6 窥孔优化 269
8.6.1 define_peephole 269
8.6.2 define_peephole2 270
8.7 小结 271
第9章 机器描述文件${target}.[ch] 272
9.1 targetm 272
9.1.1 struct gcc_target的定义 273
9.1.2 targetm的初始化 277
9.2 编译驱动及选项 279
9.2.1 编译选项 280
9.2.2 SPEC语言及SPEC文件 281
9.2.3 机器相关的编译选项 285
9.3 存储布局 286
9.3.1 位顺序和字节顺序 286
9.3.2 类型宽度 287
9.3.3 机器模式提升 287
9.3.4 存储对齐 288
9.3.5 编程语言中数据类型的存储布局 289
9.4 寄存器使用 290
9.4.1 寄存器的基本描述 290
9.4.2 寄存器分配顺序 297
9.4.3 机器模式 298
9.4.4 寄存器类型 300
9.5 堆栈及函数调用规范描述 307
9.5.1 堆栈的基本特性 309
9.5.2 寄存器消除 313
9.5.3 函数栈帧的管理 315
9.5.4 参数传递 316
9.5.5 函数返回值 318
9.5.6 i386机器栈帧 318
9.6 寻址方式 325
9.7 汇编代码分区 326
9.8 定义输出的汇编语言 333
9.8.1 汇编代码文件的框架 333
9.8.2 数据输出 336
9.8.3 未初始化数据输出 336
9.8.4 标签输出 338
9.8.5 指令输出 342
9.9 机器描述信息的提取 343
9.9.1 gencode.c 347
9.9.2 genattr.c 348
9.9.3 genattrtab.c 348
9.9.4 genrecog.c 349
9.9.5 genflag.c 352
9.9.6 genemit.c 353
9.9.7 genextract.c 354
9.9.8 genopinit.c 356
9.9.9 genoutput.c 360
9.9.10 genpreds.c 362
9.9.11 其他 363
9.10 小结 364
第10章 从GIMPLE到RTL 365
10.1 GIMPLE序列 365
10.2 典型数据结构 366
10.3 RTL生成的基本过程 367
10.3.1 变量展开 370
10.3.2 参数及返回值处理 380
10.3.3 初始块的处理 395
10.3.4 基本块的RTL生成 398
10.3.5 退出块的处理 410
10.3.6 其他处理 411
10.4 GIMPLE语句转换成RTL 411
10.4.1 GIMPLE语句转换的一般过程 412
10.4.2 GIMPLE_GOTO语句的RTL生成 415
10.4.3 GIMPLE_ASSIGN语句的RTL生成 417
10.5 小结 432
第11章 RTL处理及优化 433
11.1 RTL处理过程 433
11.2 特殊虚拟寄存器的实例化 435
11.3 指令调度 437
11.3.1 指令调度算法 439
11.3.2 GCC指令调度的实现 440
11.3.3 指令调度实例1 442
11.3.4 指令调度实例2 459
11.4 统一寄存器分配 460
11.4.1 基本术语 461
11.4.2 寄存器分配的主要流程 463
11.4.3 代码分析 466
11.4.4 寄存器分配实例1 468
11.4.5 寄存器分配实例2 483
11.5 汇编代码生成 494
11.5.1 汇编代码文件的结构 495
11.5.2 从RTL到汇编代码 499
11.6 小结 502
第12章 支持新的目标处理器 503
12.1 GCC移植 503
12.2 PAAG处理器 504
12.2.1 PAAG处理器指令集 505
12.2.2 应用二进制接口 505
12.3 GCC移植的基本步骤 506
12.4 PAAG机器描述文件(paag.md) 507
12.5 paag.[ch]文件 512
12.5.1 存储布局 512
12.5.2 寄存器使用规范 513
12.5.3 堆栈布局及堆栈指针 514
12.5.4 函数调用规范 515
12.5.5 寻址方式 519
12.5.6 汇编代码输出 521
12.5.7 杂项 523
12.6 PAAG后端注册 523
12.7 GCC移植测试 524
12.8 小结 526
参考文献 527
索引 529
本书的出版具有里程碑意义:
它一次让编译原理不再像是一门高深晦涩的“数学课”,而是一个可以调试、可以接触、可以真切感受的理论体系。本书用1140余幅信息量巨大的运行时结构图和视频动画取代了同类书中复杂枯燥的数学公式,更加立体和直观,生动地将编译后的执行程序在内存中的运行时结构图展现了出来;
它一次将GCC源代码、编译原理、运行时结构、编译系统原理(包含汇编与链接)的内在关系、逻辑与原理梳理清楚了,并将它们结合成一个整体。真正能够让读者透彻掌握编译器如何运行和如何设计,以及为什么要这么设计;
它是一本系统解读著名商用编译器GCC核心源代码的著作,GCC源代码一共有600万行,为了便于讲解和阅读,本书进行了取舍和裁剪,讲解了与编译本质相关的核心的60万行代码。内容简介全书一共8章,具体内容和逻辑如下:
第1章以一个C程序(先简单,后复杂)的运行时结构为依托,对程序编译的整体过程做了宏观讲述,让读者对编译有整体认识,这样更容易理解后面的内容。
第2~6章通过实际的程序案例、结合GCC的源代码,根据程序编译的顺序和流程,依次讲解了词法分析、语法分析、中间结构和目标代码的生成,遵循了由易到难的原则,先是通过简单程序讲解清楚原理,然后再通过复杂程序强化理解。
第7章讲解了与编译器紧密关联的汇编器和链接器,能让读者对可执行程序的终生成有一个完整的了解。
第8章讲解了预处理,就编译器的执行顺序而言,预处理器的执行比较靠前,之所以放在后讲,是因为它比较独立,在读者已经了解整个编译过程中之后再讲解,读者会更容易理解。作者简介新设计团队阅读这套关于 GCC 编译系统的书籍,给我的感觉就像是在攀登一座知识的高峰,虽然过程充满了挑战,但每一步的攀登都让我视野更加开阔。作者以 GCC 这个庞大的开源项目为切入点,系统地梳理了从源代码到可执行文件的整个编译流程。这本书最让我赞叹的地方在于其“图解”的理念,那些精美的流程图和结构示意图,如同灯塔一般,指引着我在浩瀚的代码海洋中航行。很多时候,我会被某些复杂的编译概念所困扰,但只要翻到书中对应的图示,总能豁然开朗。而且,作者并没有停留在理论层面,而是深入到 GCC 的源码层面,带领读者一步步去剖析那些具体的实现细节。这种“源码分析”的方式,让我得以窥见一个成熟编译器背后精密的逻辑和巧妙的设计。我不再仅仅是使用编译器,而是开始真正理解它,甚至能够去思考如何利用这些底层知识来优化自己的代码。这本书的深度和广度,都远超我的预期,它为我提供了一个理解现代软件开发基石的绝佳视角。
评分坦白说,我拿到这套书的时候,是被它的厚度和“源码分析”几个字吸引的。作为一名有一定开发经验的程序员,我深知理解底层原理的重要性,但往往缺乏系统学习的途径。这套书的独特之处在于,它并非是纯粹的理论书籍,而是以 GCC 这个实际的、广泛使用的编译器为蓝本,带领读者一步步深入其内部的实现细节。我特别欣赏作者在讲解过程中,并没有生硬地堆砌各种技术术语,而是通过大量的插图和清晰的逻辑梳理,将抽象的编译过程变得直观易懂。比如,在讲解某些优化算法时,书中会用生动的图示来展示其工作流程,这比单纯的文字描述要有效得多。我甚至在阅读过程中,会对照着 GCC 的源码,去理解书中讲解的内容,这种“理论与实践相结合”的学习方式,极大地加深了我对编译原理的理解。这套书让我看到了一个强大而复杂的软件是如何诞生的,也让我对自己所编写的代码,有了更深层次的认识。
评分我一直认为,要真正掌握一门编程语言,就必须理解其背后的编译过程。很多人在学习 C/C++ 时,往往止步于语法和标准库的使用,而忽略了将源代码转化为可执行文件的关键环节。这套书,正是我一直在寻找的“最后一公里”的钥匙。它以 GCC 这个事实上的行业标准为载体,深入浅出地揭示了编译的整个生命周期。我曾经尝试阅读 GCC 的官方文档,但其庞杂的内容和专业术语让我望而却步。然而,这套书通过精心的组织和丰富的图解,将这些复杂的技术细节变得易于理解。特别是关于代码生成和优化的部分,我以前只知道有一些优化手段,但具体是如何实现的,却是一头雾水。这本书通过剖析 GCC 的源码,让我看到了这些优化背后的具体算法和实现思路,这对于我编写更高效的代码,具有非常直接的指导意义。我甚至开始尝试着去修改一些编译器的参数,去观察代码性能的变化,这种主动学习和实践的乐趣,是其他技术书籍难以给予的。
评分作为一名在软件开发一线摸爬滚打了多年的工程师,我一直深感自己对编译器的理解仍停留在“知其然,不知其所以然”的层面。市面上关于编译原理的书籍有很多,但真正能够触及核心,并且足够详尽的却屈指可数。这套《深入分析GCC+编译系统透视:图解编译原理 2本 源码分析系列书籍》,可以说是给了我一个巨大的惊喜。它不仅仅是理论的堆砌,更是将 GCC 这个庞大且成熟的编译器,进行了系统性的解剖。作者并没有回避复杂的细节,而是迎难而上,通过翔实的源码分析,将 GCC 的内部构造一一呈现在读者面前。那些曾经让我困惑不解的编译过程,比如各种优化策略是如何实现的,链接器是如何工作的,在书中都得到了清晰的解答。我特别喜欢书中大量的图示,它们就像是通往复杂代码迷宫的地图,指引着我一步步深入。阅读的过程,更像是一场和 GCC 源码的深度对话,我能够感受到作者在梳理和呈现这些复杂知识时的良苦用心。对于任何想要提升自己代码性能、理解语言特性背后原理的开发者而言,这本书的价值是无法估量的。
评分这本书的厚度就足以让人望而却步,但当我翻开第一页,就被作者流畅的叙事和清晰的图示深深吸引。我一直对编译原理这个领域有着浓厚的兴趣,但市面上很多书籍要么过于晦涩难懂,要么流于表面,难以深入。而这套书,恰恰弥补了这一空白。作者以 GCC 为切入点,层层剥茧,将一个庞大而复杂的编译过程,分解成一个个易于理解的模块。从词法分析到语义分析,再到代码生成和优化,每一个环节都被作者细致入微地讲解,并且辅以大量的源码片段和流程图,让抽象的概念变得触手可及。尤其让我印象深刻的是,书中并没有简单地罗列知识点,而是通过对 GCC 实际源码的剖析,展示了这些原理是如何在真实的代码中实现的。这种理论与实践相结合的方式,让我受益匪浅。我仿佛置身于一个巨大的精密机械车间,亲眼见证着源代码如何一步步被转化成机器可执行的指令,这种成就感是任何其他方式都无法比拟的。对于我这样希望深入理解 C/C++ 语言底层运作机制的开发者来说,这本书无疑是打开了新世界的大门。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.coffeedeals.club All Rights Reserved. 静流书站 版权所有