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: LLVM (früher Low Level Virtual Machine) ist eine modulare Compiler-Unterbau-Architektur mit einem virtuellen Befehlssatz, einer virtuellen Maschine, die einen Hauptprozessor virtualisiert, und einem übergreifend optimierenden Übersetzungskonzept. Kennzeichnend ist unter anderem, dass sämtliche Zeitphasen eines Programms (Laufzeit, Compilezeit, Linkzeit) inklusive der Leerlauf-Phase zur Optimierung herangezogen werden können. Der Zweck ist, einfach eigene Frontends für verschiedene Sprachen zu entwickeln, die die LLVM-Zwischensprache benutzen. Um die Erzeugung des Maschinen- bzw. VM-Codes kümmert sich die LLVM-Bibliothek, die vom Frontend aus aufgerufen wird.