LLVM是构架
编译器(compiler)的框架系统,以C++编写而成,用于优化以任意
程序语言编写的程序的
编译时间(compile-time)、链接时间(link-time)、
运行时间(run-time)以及
空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写,由于命名带来的混乱,LLVM就是该项目的全称。LLVM 核心库提供了与
编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行
程序语言的编译器优化、链接优化、在线编译优化、
代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。LLVM是
伊利诺伊大学的一个研究项目,提供一个现代化的,基于SSA的编译策略能够同时支持静态和动态的任意
编程语言的编译目标。自那时以来,已经成长为LLVM的主干项目,由不同的
子项目组成,其中许多正在生产中使用的各种商业和开源的项目,以及被广泛用于学术研究。
LLVM 是
Illinois 大学发起的一个开源项目,和之前为大家所熟知的
JVM 以及 .net Runtime这样的
虚拟机不同,这个
虚拟系统提供了一套中立的
中间代码和编译基础设施,并围绕这些设施提供了一套全新的编译策略(使得优化能够在编译、连接、
运行环境执行过程中,以及安装之后以有效的方式进行)和其他一些非常有意思的功能。
2005年Apple雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的
编译器。
2011-12-02 LLVM3.0发布,LLVM包括了一系列
子项目,它们也同步发布了新版本,如
C/C++/
Objective-C前端Clang 3.0改进了
C++程序编译支持;改进C++ 2011标准支持;实现支持即将发布的C1x标准的某些特性;更快的生成代码,更快的编译,等等。
对于普通的开发人员来说,LLVM计划提供了越来越多的可以使用、
编译器以外的其他工具。例如代码静态
检查工具LLVM/Clang Static Analyzer,是一个 Clang 的子项目,能够使用同样的
Makefile 生成
HTML 格式的
分析报告。
一方面,这使得透过LLVM能够将不同的语言相互连结起来;也使得LLVM能够紧密地与
IDE交互和集成。
另一方面,发布中间代码而非
目标代码能够在目标系统上更好地发挥其潜能而又
不伤害可调试性(i.e. 在目标系统上针对本机的
硬件环境产生目标代码,但又能够直接通过中间代码来进行行级调试)
使用LLVM提供的工具可以比较容易地实现新的
编程语言的优化
编译器或VM,或为现有的编程语言引入一些更好的优化/调试特性。
2011年12月2日,LLVM 3.0
正式版发布了,新版本最大的跨越就是一个全新的
寄存器分配器,可提供大幅度的性能提升;完全支持全新 C++ 内存模型中的
原子操作;改进了
MIPS 后端;支持
gprof/gcov 风格的 profile 信息。
2012年5月22日,LLVM 3.1 发布,是一个主要的更新版本,包含一个新的 AddressSanitizer 工具用于检测内存错误以及一个
ARM 集成汇编工具,另外该版本还提升了
机器码的性能,完整的功能特性可从 preliminary release notes 这里了解到。
2015年5月26日,LLVM 3.6 发布。此版本是 LLVM 社区辛苦开发六个月的结果,包括大量
bug 修复,优化改进,Clang 支持更多被提议的 C++1z 功能,更好的原生 Windows
兼容性,本地对象文件中嵌入 LLVM IR,绑定 Go 等等。
2015年9月2日,LLVM 3.7 发布。主要更新内容有:完全支持 OpenMP 3.1(behind a flag),the On Request Compilation (ORC) JIT
API,一个全新的后端用于 Berkeley
Packet Filter (BPF), Control Flow Integrity 检查,对优化的改进,新的 Clang 警告,许多 bug 修复等等。