具体描述
LLVM是一个世界领先水平的编译器框架。它包含有丰富软件库,可以为编译器的初学者提供良好的学习体验,并大大降低编译器开发的学习门槛。
本书的前半部分将向您介绍怎么样去配置、构建、和安装LLVM的不同软件库、工具和外部项目。接下来,本书的后半部分将向您介绍LLVM的各种设计细节,并逐步地讲解LLVM的各个编译步骤:前段、中间表示(IR)、后端、即时编译(JIT)引擎、跨平台编译和插件接口。本书包含有大量翔实的示例和代码片段,以帮助读者平稳顺利的掌握LLVM的编译器开发环境。
作者简介
布鲁诺·卡多索·洛佩斯(Bruno Cardoso Lopes)在巴西坎皮纳斯大学获得计算机科学博士学位。自2007年以来,他一直是LLVM的贡献者,从头开始实现MIPS后端,并且已经维护了几年。另外,他还编写了x86 AVX支持方案,并改进了ARM汇编器。他的研究兴趣包括代码压缩技术和对ISA进行位宽压缩。之前他还开发了Linux和FreeBSD操作系统的驱动程序。
拉斐尔·奥勒(Rafael Auler)是巴西坎皮纳斯大学的博士生,并拥有该大学计算机科学硕士学位和计算机工程学士学位。在作为硕士生期间,他编写了一个可以根据体系结构描述文件自动生成LLVM后端的概念验证工具。目前,他的博士研究课题包括动态二进制翻译、即时编译器和计算机体系结构。 Rafael还是微软研究院2013年研究生研究奖学金获得者。
目录信息
译者序
前言
关于作者
关于审稿人
第1章 构建和安装LLVM 1
1.1 了解LLVM版本 1
1.2 获取预构建包 2
1.2.1 获取官方预构建二进制文件 2
1.2.2 使用软件包管理器 3
1.3 从源代码构建 4
1.3.1 系统要求 4
1.3.2 获取源代码 4
1.3.3 构建和安装LLVM 5
1.3.4 Windows和Microsoft Visual Studio 10
1.3.5 Mac OS X和Xcode 12
1.4 总结 14
第2章 外部项目 15
2.1 Clang外部项目介绍 15
2.1.1 构建和安装Clang外部工具 16
2.1.2 理解Compiler-RT 17
2.1.3 实验Compiler-RT 17
2.2 使用DragonEgg插件 18
2.2.1 构建DragonEgg 19
2.2.2 使用DragonEgg和LLVM工具了解编译流程 19
2.2.3 理解LLVM测试套件 20
2.2.4 使用LLDB 21
2.2.5 libc++标准库介绍 23
2.3 总结 25
第3章 工具和设计 26
3.1 LLVM的基本设计原理及其历史 26
3.2 理解目前的LLVM 27
3.3 与编译器驱动程序交互 29
3.4 使用独立工具 30
3.5 深入LLVM内部设计 33
3.5.1 了解LLVM的基本库 33
3.5.2 介绍LLVM的C++惯例 34
3.5.3 演示可插拔的流程接口 37
3.6 编写你的第一个LLVM项目 38
3.6.1 编写Makefile 38
3.6.2 编写代码 40
3.7 关于LLVM源代码的一般建议 41
3.7.1 将代码理解为文档 42
3.7.2 请求社区的帮助 42
3.7.3 应对更新:使用SVN日志作为文档 42
3.7.4 结束语 44
3.8 总结 44
第4章 前端 45
4.1 Clang简介 45
4.1.1 前端操作 46
4.1.2 库 47
4.1.3 理解Clang诊断 49
4.2 Clang前端阶段介绍 52
4.2.1 词法分析 52
4.2.2 语法分析 58
4.2.3 语义分析 63
4.2.4 生成LLVM IR代码 65
4.3 完整的例子 65
4.4 总结 68
第5章 LLVM中间表示 69
5.1 概述 69
5.2 操作IR格式的基本工具示例 71
5.3 LLVM IR语法介绍 71
5.4 编写自定义的LLVM IR生成器 76
5.4.1 构建和运行IR生成器 79
5.4.2 使用C++后端编写代码来生成IR构造 80
5.5 在IR层执行优化 80
5.5.1 编译时优化和链接时优化 80
5.5.2 发现最佳编译器流程 82
5.5.3 流程间的依赖关系 83
5.5.4 了解流程API 85
5.5.5 自定义流程 85
5.6 总结 89
第6章 后端 90
6.1 概述 90
6.2 后端代码结构介绍 92
6.3 后端库介绍 93
6.4 如何使用TableGen实现LLVM后端 94
6.4.1 TableGen语言 95
6.4.2 代码生成器.td文件介绍 96
6.5 指令选择阶段介绍 100
6.5.1 SelectionDAG类 100
6.5.2 降级 102
6.5.3 DAG合并以及合法化 103
6.5.4 DAG到DAG指令选择 104
6.5.5 指令选择过程可视化 107
6.5.6 快速指令选择 107
6.6 调度器 107
6.6.1 指令执行进程表 108
6.6.2 竞争检测 109
6.6.3 调度单元 109
6.7 机器指令 109
6.8 寄存器分配 110
6.8.1 寄存器合并器 111
6.8.2 虚拟寄存器重写 114
6.8.3 编译目标的信息 115
6.9 前序代码和结束代码 116
6.10 机器代码框架介绍 116
6.10.1 MC指令 116
6.10.2 代码输出 117
6.11 自定义机器流程 119
6.12 总结 121
第7章 即时编译器 122
7.1 LLVM JIT引擎的基础知识介绍 122
7.1.1 介绍执行引擎 123
7.1.2 内存管理 124
7.2 llvm::JIT框架介绍 124
7.2.1 将二进制大对象写入内存 125
7.2.2 使用JITMemoryManager 125
7.2.3 目标代码输出器 125
7.2.4 目标信息 127
7.2.5 学习如何使用JIT类 127
7.3 llvm::MCJIT框架介绍 131
7.3.1 MCJIT引擎 131
7.3.2 MCJIT中模块编译过程 132
7.3.3 使用MCJIT引擎 135
7.4 使用LLVM JIT编译工具 137
7.4.1 使用lli工具 137
7.4.2 使用llvm-rtdyld工具 138
7.5 其他资源 139
7.6 总结 139
第8章 跨平台编译 140
8.1 GCC和LLVM对比 140
8.2 目标三元组介绍 141
8.3 准备自己的工具链 142
8.3.1 标准C/C++库 143
8.3.2 运行时库 143
8.3.3 汇编器和链接器 144
8.3.4 Clang前端 144
8.4 用Clang命令行参数进行交叉编译 145
8.4.1 针对目标的驱动程序选项 145
8.4.2 依赖包 145
8.4.3 交叉编译 146
8.4.4 更改系统根目录 148
8.5 生成Clang交叉编译器 149
8.5.1 配置选项 149
8.5.2 构建和安装基于Clang的交叉编译器 149
8.5.3 其他构建方法 150
8.6 测试 151
8.6.1 开发板 151
8.6.2 模拟器 151
8.7 其他资源 152
8.8 总结 152
第9章 Clang静态分析器 153
9.1 静态分析器的作用 153
9.1.1 传统警告信息和Clang静态分析器比较 153
9.1.2 符号执行引擎的高效性 156
9.2 测试静态分析器 158
9.2.1 使用驱动程序与使用编译器 158
9.2.2 了解可用的检查器 158
9.2.3 在Xcode IDE中使用静态分析器 160
9.2.4 生成HTML格式的图形
9.2.5 处理大型项目 161
9.3 使用自定义的检查器扩展静态分析器 164
9.3.1 熟悉项目架构 164
9.3.2 自定义检查器 165
9.4 其他资源 173
9.5 总结 174
第10章 基于LibTooling的Clang工具 175
10.1 生成编译命令数据库 175
10.2 clang-tidy工具 176
10.3 代码重构工具 178
10.3.1 Clang Modernizer(代码转换器) 178
10.3.2 Clang Apply Replacements(替换执行器) 178
10.3.3 ClangFormat (格式化工具) 180
10.3.4 Modularize(模块化工具) 181
10.3.5 Module Map Checker(模块映射检查器) 187
10.3.6 PPTrace(追踪工具) 187
10.3.7 Clang Query(查询工具) 189
10.3.8 Clang Check(检查工具) 190
10.3.9 remove-cstr-calls(调用移除工具) 190
10.4 编写自己的工具 190
10.4.1 问题定义:编写一个C++代码重构工具 191
10.4.2 配置源代码位置 191
10.4.3 剖析工具的模板代码 192
10.4.4 使用AST匹配器 195
10.4.5 编写回调函数 199
10.4.6 测试编写的重构工具 200
10.5 其他资源 201
10.6 总结 201
索引 202
· · · · · · (收起)
读后感
用户评价
拿到这本书,首先映入眼帘的是封面上那清晰而有力的书名,"LLVM编译器实战教程"。这几个字瞬间点燃了我对底层开发的好奇心,也让我对 compiler 的世界充满了期待。我一直认为,理解一门编程语言的运行机制,深入到编译器这个层面是必不可少的一环。然而,关于编译器,特别是像 LLVM 这样强大而广泛使用的框架,市面上的教程往往要么门槛太高,要么内容不够聚焦,很难让初学者快速入门并建立起完整的知识体系。这本书的出现,仿佛一股清流,正好填补了我的需求。从书的排版和设计来看,就充满了专业感。我仔细翻阅了目录,发现它涵盖了从 LLVM 的基本架构,到核心组件的详细解析,再到实际案例的演练,逻辑非常清晰,层次分明。这种结构化的安排,让我觉得作者在组织内容时,一定花费了大量的精力去思考如何才能让读者更容易理解和吸收。我尤其期待书中关于 LLVM IR (Intermediate Representation) 的讲解,因为我知道这是 LLVM 的核心,掌握了 IR,就等于掌握了 LLVM 的脉搏。这本书的实战性,更是让我眼前一亮,能够通过实际操作来学习,远比枯燥的理论更能激发学习的动力,也更能巩固知识。我相信,通过这本书的学习,我能够真正意义上地“玩转”LLVM,为我的开发之路打开新的篇章。
这本书的封面,虽然没有华丽的图饰,但那“LLVM编译器实战教程”几个字,却散发出一种独特的吸引力。我一直对底层技术充满敬畏,也对编译器这个“幕后英雄”的工作原理充满好奇。很多时候,我们只是把代码交给编译器,然后它就变成了可执行文件,但它内部究竟发生了什么?这个过程是怎样完成的?这些疑问一直萦绕在我脑海中。然而,市面上关于编译器的书籍,要么过于理论化,要么内容陈旧,很难找到一本既权威又实用的入门指南。当我看到这本书时,我感觉我找到了“归宿”。书的装帧和印刷质量都非常棒,拿在手里很有质感。我迫不及待地翻阅了一下目录,发现它的内容安排非常科学,从基础的 LLVM 架构介绍,到各个关键模块的深入讲解,再到实际的项目演示,循序渐进,条理清晰。我尤其期待书中关于 LLVM IR(中间表示)的详细阐述,我知道这是 LLVM 的核心,是理解其工作流程的关键。这本书的“实战”二字,更是让我激动,这意味着我将不仅仅是“看”书,更能“做”书,通过亲手实践来掌握这些知识。我非常看好这本书,相信它能帮助我跨越学习的门槛,深入理解 LLVM 的强大之处。
当我拿到这本《LLVM编译器实战教程》时,首先给我留下深刻印象的是它扎实的“分量”。它不是一本随随便便就能读完的薄册子,而是一本真正打算让你沉下心来学习的“大部头”。书的封面设计简洁有力,没有过多的花哨,直接点明了主题,传递出一种专业、严谨的学术气息。作为一名长期在软件开发一线摸爬滚打的工程师,我深知底层技术的重要性,而编译器无疑是连接高级语言和机器码的桥梁,是理解整个软件栈的关键。然而,市面上关于编译器的书籍,很多都存在理论过于深奥、实操指导不足的问题,往往让有心学习者望而却步。这本书的标题“实战教程”,立刻吸引了我,这正是我所需要的。翻开书页,纸张的触感温润,印刷质量上乘,字迹清晰,排版也十分考究,这些细节都让我感受到出版方和作者的用心。我初步浏览了目录,发现其内容安排逻辑清晰,从 LLVM 的基础概念入手,逐步深入到核心组件的解析,并且包含了大量的实例演示,这让我非常欣喜。我希望通过这本书,能够系统地掌握 LLVM 的工作原理,理解其设计哲学,并最终能够运用 LLVM 来构建更高效、更优化的代码,甚至参与到编译器本身的改进工作中去。这是一本值得我投入大量时间和精力去钻研的书籍。
这本书,我拿到手的时候,就被它厚实的封面和沉甸甸的分量所吸引。打开一看,印刷质量相当不错,纸张触感也很好,读起来不会有廉价感。封面设计简洁大气,透露着一种专业和严谨的气息,让人一看就知道这是一本硬核的技术书籍。我本来就对编译器和底层技术充满好奇,但又苦于没有一个好的入门途径,市面上的一些资料要么过于理论化,要么过于碎片化,很难形成系统性的认知。当我看到这本书的标题时,内心涌起了一丝惊喜,觉得这可能是我一直在寻找的那本“宝藏”。书的目录页也展示了清晰的章节划分,从基础概念到进阶应用,循序渐进,仿佛为我铺就了一条通往编译器世界的康庄大道。我迫不及待地想深入其中,去探寻 LLVM 内部的奥秘,去理解它强大的生命力,并尝试用它来构建自己的编译器项目。这种期待感,就像站在一座宏伟建筑的脚下,想要一探究竟,感受其精巧的设计和坚固的结构。我希望这本书能够帮助我跨越从理论到实践的鸿沟,让我不仅仅停留在“知道”编译器是什么,更能“理解”它如何工作,甚至“能够”构建和修改它。这本书的出现,无疑为我提供了一个绝佳的学习机会,我非常珍惜。
当我第一眼看到《LLVM编译器实战教程》这本书时,就被它直白而专业的书名所吸引。我一直认为,编译器是编程语言的灵魂,而 LLVM 作为现代编译器领域的集大成者,其重要性不言而喻。然而,对于许多开发者来说,LLVM 的学习门槛可能较高,市面上系统性的中文教程更是难觅踪迹。这本书的出现,无疑为我们提供了一个绝佳的学习机会。我拿到书的时候,就感受到它沉甸甸的质感,以及封面设计带来的专业感。翻开内页,纸张的质量很好,印刷清晰,排版也十分合理,阅读体验非常棒。我仔细浏览了目录,发现其内容组织得非常有条理,从 LLVM 的基本架构,到核心组件的深入解析,再到具体的实战项目,层层递进,循序渐进。我尤其对书中关于 LLVM IR (Intermediate Representation) 的讲解抱有很高的期待,因为我知道这是 LLVM 的核心,掌握了 IR,就等于掌握了 LLVM 的关键。这本书的“实战”二字,更是让我感到兴奋,这意味着我将能够通过亲自动手来理解和掌握这些复杂的概念。我相信,这本书能够帮助我系统地构建起对 LLVM 的认知,并将其应用于实际的开发场景中。
拿到这本书,我的第一感觉就是“扎实”。封面设计虽然简约,但“LLVM编译器实战教程”几个字却显得格外醒目,传递出一种硬核的技术魅力。我一直认为,想要真正理解一门编程语言,就必须去了解它的编译器是如何工作的,而 LLVM 作为现代编译器领域的巨头,其重要性不言而喻。但长久以来,我总是觉得市面上关于 LLVM 的中文资料要么过于零散,要么不够系统,很难形成一个完整的学习路径。这本书的出现,恰好填补了这个空白。当我翻开书页,精美的印刷和纸张的触感就让我觉得这是一本值得认真阅读的书。我详细看了目录,它从 LLVM 的基本概念讲起,逐步深入到各个组件的实现细节,并且承诺“实战”,这让我非常兴奋。我最期待的部分就是书中如何通过实际案例来讲解 LLVM 的各个模块,比如如何使用 LLVM 构建一个简单的编译器,如何进行代码优化等等。这种理论与实践相结合的方式,我相信是学习复杂技术最有效的方法。我希望这本书能够成为我学习 LLVM 的“一本通”,让我能够系统地掌握 LLVM 的原理和应用,为我未来的开发工作打下坚实的基础。
这本书的封面设计,没有太多花哨的装饰,却用“LLVM编译器实战教程”这几个字,精准地传达了其核心价值。我一直深信,要成为一名优秀的开发者,就必须理解我们所使用的工具的底层原理。而编译器,作为连接我们代码和机器世界的桥梁,其重要性不言而喻。然而,市面上关于编译器的书籍,很多都显得过于理论化,要么是面向学术研究,要么就是对 LLVM 的浅尝辄止,很难找到一本能够真正指导实践的著作。这本书的标题,让我眼前一亮,它承诺了“实战”,这意味着我将不仅仅是学习抽象的概念,更能通过实际操作来掌握 LLVM 的强大功能。拿到书的那一刻,我就被它厚重的分量和精致的印刷质量所吸引,这让我对书中的内容充满了信心。我仔细地翻阅了目录,发现它从 LLVM 的基础架构讲起,逐步深入到各个核心模块,并且穿插了大量的代码示例和项目演示。我尤其期待书中关于 LLVM IR 的详细介绍,以及如何利用 LLVM 进行代码优化和代码生成的部分。我相信,这本书将为我打开一扇通往 LLVM 世界的大门,让我能够更深入地理解编译器的奥秘,并将其应用于实际的开发工作中。
这款《LLVM编译器实战教程》的书名,如同一盏明灯,照亮了我长期以来对于编译器底层运作机制的探索之路。我一直对编程语言从源代码到最终可执行文件的转换过程感到着迷,而 LLVM 作为这个领域的翘楚,其强大之处和广泛应用,自然吸引了我深入探究的目光。然而,过往的学习经历告诉我,理论知识的堆砌往往难以转化为实际操作能力,许多编译器相关的书籍要么充斥着晦涩难懂的数学公式,要么脱离实际应用场景。这本书的“实战教程”定位,正是我渴求的。初次拿到书,我便被它沉甸甸的分量和细致的装帧所吸引,这是一种对内容的承诺。内页的排版设计也相当用心,字迹清晰,版式疏朗,让人阅读起来倍感舒适,不会产生视觉疲劳。我仔细地阅读了目录,发现其内容架构非常合理,从 LLVM 的宏观概览,到各个子系统的微观剖析,再到实际的编码示例,形成了一个完整的知识体系。我尤其期待书中关于 LLVM 的中间表示 (IR) 的详细讲解,这在我看来是理解整个 LLVM 框架的关键。我相信,这本书将为我提供一条从零开始,逐步掌握 LLVM 编译器技术的坚实路径,让我不再是站在知识的海洋之外,而是能够驾驭其中,去创造和优化。
这本书的书名——《LLVM编译器实战教程》,在我眼中,就如同一个引人入胜的谜题,勾起了我内心深处对底层技术的好奇与渴望。我一直认为,要想真正驾驭编程这门艺术,就必须深入了解那些隐藏在代码背后的“幕后英雄”,而编译器,无疑是其中最为关键的一环。 LLVM 作为一个如此强大且影响深远的编译器基础设施,其内在的逻辑和运作方式,对我来说一直充满了神秘感。然而,纵观市面上的相关书籍,要么是理论性过强,让人望而却步,要么是内容零散,难以形成完整的认知体系。这本书的“实战教程”定位,恰恰是我一直所寻觅的“金钥匙”。当我拿到这本书时,其厚实的体量和精美的印刷质量,就已经让我感受到了内容的深度和诚意。我迫不及待地翻阅了目录,发现其内容编排极具逻辑性,从 LLVM 的基本概念入手,一步步深入到其核心组件的解析,并且预示着大量的实践操作。我最期待的是书中关于如何通过 LLVM 来实现代码的优化和生成的过程,这对我来说是理解编译器工作流程的“圣杯”。我相信,通过这本书的学习,我能够将那些抽象的编译器理论转化为实际可操作的技能,真正地理解并运用 LLVM 来解决实际问题。
这本书的封面设计,简洁而富有科技感,封面上“LLVM编译器实战教程”几个字,直击我长期以来对编译器技术的一份兴趣。我一直觉得,作为一名开发者,如果能深入理解编译器的原理,那将是一件非常了不起的事情。然而,很多时候,关于编译器的资料要么过于抽象,要么偏向于学术研究,很难找到一本真正能够指导实践的书籍。当我偶然看到这本书时,我感觉我的“搜索引擎”终于找到了“正确”的答案。我迫不及待地翻开了扉页,书的纸张质感很好,印刷清晰,字迹大小适中,阅读起来非常舒适。我认真地浏览了目录,内容安排得非常合理,从 LLVM 的基本概念,到其内部的各个模块,再到具体的应用场景,一步步引导读者深入。我尤其对书中提到的“实战”二字充满了期待,这意味着我将不仅仅是学习理论,更能通过动手实践来加深理解。我希望这本书能够像一位经验丰富的导师,带领我穿梭于 LLVM 的复杂世界,让我不再为那些晦涩难懂的概念而感到迷茫,而是能够清晰地认识到 LLVM 的强大之处,并学会如何运用它来解决实际问题。这本书的出现,对于我来说,无疑是一次宝贵的学习机会,我非常看重它。
个人体验,这本书的价值偏低。真心对llvm感兴趣的话,还是建议龙、虎、鲸书配合源码。
个人体验,这本书的价值偏低。真心对llvm感兴趣的话,还是建议龙、虎、鲸书配合源码。
这本书非常棒,能让你从全局去了解最近的编译器相关的工具对我很有帮助
个人体验,这本书的价值偏低。真心对llvm感兴趣的话,还是建议龙、虎、鲸书配合源码。
比较偏工具书