Low Level Virtual Machine


文档摘要

Low Level Virtual Machine (LLVM)是一套模块化和可重用的编译器及工具链技术,用于开发编译器和编译器工具,例如:代码检查器和重构工具。LLVM用C++编写,一个结构良好的项目。它使用了一些有趣的技术,旨在使其可重用且高效。该项目也可视为编译器架构的杰出示例,深入研究,将了解编译器的组织方式和功能,这有助于理解使用模式并应用。 LLVM的关键组件是名为Clang的C/C++编译器。这款编译器在多家公司中得到了广泛使用,并指定为某些开发环境中的默认编译器,尤其是在macOS开发中。Clang将是我们在本书中的主要研究对象,特别关注其前端——即与C/C++编程语言最接近的部分。具体来说,书中将包括示例,展示C++标准如何在编译器中实现。

Low Level Virtual Machine
(LLVM)是一套模块化和可重用的编译器及工具链技术,用于开发编译器和编译器工具,例如:代码检查器和重构工具。LLVM用C++编写,一个结构良好的项目。它使用了一些有趣的技术,旨在使其可重用且高效。该项目也可视为编译器架构的杰出示例,深入研究,将了解编译器的组织方式和功能,这有助于理解使用模式并应用。

LLVM的关键组件是名为Clang的C/C++编译器。这款编译器在多家公司中得到了广泛使用,并指定为某些开发环境中的默认编译器,尤其是在macOS开发中。Clang将是我们在本书中的主要研究对象,特别关注其前端——即与C/C++编程语言最接近的部分。具体来说,书中将包括示例,展示C++标准如何在编译器中实现。

LLVM设计的核心要素是其模块性,这便于创建利用编译器全面能力的定制工具。书中一个示例是Clang-Tidy代码检查框架,旨在识别不良的代码模式并更正。尽管它包含了数百项检查,但可能找不到特定于自己项目需求的检查,所以这本书将提供从头开始开发此类检查所需的基础知识。

LLVM是一个积极发展的项目,每年会有两个主要版本发布。撰写本书时,最新的稳定版本是17版。与此同时,18版的发布候选版本已于2024年1月推出,预计其正式发布将与本书的出版同步。本书的内容已经针对最新的编译器版本18进行了验证,确保内容是基于当前最新编译器实现的见解。

阅读前,需要具备C++的理解,尤其是C++17,因为LLVM和书中示例使用C++17编写。提供的示例假设在类Unix操作系统中运行,其中Linux和Darwin(Mac
OS)为本书主要实践的操作系统。我们将使用Git来克隆LLVM源代码,还需要安装一些工具,例如CMake和Ninja,用于构建示例和LLVM源代码。

如果使用的是这本书的数字版本,我们建议亲自输入代码,或者从书的GitHub仓库中访问代码(下一节将提供链接)。这样做可以帮助避免与复制粘贴代码相关的问题。

本书是为那些没有编译器知识背景,但希望获得这些知识,并将其应用于日常活动的C++工程师编写。提供了Clang编译器前端的总览,这是LLVM中至关重要,但常常低估的一部分。编译器的这一部分,以及一系列强大的工具,使开发者能够提高代码质量和整体开发过程。例如,Clang-Tidy提供了超过500种不同的lint检查,用于检测代码中的反模式(例如:移动后使用)并帮助维护代码风格和标准。另一个值得注意的工具是Clang-Format,可以指定项目的各种格式化规则。这些工具也可以认为是开发过程的一个组成部分。例如,语言服务器(Clangd)是一项关键服务,为IDE提供导航和重构支持。

对于想要创建和使用此类工具的人来说,理解编译器内部结构可能至关重要。本书提供了开始这段旅程所需的基础知识,包括基本的LLVM架构,并详细描述了Clang的内部结构,包括LLVM源代码的示例和自定义工具,这些工具扩展了编译器提供的基本功能。此外,本书还讨论了编译数据库和各种性能优化,这些优化可以提高项目构建速度。这些知识可以帮助C++开发者,正确地将编译器应用于工作中。

