LLVM[编辑]
开发者 | LLVM开发团队 |
---|---|
初始版本 | 2003 |
稳定版本 | 3.5(2014年9月4日,4个月前) |
编程语言 | C++ |
操作系统 | 跨平台 |
类型 | 编译器 |
许可协议 | 伊利诺伊大学厄巴纳-香槟分校开源码许可(University of Illinois/NCSA Open Source License) |
网站 | llvm.org |
LLVM,命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写[1]。它是一个编译器的基础建设,以C++写成。它是为了任意一种编程语言写成的程序,利用虚拟技术,创造出编译时期,链结时期,运行时期以及“闲置时期”的优化。它最早是以C/C++为实现对象,目前它支持了包括ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java bytecode、Objective-C、Swift、Python、Ruby、Rust、Scala[2]以及C♯[3]。
LLVM项目起源于2000年伊利诺伊大学厄巴纳-香槟分校维克拉姆·艾夫(Vikram Adve)与克里斯·拉特纳(Chris Lattner)的研究发展而成,他们想要为所有静态及动态语言创造出动态的编译技术。LLVM是以BSD授权来发展的开源码软件。在2005年,苹果电脑雇用了克里斯·拉特纳及他的团队,为了苹果电脑开发应用程序系统[4],LLVM为现今Mac OS X及iOS开发工具的一部分。
LLVM的起名为Low Level Virtual Machine的首字字母缩写,由于这个项目的范围并不局限于创建一个虚拟机,所以这个缩写导致了广泛的疑惑。之后,LLVM开始成长,他成为众多编译工具及低级工具技术的统称,这使得这个名字变得更不贴切,所以这个项目放弃了这个缩写的意涵[5],现今LLVM已经单纯成为一个品牌,适用于LLVM底下的所有项目,包含LLVM中介码(LLVM IR)、LLVM除错工具、LLVM C++标准库...等。
因LLVM对产业的贡献,计算机协会于2012年授与Adve、Lattner及Evan ChengACM软件系统奖[6]。
描述[编辑]
LLVM提供了完整编译系统的中间层,它会将中间语言(IF, Intermediate form)从编译器取出与优化,优化后的IF接着被转换及链结到目标平台的汇编语言。LLVM可以接受来自GCC工具链所编译的IF,包含它底下现存的编译器。
LLVM也可以在编译时期、链结时期,甚至是运行时期产生可重新定位的代码(Relocatable Code)。
LLVM支持与语言无关的指令集架构及类型系统[7]。每个在静态单赋值形式(SSA)的指令集代表着,每个变量(被称为具有类型的暂存器)仅被赋值一次,这简化了变量间相依性的分析。LLVM允许代码被静态的编译,包含在传统的GCC系统底下,或是类似JAVA等后期编译才将IF编译成机器码所使用的实时编译(JIT)技术。它的类型系统包含基本类型(整数或是浮点数)及五个复合类型(指针、数组、矢量、结构及函数),在LLVM具体语言的类型建制可以以结合基本类型来表示,举例来说,C++所使用的class可以被表示为结构、函数及函数指针的数组所组成。
LLVM JIT编译器可以优化在运行时期时,程序所不需要的静态分支,这在一些部份求值(Partial Evaluation)的案例是相当有效,当程序有许多选项,在特定环境之下多数是可被判断为不需要的。这个特色被使用在Mac OS X Leopard(v10.5)底下OpenGL的管线,当硬件不支持某个功能时依然可以被成功地运作[8]。OpenGL stack底下的绘图程序被编译为IF,接着在机器上运行时被编译,当系统拥有高级GPU时,这段程序会进行极少的修改并将传递指令给GPU,当系统拥有低级的GPU时,LLVM将会编译更多的程序,使这段GPU无法运行的指令,在本地端的中央处理器运行。LLVM增进了使用Intel GMA芯片等低端机器的性能。一个类似的系统发展于Gallium3D LLVMpipe,被合并进GNOME,使其可运行在没有GPU的环境[9]。
根据2011年的测试,运行时期的性能,平均GCC比LLVM高出10%的性能[10][11]。2013年的测试结果,LLVM可以编译出接近与GCC接近相同性能的运行码[12]。
编译器[编辑]
LLVM最初被用来取代现有于GCC stack的代码产生器[13],许多GCC的前端已经可以与其运行,LLVM目前支持Ada、C语言、C++、D语言、Fortran及Objective-C的编译,它使用许多的编译器,有些来自4.0.1及4.2的GCC。
LLVM引发一些人来为许多语言开发新的编译器,其中一个最引发注意的就是Clang,它是一个新的编译器,同时支持C、Objective-C以及C++。主要来自苹果电脑的支持,Clang的目的用以取代GCC系统底下的C/Objective-C编译器,在当代的系统,他较为容易与集成开发环境(IDE)集成,而且对于线程有更好的支持。GCC底下Objective-C的开发已经停滞,而苹果电脑已经将其支持移至其他的维护分支。
Utrecht Haskell编译器可以产生LLVM使用的代码,但它还在初期的开发阶段,并且在许多案例,展示他比起C代码产生器拥有更好的效率[14] Glasgow Haskell Compiler(GHC)拥有一个可以运作的LLVM后端,程序运行性能对比起原先的编译器可以达到30%的加速,它仅比一个由GHC所实现,并拥有多项优化技术的编译器还慢[15]
还有其他的组件在不同的开发阶段,包含(但不限于)Java bytecode[16]、通用中间语言(CIL)、MacRuby(实现Ruby 1.9)、Standard ML及新的graph coloring暂存器配置.[来源请求]
另见[编辑]
参考文献[编辑]
- ^ http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-December/046443.html
- ^ Reedy, Geoff. Compiling Scala to LLVM. St. Louis, Missouri, United States. 2012-09-24 [2013-02-19].
- ^ Mono LLVM, [2013-03-10]
- ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4
- ^ Chris Lattner discusses the name LLVM. [22 December 2011].
- ^ ACM Awards. ACM.
- ^ LLVM Language Reference Manual. [16 April 2012].
- ^ Chris Lattner. A cool use of LLVM at Apple: the OpenGL stack. LLVMdev mailing list. 15 August 2006 [26 October 2008].
- ^ Michael Larabel, "GNOME Shell Works Without GPU Driver Support", phoronix, 6 November 2011
- ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86. [3 October 2011].
- ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86_64. [3 October 2011].
- ^ Michael Larabel. LLVM/Clang 3.2 Compiler Competing With GCC. 27 December 2012 [31 March 2013].
- ^ Lattner, Chris; Vikram Adve. Architecture For a Next-Generation GCC, First Annual GCC Developers' Summit. May 2003 [6 September 2009].
- ^ Compiling Haskell To LLVM. [22 February 2009].
- ^ LLVM Project Blog: The Glasgow Haskell Compiler and LLVM. [13 August 2010].
- ^ Gaël Thomas, et al. VMKit: a substrate for virtual machines. LLVM.org. VMKit 目前的开发已经停滞,并且只支持和 LLVM 3.3 协同编译。对更高版本的 LLVM,需要对源码做一些修改。VMKit 在编译时需要 LLVM 源码中的lib, include。
外部链接[编辑]
- LLVM计划官方网站
- LLVM Project Blog
- LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation—a published paper by Chris Lattner and Vikram Adve.
- LLVM Language Reference Manual—describes the LLVM intermediate representation.
- LLVM 2.0 Presentation—Google Tech Talk Presentation on LLVM 2.0
- Discussion of LLVM by John Siracusa at Ars Technica
- LLVM内部结构(The Architecture of Open Source Applications, Volume II - ISBN 9781105571817)
- LLVMLinux项目