LLVM 项目是一个模块化和可重用的编译器和工具链技术的集合。 尽管名称如此,LLVM 与传统的虚拟机几乎无关。“LLVM” 这个名字本身不是首字母缩写词;它是项目的全名。
LLVM 最初是 伊利诺伊大学 的一个 研究项目,目标是提供一种现代的、基于 SSA 的编译策略,能够支持任意编程语言的静态和动态编译。 从那时起,LLVM 已经发展成为一个包含许多子项目的总括项目,其中许多子项目正在被各种 商业和开源 项目在生产中使用,并在 学术研究 中得到广泛应用。 LLVM 项目中的代码根据 “带有 LLVM 例外的 Apache 2.0 许可证” 获得许可。
LLVM 的主要子项目是
LLVM Core 库提供了一个现代的、独立于源和目标的 优化器,以及对许多流行的 CPU(以及一些不太常见的 CPU!)的 代码生成支持。 这些库围绕一个 良好规范的 代码表示构建,该代码表示被称为 LLVM 中间表示(“LLVM IR”)。 LLVM Core 库具有 完善的文档,并且特别容易发明您自己的语言(或移植现有的编译器)以使用 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 的完全支持。
libc 项目提供了一个高性能、符合标准的 C 标准库实现,与 LLVM 完全集成。 它为 C 应用程序提供了优化的性能和对现代 C 标准的全面支持,确保了可靠且高效的基础。
compiler-rt 项目提供了对低级代码生成器支持例程(如 “__fixunsdfdi“ 以及当目标没有用于实现核心 IR 操作的短指令序列时生成的其他调用)的高度调整实现。 它还为动态测试工具(如 AddressSanitizer、ThreadSanitizer、MemorySanitizer 和 DataFlowSanitizer)提供了运行时库的实现。
MLIR 子项目是构建可重用和可扩展编译器基础设施的一种新颖方法。 MLIR 旨在解决软件碎片化问题,改进异构硬件的编译,显着降低构建特定领域编译器的成本,并帮助将现有编译器连接在一起。
OpenMP 子项目为 Clang 中 OpenMP 的实现提供了 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 开发者政策。