本节书摘来自华章计算机《编译与反编译技术实战》一书中的第1章,第1.5节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.5 编译器LLVM
LLVM是构架编译器的框架系统,由C++编写而成,用于优化以任意程序语言编写的程序的编译时间、链接时间、运行时间以及空闲时间,对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由伊利诺伊大学香槟分校的Chris Lattner主持开展。2006年Chris Lattner加盟Apple公司并致力于LLVM在Apple开发体系中的应用。Apple公司也是LLVM计划的主要资助者。
LLVM的命名最早源自于Low Level Virtual Machine(底层虚拟机)的缩写,由于命名带来的混乱,目前LLVM就是该项目的全称。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。LLVM提供一个现代化的、基于SSA的编译策略,能够同时支持静态和动态的任意编程语言的编译目标。至今为止,LLVM已被应用到许多商业和开源的项目,并被广泛用于学术研究。
LLVM荣获2012年ACM软件系统奖。
对关注编译技术的开发人员,LLVM提供了很多优点:
1)现代化的设计。LLVM的设计是高度模块化的,使得其代码更为清晰和便于排查问题所在。
2)语言无关的中间代码。一方面,这使得通过LLVM能够将不同的语言相互联结起来,也使得LLVM能够紧密地与IDE交互和集成。另一方面,发布中间代码而非目标代码能够在目标系统上更好地发挥其潜能而又不影响可调试性(比如,在目标系统上针对本机的硬件环境产生目标代码,但又能够直接通过中间代码来进行行级调试)。
3)可作为工具和函数库。使用LLVM提供的工具可以比较容易地实现新的编程语言的优化编译器或虚拟机,或为现有的编程语言引入一些更好的优化/调试特性。