LLVM

  • 是一套编译器基础设施项目 官网:llvm.org

编译器(compiler)是一种计算机程序,它会将某种编程语言写成的源代码(原始语言)转换成另一种编程语言(目标语言)。

  • 以C++写成,包含一系列模块化的编译器组件和工具链
  • 它最早以C/C++为实现对象,而目前它已支持包括ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java字节码、Objective-C之内的编程语言
  • LLVM的命名最早源自于底层虚拟机(Low Level Virtual Machine)的首字母缩写,后成为众多编译工具及低端工具技术的统称 。
  • LLVM最初是伊利诺伊大学的一个研究项目,目标是提供一个现代的、基于SSA的编译策略,能够支持任意编程语言的静态和动态编译。从那时起,LLVM已经发展成为一个由一些子项目组成的伞式项目,其中许多项目正在被各种商业和开源项目用于生产,并广泛用于学术研究。LLVM项目中的代码根据“带有LLVM例外的Apache 2.0许可证”授权

LLVM项目

  • LLVM项目是模块化和可重用的编译器和工具链技术的集合(The LLVM Project is a collection of modular and reusable compiler and toolchain technologies)。尽管LLVM的名称与传统虚拟机几乎没有关系。“LLVM”这个名字本身不是首字母缩略词。现今LLVM已单纯成为一个品牌,适用于LLVM下的所有项目,包含LLVM中介码(LLVM IR)、LLVM调试工具、LLVM C++标准库等。

LLVM描述

可供参考:https://llvm.org/pubs/2008-10-04-ACAT-LLVM-Intro.pdf

中间语言Intermediate Representation (IR)

在计算机科学中,是指一种应用于抽象机器(abstract machine)的编程语言,它设计的目的,是用来帮助我们分析计算机程序。这个术语源自于编译器,在编译器将源代码编译为目的码的过程中,会先将源代码转换为一个或多个的中间表述,以方便编译器进行最佳化,并产生出目的机器的机器语言。

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

可重定位代码是可以改变执行地址的软件。 一个可重定位程序可能在一个实例中运行在地址 0,而在另一个实例中运行在 10000。(Relocatable code is software whose execution address can be changed. A relocatable program might run at address 0 in one instance, and at 10000 in another.)

LLVM支持与语言无关的指令集架构及类型系统[10]。每个在静态单赋值形式(SSA)的指令集代表着,每个变量(被称为具有类型的寄存器)仅被赋值一次,这简化了变量间相依性的分析。LLVM允许代码被静态的编译,包含在传统的GCC系统底下,或是类似JAVA等后期编译才将IF编译成机器代码所使用的即时编译(JIT)技术。它的类型系统包含基本类型(整数或是浮点数)及五个复合类型(指针、数组、向量、结构及函数),在LLVM具体语言的类型建制可以以结合基本类型来表示,举例来说,C++所使用的class可以被表示为结构、函数及函数指针的数组所组成。

LLVM JIT编译器可以优化在运行时期时程序所不需要的静态分支,这在一些部分求值(Partial Evaluation)

部分求值:在“部分求值”(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%。而2013年测试显示,LLVM可以编译出接近GCC相同性能的运行码。

LLVM的主要子项目

  • LLVM Core
  • Clang
  • LLDB(基于LLVM和Clang提供的库)
  • libc++&libc++ABI
  • MLIR
  • OpenMP
  • Polly
  • libclc
  • LLD

相关资料来源

http://www.ganssle.com/articles/arelocat.htm

https://zh.m.wikipedia.org/wiki/LLVM

https://llvm.org

https://zh.wikipedia.org/wiki/中間語言

https://zh.m.wikipedia.org/wiki/求值策略#Partial_evaluation

最后修改:2021 年 10 月 10 日 04 : 08 AM
如果你喜欢我的文章,不妨赞赏一下。