第1章,
环境搭建。描述了为使用Clang进行实验所需的基本环境设置步骤,适用于基于
Unix 的系统,如 Linux 和
Darwin(macOS)。此外,读者将学习如何下载、配置和构建 LLVM
源代码。我们还会创建一个简单的 Clang 工具,来验证提供的源代码的语法。

第 2 章, Clang 架构。探讨了 Clang
编译器的内部架构。从编译器的基本概念开始,将探索编译器在 Clang
中如何实现,研究编译器的不同部分,包括驱动程序、预处理器(词法分析器)和解析器。我们还会通过示例来展示如何在Clang
中实现 C++ 标准。

第 3 章, Clang 抽象语法树。讨论了 Clang 抽象语法树
(AST),这是解析器产生的基本数据结构。我们将探讨 Clang 中 AST
的组织方式及其遍历方法,还将深入研究 AST匹配器 —— Clang
提供的一个强大的工具,用于定位特定的 AST 节点。

第 4 章, 基础库与工具。探讨基础的 LLVM 库和工具,包括在整个 LLVM
代码中使用的 LLVM 抽象数据类型 (ADT) 库。还将研究
TableGen,这是一种领域特定语言 (DSL),用于生成 LLVM 各个部分中的 C++
代码。此外,还将探索 LLVM 集成测试器 (LIT)
工具,该工具用于创建强大的端到端测试。利用所学知识,创建一个简单的 Clang
插件来评估代码的复杂度。

第 5 章, Clang-Tidy 代码检查框架。涵盖了基于 Clang AST 的 Clang-Tidy
代码检查框架,创建一个简单的 Clang-Tidy
检查。我们还将讨论编译错误如何影响 AST ,以及不同的 Clang 工具(如
Clang-Tidy)提供的结果。

第 6 章,
高级代码分析。进一步探讨用于代码分析的另一种高级数据结构:控制流图
(CFG)。我们将研究其典型应用场景,并创建一个利用这种数据结构的简单
Clang-Tidy 检查。

第 7 章, 重构工具。Clang
提供了高级的代码修改和重构工具,将探索创建自定义重构工具的不同方法,包括基于
Clang-Tidy 代码检查框架的方法,还将探讨
Clang-Format,这是一个极其快速的自动代码格式化工具。

第 8 章, 集成开发环境支持与 Clangd, 介绍 Clangd —— 用于各种集成开发环境
(IDE) 的语言服务器,例如 Visual Studio Code (VS
Code),以提供智能支持,包括导航和代码修改。Clangd 是 LLVM
强大模块化架构的一个实例。利用了各种 Clang 工具,如 Clang-Tidy 和
Clang-Format,以增强 VS Code
中的开发体验。编译器性能对于此工具至关重要,我们将探讨几种 Clangd
使用的技术来提高其性能,从而为开发者提供最佳体验。

附录 1: 编译数据库, 描述了编译数据库 —— 一种向不同的 Clang
工具提供复杂的编译命令的方法。此功能对于将 Clang 工具(如 Clangd 和
Clang-Tidy)集成到实际的 C/C++ 项目中至关重要。

附录 2: 优化构建速度, 包括几种可用于增强编译器性能的优化技术。我们将了解
Clang 预编译头文件和 Clang 模块,其代表了一个可序列化的
AST,加载速度远快于从头构建。

本书的代码包也托管在GitHub上,地址为
https://github.com/PacktPublishing/Clang-Compiler-Frontend-Packt。如果代码有更新,将在现有的GitHub仓库中进行更新。

我们还有其他来自我们丰富的书籍和视频目录的代码包,都在
https://github.com/PacktPublishing/。去看看吧!

本书中使用了许多文本约定。

​CodeInText:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL和用户输入。下面是一个例子:"前两个参数指定声明(clang::Decl)和声明的语句(clang::Stmt)。"

代码块如下所示:

int main() return 0;

命令行输入或输出如下所示:

用<…>作为LLVM源代码克隆文件夹的占位符。

表示shell的输入,可以通过特定的提示字符来识别:

  • (lldb) 表示交互式LLDB shell

  • $ 表示Bash shell (macOS和Linux)

  • > 用于不同Clang工具(如Clang-Query)提供的交互式shell


发布者: 作者: 转发
评论区 (0)
U