LLVM








body.skin-minerva .mw-parser-output table.infobox caption{text-align:center}










































LLVM

Low Level Virtual Machine Logo
開發者
LLVM開發團隊
初始版本
2003


穩定版本
8.0.0
(2019年3月20日,​20天前​(2019-03-20


源代码库
  • llvm.org/viewvc/llvm-project/
編輯維基數據鏈接
编程语言
C++
操作系统
跨平台
类型
編譯器
许可协议
伊利诺伊大学厄巴纳-香槟分校開源碼許可(University of Illinois/NCSA Open Source License)
网站
llvm.org

LLVM是一個自由軟體專案,它是一種編譯器基礎设施,以C++寫成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是為了任意一種程式語言而寫成的程式,利用虛擬技術創造出編譯時期、鏈結時期、執行時期以及“閒置時期”的最佳化。它最早以C/C++為實作對象,而目前它已支援包括ActionScript、Ada、D語言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Rust、Scala[1]以及C#[2]等语言。


LLVM專案的發展起源於2000年伊利诺伊大学厄巴纳-香槟分校維克拉姆·艾夫(Vikram Adve)與克里斯·拉特納(Chris Lattner)的研究,他們想要為所有靜態及動態語言創造出動態的編譯技術。LLVM是以BSD授權來發展的开源軟體。2005年,蘋果電腦雇用了克里斯·拉特納及他的團隊為蘋果電腦開發應用程式系統[3],LLVM為現今Mac OS X及iOS開發工具的一部分。


LLVM的命名最早源自於底層虛擬機器Low Level Virtual Machine)的首字母縮寫[4],由於這個專案的範圍並不侷限於建立一個虛擬機器,這個縮寫導致了廣泛的疑惑。LLVM開始成長之後,成為眾多編譯工具及低階工具技術的統稱,使得這個名字變得更不貼切,開發者因而決定放棄這個縮寫的意涵[5],現今LLVM已單純成為一個品牌,適用於LLVM下的所有專案,包含LLVM中介碼(LLVM IR)、LLVM除錯工具、LLVM C++標準函式庫等。


因LLVM對產業的貢獻,计算机协会於2012年将ACM软件系统奖授與維克拉姆·艾夫、克里斯·拉特納及Evan Cheng[6]




目录






  • 1 描述


  • 2 編譯器


    • 2.1 前端


    • 2.2 中间端


    • 2.3 后端


    • 2.4 链接器


    • 2.5 C++标准库




  • 3 另見


  • 4 參考文獻


  • 5 外部連結





描述


LLVM提供了完整編譯系統的中間層,它會將中間語言(Intermediate Representation,IR)從編譯器取出與最佳化,最佳化後的IR接著被轉換及鏈結到目標平台的汇编语言。LLVM可以接受來自GCC工具鏈所編譯的IR,包含它底下現存的編譯器。


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堆栈下的繪圖程式被編譯為IR,接著在機器上執行時被編譯,當系統擁有高階GPU時,這段程式會進行極少的修改並將傳遞指令給GPU,當系統擁有低階的GPU時,LLVM將會編譯更多的程序,使這段GPU無法執行的指令在本地端的中央处理器執行。LLVM增進了使用Intel GMA晶片等低端機器的效能。一個類似的系統發展於Gallium3D LLVMpipe,它已被合併到GNOME,使其可運行在沒有GPU的環境[9]


根據2011年的一项測試,GCC在執行時期的性能平均比LLVM高10%[10][11]。而2013年測試显示,LLVM可以編譯出接近GCC相同效能的執行碼[12]



編譯器


LLVM已经成为多个编译器和代码生成相关子项目的母项目。



前端


LLVM最初被用來取代現有於GCC堆栈的程式碼產生器[13],許多GCC的前端已經可以與其運行,LLVM目前支援Ada、C语言、C++、D語言、Fortran、Haskell、Julia (编程语言)、Objective-C、Rust及Swift (程式语言)的編譯,它使用許多的編譯器,有些來自4.0.1及4.2的GCC。


LLVM引發一些人來為許多語言開發新的編譯器,其中一個最引發注意的就是Clang,它是一個新的編譯器,同時支援C、Objective-C以及C++。主要來自蘋果電腦的支持,Clang的目的用以取代GCC系統底下的C/Objective-C編譯器,在當代的系統,他較為容易與集成开发环境(IDE)整合,而且對於线程有更好的支援。Clang从3.8版本开始已经支持OpenMP[14]。GCC底下Objective-C的開發已經停滯,而蘋果電腦已經將其支援移至其他的維護分支。


Utrecht Haskell編譯器可以產生LLVM使用的程式碼,但它還在初期的開發階段,並且在許多案例,展示他比起C程式碼產生器擁有更好的效率[15]Glasgow Haskell Compiler(GHC)擁有一個可以運作的LLVM後端,程式執行效能對比起原先的編譯器可以達到30%的加速,它僅比一個由GHC所實現,並擁有多項最佳化技術的編譯器還慢[16]


還有其他的元件在不同的開發階段,包含(但不限於)Java bytecode[17]、通用中间语言(CIL)、MacRuby(實現Ruby 1.9)、Standard ML及新的graph coloring暫存器配置. [來源請求]



中间端


LLVM的核心是中间端表达式(Intermediate Representation,IR),一种类似汇编的底层语言。IR是一种强类型的精简指令集(Reduced Instruction Set Computing,RISC),并对目标指令集进行了抽象。例如,目标指令集的函数调用惯例被抽象为callret指令加上明确的参数。另外,IR采用无限个数的暂存器,使用如%0,%1等形式表达。LLVM支持三种表达形式:人类可读的汇编,在C++中对象形式和序列化后的bitcode形式。


例如,一个简单的Hello World程序可以表达为如下的汇编形式。对IR语言的完整描述请参考LLVM官方文档[18]


@.str = internal constant [14 x i8] c"hello, worldA0"

declare i32 @printf(i8*, ...)

define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
%tmp1 = getelementptr [14 x i8], [14 x i8]* @.str, i32 0, i32 0
%tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind
ret i32 0
}


