文档章节

LLVM

seeu
 seeu
发布于 2015/02/03 11:19
字数 2034
阅读 47
收藏 0

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++为实现对象,目前它支持了包括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]

描述[编辑]

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

另见[编辑]

参考文献[编辑]

  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。

外部链接[编辑]

本文转载自:http://zh.wikipedia.org/wiki/LLVM

上一篇: Clang
下一篇: 2015-02-02
seeu
粉丝 2
博文 22
码字总数 7965
作品 0
广州
程序员
私信 提问
蛋蛋/Llvm.NET

Llvm.NET Welcome to Llvm.NET! Llvm.NET provides LLVM language and runtime bindings for .NET based applications. Llvm.NET's goal is to provide as robust Class library that accura......

蛋蛋
2016/11/13
0
0
llvm每日谈之一 llvm是什么

作者:snsn1984 写在前面的话: 最近接触llvm比较多,在这个上面花了不少的时间。感 觉llvm要完全理解透是个很不容易的事情,需要在学习过程中好好的整理下自己的思路。刚好又阅读了开源项目...

snsn1984
2012/10/31
0
11
LLVM每日谈之六 LLVM的源码结构

作者:snsn1984 这里简单介绍下LLVM的源码结构,让大家知道LLVM的每个文件夹都放的是什么内容。 参考文档: http://llvm.org/docs/GettingStarted.html#getting-started llvm/examples 这个目...

snsn1984
2012/11/11
0
2
LLVM每日谈之十 LLVM Test简介

作者:snsn1984 就像很多优秀的软件都有自己的测试框架一样,LLVM也有自己的测试框架。LLVM的测试主要分为两 部分:regression tests 和 whole programs。其中,regression tests主要位于LLV...

snsn1984
2013/02/28
0
0
什么是 LLVM?Swift, Rust, Clang 等语言背后的支持

了解以构架编译器框架系统(LLVM)生成原生机器代码如何比以往更容易推出新语言并增强现有语言 改进新语言和现有的语言在整个开发环境中正在蓬勃发展。Mozilla 的 Rust、Apple 的 Swift、Jetbr...

oschina
2018/02/08
4.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java的线程同步和并发问题示例

并发问题 多线程是一个非常强大的工具,它使我们能够更好地利用系统的资源,但我们需要在读取和写入多个线程共享的数据时特别小心。 当多个线程尝试同时读取和写入共享数据时,会出现两种类型...

hiuh
今天
3
0
Spring Boot 常用注解说明

实体类 @Entity (实体类注解) @Table(可指定表名) @Data(可缺省get/set) @Id (指定属性主键) @GeneratedValue(指定主键生成规则)

兜兜毛毛
今天
3
0
局域网能互相ping通,ubuntu虚拟机不能上外网

【问题】 桥接模式老是无法上网,查看本机IP发现被分配了一个私网地址,猜测应该是虚拟DHCP服务器没有打开,于是查看Ubuntu的网络配置: /etc/network/interfaces 发现没有dhcp配置的信息,只...

tahiti_aa
今天
2
0
以太坊助记词PHP开发包简介

以太坊助记词PHP开发包用来为PHP以太坊应用增加助记词和层级确定密钥支持能力。下载地址:以太坊助记词php开发包 。 1、开发包概述 以太坊助记词PHP开发包主要包括以下特性: 生成符合BIP39...

汇智网教程
昨天
4
0
系统监控-分布式调用链Skywalking

1. 为什么要使用分布式调用链技术? 随着公司业务的高速发展,公司服务之间的调用关系愈加复杂,如何理清并跟踪它们之间的调用关系就显的比较关键。线上每一个请求会经过多个业务系统,并产生...

秋日芒草
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部