您的位置:首页 > 其它

LLVM

2015-02-03 00:00 344 查看
摘要: LLVM,命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写[1]。它是一个编译器的基础建设,以C++写成。它是为了任意一种编程语言写成的程序,利用虚拟技术,创造出编译时期,链结时期,运行时期以及“闲置时期”的优化。

LLVM[编辑]




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++为实现对象,目前它支持了包括ActionScriptAda、D语言、FortranGLSLHaskellJava bytecode、Objective-CSwiftPythonRubyRustScala[2]以及C♯[3]

LLVM项目起源于2000年伊利诺伊大学厄巴纳-香槟分校维克拉姆·艾夫(Vikram Adve)与克里斯·拉特纳(Chris Lattner)的研究发展而成,他们想要为所有静态及动态语言创造出动态的编译技术。LLVM是以BSD授权来发展的开源码软件。在2005年,苹果电脑雇用了克里斯·拉特纳及他的团队,为了苹果电脑开发应用程序系统[4],LLVM为现今Mac OS XiOS开发工具的一部分。

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目前支持AdaC语言C++D语言FortranObjective-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

参考文献[编辑]

^ 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项目

分类

编译器软件

程序设计工具

虚拟化软件

C语言家族
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  后端 编译器