后端


至3.4版本的LLVM已经支持多种后端指令集,比如ARM、Qualcomm Hexagon、MIPS、Nvidia并行指令集(PTX;在LLVM文档中被称为NVPTX),PowerPC、AMD TeraScale[19]、AMD Graphics Core Next(GCN)、SPARC、z/Architecture(在LLVM文档中被称为SystemZ)、x86、x86-64和XCore。有部分平台功能并没有完全实现。但x86、x86-64、z/Architecture、ARM和PowerPC的基本所有功能都有实现。[20]RISC-V也在版本7中实现。


LLVM机器码(MC)子项目是LLVM将机器指令从文字形式转换至机器码的形式。在之前LLVM依靠系统或是平台专门的工具链将汇编翻译为机器码。LLVM机器码的集成汇编器已经支持绝大多数LLVM的目标平台,如x86、x86-64、ARM和ARM64。对另一些平台,如几种MIPS平台,汇编器支持已经加入但仍在beta阶段。



链接器


lld链接器子项目旨在为LLVM开发一个内置的,平台独立的链接器[21],去除对所有第三方链接器的依赖。在2017年5月,lld已经支持ELF、PE/COFF、 和Mach-O。在lld支持不完全的情况下,用户可以使用其他项目,如GNU ld链接器。
lld支持链接时优化。当LLVM链接时优化被启用时,LLVM可以输出bitcode而不是本机代码,而本机代码生成由链接器优化处理。



C++标准库


LLVM项目包含一个C++标准库的实现,具有MIT许可证和UIUC许可证的双许可协议。[22]



另見




  • Clang C/C++編譯器


  • GNU Compiler Collection(GCC)

  • OpenGL



參考文獻





  1. ^ Reedy, Geoff. Compiling Scala to LLVM. St. Louis, Missouri, United States. 2012-09-24 [2013-02-19]. 


  2. ^ Mono LLVM, [2013-03-10] 


  3. ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4 互联网档案馆的存檔,存档日期2011-10-04.


  4. ^ 存档副本. [2011-12-22]. (原始内容存档于2012-01-17). 


  5. ^ Chris Lattner discusses the name LLVM. [22 December 2011]. (原始内容存档于2012年1月12日). 


  6. ^ ACM Awards. ACM. (原始内容存档于2012-04-02). 


  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]. (原始内容存档于2006年11月4日). 



  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].  引文使用过时参数coauthors (帮助)



  14. ^ Clang 3.8 Release Notes. [August 24, 2016]. 


  15. ^
    Compiling Haskell To LLVM (PDF). [26 June 2008]. 



  16. ^
    LLVM Project Blog: The Glasgow Haskell Compiler and LLVM. [13 August 2010]. 



  17. ^ Gaël Thomas; 等. VMKit: a substrate for virtual machines. LLVM.org.  引文格式1维护:显式使用等标签 (link) VMKit 目前的开发已经停滞,并且只支持和 LLVM 3.3 协同编译。对更高版本的 LLVM,需要对源码做一些修改。VMKit 在编译时需要 LLVM 源码中的lib, include


  18. ^ llvm.org/docs/LangRef.html.


  19. ^ Stellard, Tom. [LLVMdev] RFC: R600, a new backend for AMD GPUs. llvm-dev (邮件列表). March 26, 2012. 


  20. ^ Target-specific Implementation Notes: Target Feature Matrix // The LLVM Target-Independent Code Generator, LLVM site.


  21. ^ lld - The LLVM Linker. The LLVM Project. [May 10, 2017]. 


  22. ^ "libc++" C++ Standard Library. 




外部連結



  • 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專案




Popular posts from this blog

Lambaréné

Chris Pine

Kashihara Line