한국   대만   중국   일본 
LLVM - ?基百科,自由的百科全? 跳?到?容

LLVM

本页使用了标题或全文手工转换
?基百科,自由的百科全?
LLVM
開發者 LLVM開發團隊
首次?布 2003
?前版本
  • 18.1.7 (2024年6月5日;穩定版本) [1]
編輯維基數據鏈接
源代?? 編輯維基數據鏈接
?程?言 C++
操作系? 跨平台
?型 編譯器
?可?? 帶有LLVM例外的 Apache?可? 2.0
?站 www .llvm .org

LLVM 是一套 ??器 基??施?目,? 自由?件 ,以 C++ 寫成,包含一系列模?化的??器?件和 工具? ,用?????器 前端 后端 。?是?了任意一種 程式語言 而寫成的程式,利用 虛擬技術 創造出 編譯時期 ?結時期 執行時期 以及“閒置時期”的最佳化。

?最早以 C / C++ ?實作對象,而目前?已支援包括 ActionScript Ada D語言 Fortran GLSL Haskell Java 字??、 Objective-C Swift Python Ruby Crystal Rust Scala [2] 以及 C# [3] 等?言。

?史 [ ?? ]

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

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

因LLVM對?業的貢獻, ?算机?? 於2012年? ACM?件系?? 授與維克拉姆·艾夫、克里斯·拉特納及 Evan Cheng [7]

自9.0.0版本?始,LLVM使用?有LLVM?外?款的 Apache?可? 2.0?行授? [8] 。而?2019年10月?始,LLVM?目的代?托管正式?移到了 GitHub [9]

描述 [ ?? ]

LLVM提供了一套适合??器系?的 中??言 Intermediate Representation ,IR),有大量??和?化都??其??。????和?化后的中??言,可以???目?平台相?的 ???言 代?。LLVM可以和 GCC 工具?一起工作,允??????目??的大量?有??器一起使用。LLVM?可以在??、?接?生成 可重新定位的程式碼 (Relocatable Code),甚至在?行?生成二?制机器?。

LLVM的中??言?具?的?言、指令集、?型系?无?,其中每?指令都是 ?????形式 (SSA), ?每??量只能被??一次。?有助于?化?量之?的依?分析。LLVM允?????代?,或者通? ???? (JIT)机制?中?表示???机器?(?似Java)。

LLVM支援與語言無關的 指令集架構 類型系統 [10] 。每個在 ?????形式 (SSA)的指令集代表著,每個 變數 (被稱?具有型別的暫存器)僅被賦?一次,這簡化了變數間相依性的分析。LLVM允許程式碼被靜態的編譯,包含在傳統的GCC系統底下,或是類似 JAVA 等後期編譯才將IF編譯成機器碼所使用的 ?時編譯 (JIT)技術。?的型別系統包含基本型別( 整數 或是 浮点? )及五個 複合型別 指標 ?? 、向量、結構及 函數 ),在LLVM具體語言的型別建制可以以結合基本型別來表示,?例來說,C++所使用的class可以被表示?結構、函式及 函?指? 的陣列所組成。

LLVM JIT編譯器可以最佳化在執行時期時程式所不需要的靜態分支,這在一些 部?求? (Partial Evaluation)的案例中相當有效,?當程式有許多選項,而在特定環境下其中多數可被判斷?是不需要。這個特色被使用在 Mac OS X Leopard (v10.5)底下 OpenGL 的管線,當硬體不支援某個功能時依然可以被成功地運作 [11] 。OpenGL堆?下的繪圖程式被編譯?IR,接著在機器上執行時被編譯,當系統擁有高階 GPU 時,這段程式會進行極少的修改?將傳遞指令給GPU,當系統擁有低階的GPU時,LLVM將會編譯更多的程序,使這段GPU無法執行的指令在本地端的 中央?理器 執行。LLVM增進了使用 Intel GMA 晶片等低端機器的效能。一個類似的系統發展於Gallium3D LLVMpipe,?已被合?到 GNOME ,使其可運行在沒有GPU的環境 [12]

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

編譯器 [ ?? ]

LLVM已?成?多???器和代?生成相?子?目的母?目。

前端 [ ?? ]

LLVM最初被用來取代GCC中的程式碼?生器 [16] ,許多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 [17] 。GCC底下Objective-C的開發已經停滯,而?果電腦已經將其支援移至其他的維護分支。

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

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

中?表示 [ ?? ]

LLVM的核心是中?表示( Intermediate Representation ,IR),一??似??的底??言。IR是一? 强?型 精?指令集 Reduced Instruction Set Computing ,RISC),??目?指令集?行了抽象。例如,目?指令集的函??用?例被抽象? call ret 指令加上明?的??。?外,IR采用无限??的?存器,使用如%0,%1等形式表?。LLVM支持三?表?形式:人?可?的??,在C++中?象形式和序列化后的bitcode形式。

例如,一???的 Hello World 程序可以表??如下的??形式。?IR?言的完整描述??考LLVM官方文? [21]

@.str
 =
 internal
 constant
 [
14
 x
 i8
]
 c
