是一套编译器基础设施项目，为自由软件，以C++寫成，包含一系列模块化的编译器组件和工具链，用来开发编译器前端和后端。它是為了任意一種程式語言而寫成的程式，利用虛擬技術創造出編譯時期、鏈結時期、執行時期以及"閒置時期"的最佳化。

它最早以C/C++為實作對象，而目前它已支援包括ActionScript、Ada、D語言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Crystal、Rust、Scala以及C#等语言。

历史
--

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

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

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

自9.0.0版本开始，LLVM使用带有LLVM额外条款的Apache许可证2.0进行授权。而从2019年10月开始，LLVM项目的代码托管正式迁移到了GitHub。

| 程序执行（英语：） |
| --- |
| 
基础概念 |
| * 代码
* 翻译器
	+ 編譯器
	+ 优化编译器
* 中間語言
* 程序执行（英语：）
	+ 运行时系统
		- 執行期
	+ 執行檔
	+ 
	+ 虛擬機器
 |
| 
代码类型 |
| * 源代码
* 目标代码
* 字节码
* 机器代码
* 微程序
 |
| 
编译策略 |
| * 即時編譯（JIT）
	+ 跟踪即时编译（英语：）
* 提前编译（英语：）（AOT）
* 源代码至源代码编译器
* 动态重编译
 |
| 
知名运行环境 |
| * Android Runtime（ART）
* 通用語言運行庫（CLR）
* crt0
* Java虚拟机（JVM）
* V8
	+ Node.js
* PyPy
* Zend引擎
 |
| 
著名编译器及工具链 |
| * GNU编译器套裝（GCC）
* LLVM
	+ Clang
 |
| * 
* 论
* 编
 |

描述
--

LLVM提供了一套适合编译器系统的中间语言（，IR），有大量变换和优化都围绕其实现。经过变换和优化后的中间语言，可以转换为目标平台相关的汇编语言代码。LLVM可以和GCC工具链一起工作，允许它与为该项目编写的大量现有编译器一起使用。LLVM还可以在编译、链接时生成可重新定位的程式碼（Relocatable Code），甚至在运行时生成二进制机器码。

LLVM的中间语言与具体的语言、指令集、类型系统无关，其中每条指令都是静态单赋值形式（SSA）， 即每个变量只能被赋值一次。这有助于简化变量之间的依赖分析。LLVM允许静态编译代码，或者通过实时编译（JIT）机制将中间表示转换为机器码（类似Java）。

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

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

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

編譯器
---

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

### 前端

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

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

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

### 中间表示

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

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

```
@.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、AMDGPU（英语：）、SPARC、SystemZ、RISC-V、WebAssembly、x86、x86-64和XCore。

LLVM包含一个专门的MC模块，将机器指令在文字形式和机器码形式间相互转换。在之前LLVM依靠系统或是平台专门的工具链将汇编翻译为机器码。LLVM机器码的集成汇编器已经支持绝大多数LLVM的目标平台。

### 链接器

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

### C++标准库

LLVM项目包含一个C++标准库的实现（libcxx），具有MIT许可证和UIUC许可证的双许可协议。

另見
--

* 自由软件主题

* Clang C/C++編譯器
* GNU lightning
* GNU Compiler Collection（GCC）
* OpenGL

參考文獻
----

1. ↑ . 2023年11月28日  [2023年11月29日] （英語）.  引文格式1维护：未识别语文类型 (link)
2. ↑  Reedy, Geoff.. St. Louis, Missouri, United States. 2012-09-24  [2013-02-19]. （原始内容存档于2020-11-29）.
3. ↑  ,  [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. ↑ .  [22 December 2011]. （原始内容存档于2012年1月12日）.
7. ↑ . ACM.  [2013-04-28]. （原始内容存档于2012-04-02）.
8. ↑ .  [2020-11-14]. （原始内容存档于2020-11-11）.
9. ↑ .  [2020-11-14]. （原始内容存档于2020-11-25）.
10. ↑ .  [16 April 2012]. （原始内容存档于2012-06-11）.
11. ↑  Chris Lattner.. 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..  [3 October 2011]. （原始内容存档于2020-08-03）.
14. ↑  V. Makarov..  [3 October 2011]. （原始内容存档于2020-08-03）.
15. ↑  Michael Larabel.. 27 December 2012  [31 March 2013]. （原始内容存档于2020-11-30）.
16. ↑  Lattner, Chris; Vikram Adve.. First Annual GCC Developers' Summit. May 2003  [6 September 2009]. （原始内容存档于2020-07-07）.  引文使用过时参数`coauthors` (帮助)
17. ↑ .  [August 24, 2016]. （原始内容存档于2016-10-31）.
18. ↑   (PDF).  [26 June 2008]. （原始内容存档 (PDF)于2016-08-06）.
19. ↑ .  [13 August 2010]. （原始内容存档于2011-06-25）.
20. ↑  Gaël Thomas; et al.. LLVM.org.  [2014-09-17]. （原始内容存档于2020-11-09）.  引文格式1维护：显式使用等标签 (link) VMKit 目前的开发已经停滞，并且只支持和 LLVM 3.3 协同编译。对更高版本的 LLVM，需要对源码做一些修改。VMKit 在编译时需要 LLVM 源码中的`lib, include`。
21. ↑  llvm.org/docs/LangRef.html.
22. ↑  Stellard, Tom.. llvm-dev (邮件列表). March 26, 2012  [2019-02-18]. （原始内容存档于2020-12-01）.
23. ↑ . The LLVM Project.  [May 10, 2017]. （原始内容存档于2020-12-29）.
24. ↑ .  [2020-09-26]. （原始内容存档于2017-04-29）.

外部連結
----

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