LLVM

title: 描述.
content: LLVM提供了完整编译系统的中间层,它会将中间语言(英语:Intermediate Representation,IR)从编译器取出与最佳化,最佳化后的IR接着被转换及链接到目标平台的汇编语言。LLVM可以接受来自GCC工具链所编译的IR,包含它底下现存的编译器。  LLVM也可以在编译时期、链接时期,甚至是执行时期产生可重新定位的程序码(Relocatable Code)。  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相同效能的执行码。
title: 编译器.
content: LLVM已经成为多个编译器和代码生成相关子项目的母项目。
title: 前端.
content: 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暂存器配置.
title: 中间端.
content: LLVM的核心是中间端表达式(英语:Intermediate Representation,IR),一种类似汇编的底层语言。IR是一种强类型的精简指令集(英语:Reduced Instruction Set Computing,RISC),并对目标指令集进行了抽象。例如,目标指令集的函数调用惯例被抽象为"call"和"ret"指令加上明确的参数。另外,IR采用无限个数的暂存器,使用如%0,%1等形式表达。LLVM支持三种表达形式:人类可读的汇编,在C++中对象形式和序列化后的bitcode形式。  例如,一个简单的Hello World程序可以表达为如下的汇编形式。对IR语言的完整描述请参考LLVM官方文档:
title: 后端.
content: 至3.4版本的LLVM已经支持多种后端指令集,比如ARM、Qualcomm Hexagon、MIPS、Nvidia并行指令集(PTX;在LLVM文档中被称为NVPTX),PowerPC、AMD TeraScale、AMD Graphics Core Next(GCN)、SPARC、z/Architecture(在LLVM文档中被称为SystemZ)、x86、x86-64和XCore。有部分平台功能并没有完全实现。但x86、x86-64、z/Architecture、ARM和PowerPC的基本所有功能都有实现。 RISC-V也在版本7中实现。  LLVM机器码(MC)子项目是LLVM将机器指令从文字形式转换至机器码的形式。在之前LLVM依靠系统或是平台专门的工具链将汇编翻译为机器码。LLVM机器码的集成汇编器已经支持绝大多数LLVM的目标平台,如x86、x86-64、ARM和ARM64。对另一些平台,如几种MIPS平台,汇编器支持已经加入但仍在beta阶段。
title: 链接器.
content: lld链接器子项目旨在为LLVM开发一个内置的,平台独立的链接器,去除对所有第三方链接器的依赖。在2017年5月,lld已经支持ELF、PE/COFF、 和Mach-O。在lld支持不完全的情况下,用户可以使用其他项目,如GNU ld链接器。 lld支持链接时优化。当LLVM链接时优化被启用时,LLVM可以输出bitcode而不是本机代码,而本机代码生成由链接器优化处理。
title: C++标准库.
content: LLVM项目包含一个C++标准库的实现,具有MIT许可证和UIUC许可证的双许可协议。

Summary: 英语:LLVM是一个自由软件专案,它是一种编译器基础设施,以C++写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种程序语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、执行时期以及“闲置时期”的最佳化。它最早以C/C++为实作对象,而目前它已支援包括ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Crystal、Rust、Scala以及C#等语言。

LLVM: The LLVM compiler infrastructure project is a set of compiler and toolchain technologies, which can be used to develop a front end for any programming language and a back end for any instruction set architecture. LLVM is designed around a language-independent intermediate representation (IR) that serves as a portable, high-level assembly language that can be optimized with a variety of transformations over multiple passes.