目录
LLVM 项目
LLVM项目是模块化、可重用的编译器以及工具链技术的集合。
可重用的编译器以及工具链技术的集合。
美国计算机协会 (ACM) 将其2012 年软件系统奖项颁给了LLVM,之前曾经获得此奖项的软件和技术包括:Java、Apache、 Mosaic、the World Wide Web、Smalltalk、UNIX、Eclipse等等
创始人:Chris Lattner,亦是Swift之父。
编译器高材生Chris Lattner(克里斯·拉特纳)
2000年,本科毕业的Chris Lattner像中国多数大学生一样,按部就班地考了GRE,最终前往UIUC(伊利诺伊大学厄巴纳香槟分校),开始了艰苦读计算机硕士和博士的生涯。在这阶段,他专研“龙书”(《Compilers: Principles, Techniques, and Tools》)成为大牛。
LLVM在他念博士时更加成熟,使用GCC作为前端来对用户程序进行语义分析产生IF(Intermidiate Format),然后LLVM使用分析结果完成代码优化和生成。这项研究让他在2005年毕业时,成为小有名气的编译器专家,因此早早地被Apple相中,成为其编译器项目的骨干。
Apple相中Chris Lattner主要是看中LLVM能摆脱GCC束缚。Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。
一方面,是Apple对Objective-C语言(甚至后来对C语言)新增很多特性,但GCC开发者并不买Apple的帐——不给实现,因此索性后来两者分成两条分支分别开发,这也造成Apple的编译器版本远落后于GCC的官方版本。
另一方面,GCC的代码耦合度太高,不好独立,而且越是后期的质量越是差,但Apple想做的很多功能(比如更好的IDE支持)需要模块化的方式来调用GCC,但GCC一直不给做。甚至最近,《GCC运行环境豁免条款 (英文版)》从根本上限制了LLVM-GCC的开发。 所以,这种不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源替代品,Chris Lattner的LLVM显然是一个很棒的选择。
刚进入Apple,Chris Lattner就大展身手:首先在OpenGL小组做代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈能够产出更高效率的图形代码。如果显卡足够高级,这些代码会直接扔入GPU执行。但对于一些不支持全部OpenGL特性的显卡(比如当时的Intel GMA卡),LLVM能够把这些指令优化成搞笑的GPU指令。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同时,LLVM的链接优化被直接加入到Apple的代码链接器上,而LLVM-GCC也被同步到使用GCC4代码。
LLVM真正的发迹,则得等到Mac OS X 10.6 Snow Leopard登上舞台。可以说, Snow Leopard的新功能,完全得益于LLVM的技术。而这一个版本,也是将LLVM推向真正成熟的重大机遇。
CLANG 项目
Apple吸收Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM 继续改进GCC的代码质量。于是,Apple决定从零开始写 C、C++、Objective-C语言的前端 Clang,完全替代掉GCC。
正像名字所写的那样,Clang只支持C,C++和Objective-C三种C家族语言。2007年开始开发,C编译器最早完成,而由于Objective-C相对简单,只是C语言的一个简单扩展,很多情况下甚至可以等价地改写为C语言对Objective-C运行库的函数调用,因此在2009年时,已经完全可以用于生产环境。C++的支持也热火朝天地进行着。
Clang的加入代表着LLVM真正走向成熟和全能,Chris Lattner以影响他最大的“龙书”为灵感,为项目选定了图标。
2010年,克里斯获得首届“程序设计语言软件奖(Programming Languages Software Award)”。2012年4月,Vikram Adve和Chris Lattner和Evan Cheng等三名LLVM团队成员荣获ACM软件系统奖。
LLVM基本特性
用于C/C++的LLVM编译器系统包括以下内容:
- 通用的C,C++,Objective-C,Fortran等的前端。它们支持ANSI标准的C和C++语言,其程度与GCC支持的程度相同。此外,还支持许多GCC扩展。
- LLVM指令集的稳定实现,既作为在线和离线代码表示,又与汇编(ASCII)和字节码(二进制)读取器和写入器以及验证器一起使用。
- 一个强大的pass管理系统,它根据它们的依赖性自动对pass(包括分析,转换和代码生成)进行排序,并将它们管道化以提高效率。
- 广泛的全局标量优化。
- 链接时过程间优化框架,具有丰富的分析和转换集,包括复杂的全程序指针分析,调用图构造以及对配置文件引导的优化的支持。
- 易于重定向的代码生成器,目前支持X86,X86-64,PowerPC,PowerPC-64,ARM,Thumb,SPARC,Alpha,CellSPU,MIPS,MSP430,SystemZ和XCore。
- Just-In-Time(JIT)代码生成系统,目前支持X86,X86-64,ARM,AArch64,Mips,SystemZ,PowerPC和PowerPC-64。
- 支持生成DWARF调试信息。
- 一个C语言后端用于测试和生成除上面列出的目标之外的目标上的本机代码。
- 一个与gprof类似的分析系统。
- 一个具有许多基准代码和应用程序的测试框架。
- API和调试工具,可简化LLVM组件的快速开发。
LLVM优势特性
- LLVM使用具有严格定义语义的简单低级语言
- LLVM包含完整的C/C++前端,Java,Scheme和其他语言的前端正在开发中。
- LLVM包括一个积极的优化器,包括标量,过程间,配置文件驱动和一些简单的循环优化。
- LLVM支持终身编译模型,包括链接时,安装时,运行时和离线优化。
- LLVM完全支持准确的垃圾收集。
- LLVM代码生成器相对容易重新定位,并使用强大的目标描述语言。
- LLVM拥有丰富的文档,并且已经托管了许多各种项目。
- 许多第三方用户声称LLVM易于使用和开发。例如(现已删除的)Stacker前端是在4天内由一个对LLVM一无所知的人编写的。此外,LLVM还具有使开发更容易的工具。
- LLVM正在积极开发中,并且不断得到扩展,增强和改进。
- LLVM可在OSI批准的”three-clause BSD” license下免费获得。
- LLVM目前由多个商业实体,非营利或学术实体使用,他们贡献了许多扩展和新功能。
LLVM适用人群
- 对C和C ++程序的编译时,链接时(过程间)和运行时转换感兴趣的编译器研究人员;
- 对可移植的,与语言无关的指令集和编译框架感兴趣的虚拟机研究人员
- 对编译器/硬件技术感兴趣的架构研究员
- 对静态分析或插桩技术感兴趣的安全研究人员
- 想要快速开发编译器原型的教师或开发人员
- 希望获得更好性能的最终用户开发者