LLVM 项目是一个由模块化和可重用编译器和工具链技术组成的集合。尽管名称如此,LLVM 与传统的虚拟机几乎没有关系。“LLVM”本身不是首字母缩略词;它是该项目的全称。
LLVM 最初是 伊利诺伊大学香槟分校的一个研究项目,其目标是提供一种现代的、基于 SSA 的编译策略,能够支持任意编程语言的静态和动态编译。从那时起,LLVM 已发展成为一个包含多个子项目的伞形项目,其中许多子项目已被各种 商业和开源 项目用于生产,并在 学术研究 中得到广泛应用。LLVM 项目中的代码根据 “Apache 2.0 许可证附带 LLVM 异常” 许可。
LLVM 的主要子项目包括:
LLVM 核心 库提供了一个现代的、与源和目标无关的 优化器,以及许多流行的 CPU(以及一些不太常见的 CPU!)的 代码生成支持。这些库围绕一个 定义明确的 代码表示形式构建,该表示形式称为 LLVM 中间表示形式(“LLVM IR”)。LLVM 核心库 有很好的文档记录,并且发明自己的语言(或移植现有的编译器)以 使用 LLVM 作为优化器和代码生成器 尤其容易。
Clang 是一种“LLVM 原生”C/C++/Objective-C 编译器,旨在提供极快的编译速度、极其有用的 错误和警告消息,并提供构建出色源代码级工具的平台。Clang 静态分析器 和 clang-tidy 是自动查找代码中错误的工具,并且是使用 Clang 前端作为库来解析 C/C++ 代码的工具类型的极好示例。
LLDB 项目基于 LLVM 和 Clang 提供的库构建,以提供出色的原生调试器。它使用 Clang AST 和表达式解析器、LLVM JIT、LLVM 反汇编程序等,从而提供“即用型”体验。它也比 GDB 加载符号的速度快得多,并且内存效率更高。
libc++ 和 libc++ ABI 项目提供了一个符合标准且高性能的 C++ 标准库实现,包括对 C++11 和 C++14 的完全支持。
compiler-rt 项目提供了高度调整的低级代码生成器支持例程的实现,例如:__fixunsdfdi"以及在目标没有用于实现核心 IR 操作的简短本地指令序列时生成的其它调用。它还为动态测试工具(如 AddressSanitizer、ThreadSanitizer、MemorySanitizer 和 DataFlowSanitizer)提供了运行时库的实现。
MLIR 子项目是一种构建可重用且可扩展编译器基础设施的新方法。MLIR 旨在解决软件碎片化问题,改进异构硬件的编译,显著降低构建领域特定编译器的成本,并帮助连接现有的编译器。
OpenMP 子项目提供了一个 OpenMP 运行时,用于与 Clang 中的 OpenMP 实现一起使用。
polly 项目使用多面体模型实现了一套缓存局部性优化以及自动并行化和矢量化。
libclc 项目旨在实现 OpenCL 标准库。
klee 项目实现了一个“符号虚拟机”,该虚拟机使用定理证明器来尝试评估程序中的所有动态路径,以查找错误并证明函数的属性。klee 的一个主要功能是在检测到错误时可以生成测试用例。
LLD 项目是一个新的链接器。它是系统链接器的直接替换,并且运行速度快得多。
BOLT 项目是一个链接后优化器。它通过基于采样分析器收集的执行配置文件优化应用程序的代码布局来实现改进。
除了 LLVM 的官方子项目之外,还有各种各样的其它项目 使用 LLVM 的组件来执行各种任务。通过这些外部项目,您可以使用 LLVM 编译 Ruby、Python、Haskell、Rust、D、PHP、Pure、Lua、Julia 和许多其它语言。LLVM 的一个主要优势在于其多功能性、灵活性和可重用性,这就是它被用于如此广泛的不同任务的原因:从对 Lua 等嵌入式语言进行轻量级 JIT 编译到为大型超级计算机编译 Fortran 代码,无所不包。
LLVM 拥有一个广泛而友好的社区,他们对构建出色的低级工具感兴趣。如果您有兴趣 参与其中,一个好的起点是浏览 LLVM 博客 并加入 LLVM Discourse。有关如何提交补丁、获取提交访问权限以及版权和许可证主题的信息,请参阅 LLVM 开发人员策略。