LLVM

维基百科,自由的百科全书
跳转至: 导航搜索
LLVM
Low Level Virtual Machine Logo
開發者 LLVM開發團隊
初始版本 2003
穩定版本 3.5 / 2014年9月4日;17天前 (2014-09-04)
编程语言 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

外部連結[编辑]