LLVM

LLVM[编辑]

LLVM
Low Level Virtual Machine Logo
开发者 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]

目录

   [隐藏] 
  • 1 描述
  • 2 编译器
  • 3 另见
  • 4 参考文献
  • 5 外部链接

描述[编辑]

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暂存器配置.[来源请求]

另见[编辑]

自由软件主题  自由软件主题首页
  • Clang C/C++编译器
  • GNU Compiler Collection
  • OpenGL

参考文献[编辑]

  1. ^ http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-December/046443.html
  2. ^ Reedy, Geoff. Compiling Scala to LLVM. St. Louis, Missouri, United States. 2012-09-24 [2013-02-19].
  3. ^ Mono LLVM, [2013-03-10]
  4. ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4
  5. ^ Chris Lattner discusses the name LLVM. [22 December 2011].
  6. ^ ACM Awards. ACM.
  7. ^ LLVM Language Reference Manual. [16 April 2012].
  8. ^ Chris Lattner. A cool use of LLVM at Apple: the OpenGL stack. LLVMdev mailing list. 15 August 2006 [26 October 2008].
  9. ^ Michael Larabel, "GNOME Shell Works Without GPU Driver Support", phoronix, 6 November 2011
  10. ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86. [3 October 2011].
  11. ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86_64. [3 October 2011].
  12. ^ Michael Larabel. LLVM/Clang 3.2 Compiler Competing With GCC. 27 December 2012 [31 March 2013].
  13. ^ Lattner, Chris; Vikram Adve. Architecture For a Next-Generation GCC, First Annual GCC Developers' Summit. May 2003 [6 September 2009].
  14. ^ Compiling Haskell To LLVM. [22 February 2009].
  15. ^ LLVM Project Blog: The Glasgow Haskell Compiler and LLVM. [13 August 2010].
  16. ^ 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项目
分类:
  • 编译器软件
  • 程序设计工具
  • 虚拟化软件
  • C语言家族

你可能感兴趣的:(编译器,后端)