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
、
MIPS
、
Nvidia?行指令集
(LLVM中??NVPTX),
PowerPC
、
AMD TeraScale
[22]
、
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.0
1.1
LLVM 18.1.7
. 2024年6月5日
[2024年6月5日]
.
- ^
Reedy, Geoff.
Compiling Scala to LLVM
. St. Louis, Missouri, United States. 2012-09-24
[
2013-02-19
]
. (原始?容
存?
于2020-11-29).
- ^
Mono LLVM
,
[
2013-03-10
]
, (原始?容
存?
于2020-06-15)
- ^
Adam Treat,
mkspecs and patches for LLVM compile of Qt4
(
?面存???
,存于
互???案?
)
- ^
存?副本
.
[
2011-12-22
]
. (
原始?容
存?于2012-01-17).
- ^
Chris Lattner discusses the name LLVM
.
[
22 December
2011]
. (
原始?容
存?于2012年1月12日).
- ^
ACM Awards
. ACM.
[
2013-04-28
]
. (
原始?容
存?于2012-04-02).
- ^
LLVM 9.0.0 License
.
[
2020-11-14
]
. (原始?容
存?
于2020-11-11).
- ^
Migration Proposal
.
[
2020-11-14
]
. (原始?容
存?
于2020-11-25).
- ^
LLVM Language Reference Manual
.
[
16 April
2012]
. (原始?容
存?
于2012-06-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日).
- ^
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]
. (原始?容
存?
于2020-08-03).
- ^
V. Makarov.
SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86_64
.
[
3 October
2011]
. (原始?容
存?
于2020-08-03).
- ^
Michael Larabel.
LLVM/Clang 3.2 Compiler Competing With GCC
. 27 December 2012
[
31 March
2013]
. (原始?容
存?
于2020-11-30).
- ^
Lattner, Chris
; Vikram Adve.
Architecture For a Next-Generation GCC
. First Annual GCC Developers' Summit. May 2003
[
6 September
2009]
. (原始?容
存?
于2020-07-07).
- ^
Clang 3.8 Release Notes
.
[
August 24,
2016]
. (原始?容
存?
于2016-10-31).
- ^
Compiling Haskell To LLVM
(PDF)
.
[
26 June
2008]
. (原始?容
存?
(PDF)
于2016-08-06).
- ^
LLVM Project Blog: The Glasgow Haskell Compiler and LLVM
.
[
13 August
2010]
. (
原始?容
存?于2011-06-25).
- ^
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
。
- ^
llvm
.org
/docs
/LangRef
.html
.
- ^
Stellard, Tom.
[LLVMdev] RFC: R600, a new backend for AMD GPUs
. llvm-dev (?件列表). March 26, 2012
[
2019-02-18
]
. (原始?容
存?
于2020-12-01).
- ^
lld - The LLVM Linker
. The LLVM Project.
[
May 10,
2017]
. (原始?容
存?
于2020-12-29).
- ^
"
libc++" C++ Standard Library
.
[
2020-09-26
]
. (
原始?容
存?于2017-04-29).
外部連結
[
??
]