本文为译文,点击 此处查看原文。
1. LLVM 概述
LLVM
项目是模块化、可重用的编译器和工具链技术的集合。尽管名为 LLVM,但它与传统虚拟机几乎没有什么关系。名称 “LLVM”
本身并不是缩写;它是项目的全称。
LLVM 最初是伊利诺伊大学的一个研究项目,其目标是提供一种现代的、基于 SSA
的编译策略,能够支持任意编程语言的静态和动态编译。从那时起,LLVM 已经成长为一个由许多子项目组成的伞形项目,其中许多子项目被各种各样的商业和开源项目用于生产,并被广泛用于学术研究。LLVM 项目中的代码是在“Apache 2.0许可下使用 LLVM 例外”许可的。
LLVM的主要子项目有:
- LLVM Core 库提供了一个现代的独立于源和目标的优化器,以及对许多流行 CPU(以及一些不太常见的CPU)的代码生成支持!这些库是围绕一个良好指定的代码表示构建的,该代码表示称为 LLVM 中间表示(
“LLVM IR”
)。LLVM Core 库有很好的文档说明,而且特别容易发明自己的语言(或移植现有编译器)来使用 LLVM 作为优化器和代码生成器。 - Clang 是一个“LLVM 原生” C/C++/Objective-C 编译器,它的目标是提供惊人的快速编译(例如,在 debug 配置中编译 Objective-C 代码时,速度比 GCC 快 3 倍左右)、非常有用的错误和警告消息,并为构建优秀的源代码级工具提供平台。Clang Static Analyzer 是一种工具,可以自动发现代码中的bug,它是一个很好的例子,是一个使用 Clang frontend 作为库来解析 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 )提供了运行时库的实现。 - OpenMP 子项目为 Clang 中的 OpenMP 实现提供了一个 OpenMP 运行时。
- polly 项目使用多面体模型实现了一套缓存位置优化以及自动并行化和向量化。
- libclc 项目的目标是实现 OpenCL 标准库。
- klee 项目实现了一个“符号虚拟机”,它使用一个定理验证器来评估程序中的所有动态路径,以发现 bug 并证明函数的属性。
klee
的一个主要特性是,它可以在检测到 bug 时生成一个测试用例。 - SAFECode 项目是一个用于 C/C++ 程序的内存安全编译器。它使用运行时检查来检测运行时的内存安全错误(例如,缓冲区溢出)。它可以用来保护软件免受安全攻击,也可以像 Valgrind 一样用作内存安全错误调试工具。
- LLD 项目是一个新的链接器。这是一个系统链接器的临时替代品,运行速度更快。
除了LLVM的官方子项目之外,还有许多其他项目使用 LLVM 的组件来完成各种任务。通过这些外部项目,您可以使用 LLVM 编译 Ruby、Python、Haskell、Java、D、PHP、Pure、Lua 和其他一些语言。LLVM的一个主要优点是它的通用性、灵活性和可重用性,这就是为什么它被用于如此广泛的不同任务:从轻量级 JIT 编译嵌入式语言(如 Lua)到为大型超级计算机编译 Fortran 代码。
与其他所有东西一样,LLVM 拥有一个由对构建优秀底层工具感兴趣的人组成的广泛而友好的社区。如果您对参与其中感兴趣,那么您可以浏览 LLVM 博客并注册 LLVM 开发人员邮件列表。有关如何发送补丁、获取提交访问、版权和许可主题的信息,请参阅 LLVM开发人员策略。
2. LLVM特性
用于 C 和 C++ 的 LLVM 编译器系统包括以下内容:
Front-end
,用于C、C++、Objective-C、Fortran 等语言,基于 GCC 4.2 parsers。它们支持 ANSI 标准的 C 和 C++ 语言,就像 GCC 支持它们一样。此外,还支持许多 GCC 扩展。LLVM 指令集的稳定实现
,它同时有着在线和离线代码表示,以及汇编(ASCII)和字节码(binary)的 reader、writer 和 verifier。- 一个功能强大的
pass 管理系统
,它根据 pass 的依赖性自动对 pass 进行排序(包括分析、转换和代码生成 passes),并对它们进行管道传输以提高效率。 - 广泛的全局标量优化。
- 一个具有丰富的分析和转换集合的链接时过程间优化框架,包括复杂的全程序指针分析、调用图构造和对概要引导优化的支持。
- 一个易于重定向的代码生成器,目前支持 X86、X86-64、PowerPC、PowerPC-64、ARM、Thumb、SPARC、Alpha、CellSPU、MIPS、MSP430、SystemZ 和 XCore。
- 一个即时(JIT)代码生成系统,目前支持 X86、X86-64、ARM、AArch64、Mips、SystemZ、PowerPC 和 PowerPC-64。
- 支持生成 DWARF 调试信息。
- 一个
C back-end
,用于测试和在上面列出的目标上生成本机代码。 - 一个类似
gprof
的分析系统。 - 一个包含许多基准代码和应用程序的测试框架。
- APIs 和调试工具简化了 LLVM 组件的快速开发。
3. LLVM系统的优势
- LLVM 使用一种具有严格定义语义的简单底层语言。
- 它包括用于 C 和 C++ 的 front-ends。用于 Java、Scheme和其他语言的前端正在开发中。
- 它包括一个积极的优化器,包括标量、过程间、概要驱动和一些简单的循环优化。
- 它支持终身编译模型,包括链接时、安装时、运行时和脱机优化。
- LLVM 完全支持精确的垃圾收集。
- LLVM 代码生成器相对容易重定向,并且使用了强大的目标描述语言。
- LLVM 有丰富的文档,并承载了各种各样的项目。
- 许多第三方用户都声称 LLVM 易于使用和开发。例如,(现在已删除) Stacker front-end 是由一个对 LLVM 一无所知的人在 4 天内编写的。此外,LLVM 有工具使得开发更容易。
- LLVM 正在积极开发中,并不断得到扩展、增强和改进。查看左边栏上的状态更新以查看开发速度。
- LLVM 是在 OSI 批准的“three-clause BSD”许可下免费提供的。
- LLVM 目前由几个商业实体使用,它们提供了许多扩展和新特性。
4. LLVM 用处
LLVM 可以用于许多不同类型的项目。如果你是:
- 对 C 和 C++ 程序的编译时、链接时(过程间)和运行时转换感兴趣的编译器研究人员。
- 对可移植的、独立于语言的指令集和编译框架感兴趣的虚拟机研究人员/开发人员。
- 对编译器/硬件技术感兴趣的架构研究人员。
- 对静态分析或检测感兴趣的安全研究员。
- 对编译器转换的快速原型化系统感兴趣的讲师或开发人员。
- 希望从代码中获得更好性能的最终用户。
5. 最新 LLVM 发行版
2019年3月20日:LLVM 8.0.0现在可以下载了!LLVM 是在开放源码许可下公开可用的。此外,您可能想查看 SVN 中的新特性,这些特性将在下一个 LLVM 发行版中出现。如果您希望尽早使用,请通过匿名 SVN 下载 LLVM。
6. 了解更多
您可以在线浏览文档,在 web 浏览器中尝试 LLVM,或者下载源代码。