"hello, world\0A\00"


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

}

后端 [ ?? ]

至11.0版本,LLVM已?支持多?后端指令集,包括 ARM Qualcomm Hexagon 英? Qualcomm Hexagon MIPS Nvidia?行指令集 (LLVM中??NVPTX), PowerPC AMD TeraScale [22] AMDGPU 英? AMDGPU SPARC SystemZ RISC-V WebAssembly x86 x86-64 XCore

LLVM包含一???的MC模?,?机器指令在文字形式和机器?形式?相互??。在之前LLVM依?系?或是平台??的工具???????机器?。LLVM机器?的集成??器已?支持?大多?LLVM的目?平台。

?接器 [ ?? ]

lld?接器子?目旨在?LLVM??一??置的,平台?立的?接器 [23] ,去除?所有第三方?接器的依?。在2017年5月,lld已?支持 ELF PE/COFF 、 和 Mach-O 。在lld支持不完全的情?下,用?可以使用其他?目,如 GNU ld ?接器。 lld支持?接??化。?LLVM?接??化被?用?,LLVM可以?出bitcode而不是本机代?,而本机代?生成由?接器?化?理。

C++?准? [ ?? ]

LLVM?目包含一?C++?准?的??(libcxx),具有 MIT?可? UIUC?可? 的??可??。 [24]

?見 [ ?? ]

參考文獻 [ ?? ]

  1. ^ 1.0 1.1 LLVM 18.1.7 . 2024年6月5日 [2024年6月5日] .  
  2. ^ Reedy, Geoff. Compiling Scala to LLVM . St. Louis, Missouri, United States. 2012-09-24 [ 2013-02-19 ] . (原始?容 存? 于2020-11-29).  
  3. ^ Mono LLVM , [ 2013-03-10 ] , (原始?容 存? 于2020-06-15)  
  4. ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4 ?面存??? ,存于 互???案?
  5. ^ 存?副本 . [ 2011-12-22 ] . ( 原始?容 存?于2012-01-17).  
  6. ^ Chris Lattner discusses the name LLVM . [ 22 December 2011] . ( 原始?容 存?于2012年1月12日).  
  7. ^ ACM Awards . ACM. [ 2013-04-28 ] . ( 原始?容 存?于2012-04-02).  
  8. ^ LLVM 9.0.0 License . [ 2020-11-14 ] . (原始?容 存? 于2020-11-11).  
  9. ^ Migration Proposal . [ 2020-11-14 ] . (原始?容 存? 于2020-11-25).  
  10. ^ LLVM Language Reference Manual . [ 16 April 2012] . (原始?容 存? 于2012-06-11).  
  11. ^ Chris Lattner. A cool use of LLVM at Apple: the OpenGL stack . LLVMdev mailing list. 15 August 2006 [ 26 October 2008] . ( 原始?容 存?于2006年11月4日).  
  12. ^ Michael Larabel, "GNOME Shell Works Without GPU Driver Support" ?面存??? ,存于 互???案? ), phoronix , 6 November 2011
  13. ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86 . [ 3 October 2011] . (原始?容 存? 于2020-08-03).  
  14. ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86_64 . [ 3 October 2011] . (原始?容 存? 于2020-08-03).  
  15. ^ Michael Larabel. LLVM/Clang 3.2 Compiler Competing With GCC . 27 December 2012 [ 31 March 2013] . (原始?容 存? 于2020-11-30).  
  16. ^ Lattner, Chris ; Vikram Adve. Architecture For a Next-Generation GCC . First Annual GCC Developers' Summit. May 2003 [ 6 September 2009] . (原始?容 存? 于2020-07-07).  
  17. ^ Clang 3.8 Release Notes . [ August 24, 2016] . (原始?容 存? 于2016-10-31).  
  18. ^ Compiling Haskell To LLVM (PDF) . [ 26 June 2008] . (原始?容 存? (PDF) 于2016-08-06).  
  19. ^ LLVM Project Blog: The Glasgow Haskell Compiler and LLVM . [ 13 August 2010] . ( 原始?容 存?于2011-06-25).  
  20. ^ Gael Thomas; et al. VMKit: a substrate for virtual machines . LLVM.org. [ 2014-09-17 ] . (原始?容 存? 于2020-11-09).   VMKit 目前的??已?停?,?且只支持和 LLVM 3.3 ?同??。?更高版本的 LLVM,需要?源?做一些修改。VMKit 在???需要 LLVM 源?中的 lib, include
  21. ^ llvm .org /docs /LangRef .html .
  22. ^ Stellard, Tom. [LLVMdev] RFC: R600, a new backend for AMD GPUs . llvm-dev (?件列表). March 26, 2012 [ 2019-02-18 ] . (原始?容 存? 于2020-12-01).  
  23. ^ lld - The LLVM Linker . The LLVM Project. [ May 10, 2017] . (原始?容 存? 于2020-12-29).  
  24. ^ " libc++" C++ Standard Library . [ 2020-09-26 ] . ( 原始?容 存?于2017-04-29).  

外部連結 [ ?? ]