LLVM(Low Level Virtual Machine,低级虚拟机)最初由Chris Lattner于2000年在伊利诺伊大学作为博士研究项目启动,如今已发展成为工业界和学术界广泛采用的编译器基础设施。
LLVM的发展历程见证了它从一个学术研究项目,成长为现代编译器技术的基石,被Apple、Google、Microsoft等科技巨头广泛采用。
LLVM的模块化设计、统一的中间表示和强大的优化框架,为编译器技术带来了革命性的改变,降低了编程语言开发的门槛。
LLVM采用模块化设计,整体架构可分为三个主要部分
负责将源代码转换为LLVM中间表示(IR),包含词法分析、语法分析、语义分析等阶段。
LLVM的核心,是一种统一的代码表示形式,设计用于优化和代码生成,采用静态单赋值(SSA)形式。
对IR进行各种优化,提高代码性能,通过Pass机制实现各种优化算法。
将优化后的IR转换为目标平台的机器码,负责目标代码的生成、汇编和链接。
LLVM IR(Intermediate Representation,中间表示)是LLVM框架的核心
类似于汇编语言的形式,每条指令最多有一个结果和两个操作数
每个变量在IR中只被赋值一次,简化了优化过程
确保编译过程中的类型安全
不依赖于特定硬件平台,易于移植
define i32 @add(i32 %a, i32 %b) {
entry:
%sum = add i32 %a, %b
ret i32 %sum
}
define i32 @factorial(i32 %n) {
entry:
%cmp = icmp sle i32 %n, 0
br i1 %cmp, label %return, label %recurse
return:
ret i32 1
recurse:
%n.minus.1 = sub i32 %n, 1
%fact = call i32 @factorial(i32 %n.minus.1)
%result = mul i32 %n, %fact
ret i32 %result
}
LLVM生态系统包含多个子项目,共同构成完整的编译工具链
提供现代的源码和目标无关的优化器,支持多种CPU的代码生成,提供详细文档和API
LLVM原生的C/C++/Objective-C编译器前端,提供快速编译、友好的错误提示和警告
基于LLVM和Clang提供的高性能调试器,比GDB更快、内存效率更高
符合标准的高性能C++标准库实现,全面支持C++11/14/17/20标准
使用多面体模型实现高级循环和数据局部性优化
用于构建可重用和可扩展的编译器基础设施的框架,专为机器学习和其他领域优化而设计
提供OpenMP运行时环境,支持并行编程
LLVM优化器是其强大功能的核心,支持多种优化技术
LLVM的应用范围非常广泛,从编程语言实现到深度学习编译器
作为新编程语言的后端(Swift、Rust等)或为现有语言提供更高效的编译器(C/C++)
Clang Static Analyzer和clang-tidy代码质量检查工具等静态分析应用
为JavaScript、Python等动态语言提供JIT编译,用于虚拟机和运行时系统
生成硬件描述语言(HDL)的模拟代码,加速硬件设计和验证
自动向量化和并行化,针对特定硬件的代码优化
TVM、XLA等基于LLVM构建,优化神经网络模型执行效率
LLVM的设计理念和架构为现代编译器技术带来了诸多优势
前端、优化器和后端分离,可独立开发和替换,降低开发复杂度,提高重用性
所有语言共享同一个IR,优化可应用于任何通过前端生成IR的语言
完善的Pass管理系统,丰富的分析和转换API,使得高级优化变得容易实现
支持多种硬件架构,简化交叉编译,为多平台部署提供便利
活跃的开发者社区,持续改进和更新,确保技术始终保持领先
针对现代CPU和GPU架构优化的代码生成能力,提供卓越性能
LLVM工具链包含多个命令行工具,支持完整的编译流程
C/C++/Objective-C编译器,替代GCC
LLVM汇编器,将.ll文件转换为.bc文件
LLVM反汇编器,将.bc文件转换为.ll文件
LLVM IR优化器,用于应用各种优化Pass
LLVM静态编译器,将LLVM IR编译为目标汇编代码
调试器,用于调试编译后的程序
LLVM位码链接器,用于链接多个LLVM位码文件
LLVM作为现代编译器基础设施的基石,通过其模块化设计、强大的中间表示和优化能力,彻底改变了编译器的开发方式。它不仅为现有语言提供了高性能实现,也极大地降低了新编程语言的开发门槛。
随着技术的不断发展,LLVM正在成为越来越多领域的核心基础设施,从传统编译器、JIT运行时到深度学习框架,LLVM的影响力持续扩大,推动着编程语言和编译技术的创新。