LLVM/Clang

   LLVM自己并不是编译器,是开源的编译器(compiler)架构,是一套用于开发编译器、解释器等程序语言相关工具的库,主要聚焦于编译器后端功能,如代码生成、代码优化、JIT等。前端

   Clang是一个基于LLVM开发的C/C++/Obj-C编译器。有一套独立的前端,后端直接採用LLVM。另外一个较为早期的相关项目LLVM-GCC,是一个将GCC的前端嫁接到LLVM之上拼接而成的一个完整的编译器。编程

         什么是GCC的前端呢,这要从经典编译器提及。后端


经典编译器架构

一、经典编译器介绍编程语言

         一个传统静态编译器(像大多数C编译器)最流行的设计是3阶段的设计,当中主要组件是前端。优化器及后端(下图)。函数

                                                      

        前端解析源码。检查错误。并构建一个特定于语言的抽象语法树(AST)来表明输入的代码。工具

可选地AST被转换到一个新的用于优化的表示。优化器及后端可以执行这个代码。post

        优化器负责进行各类转换尝试改进代码的执行时间,比方反复计算消除。一般或多或少与语言及目标无关。性能

        而后后端(也被称为代码产生器)把代码映射入目标指令集。优化

除了制做正确的代码,它负责产生利用所支持架构不日常功能的好代码。

一个编译器后端的通用部分包含指令选择,寄存器分配。及指令调度。

        这个模型相同适用于解释器及JIT编译器。Java性能机(JVM)也是这个模型的一个实现,它使用Java字节码做为前端及优化器间的接口。


二、当一个编译器决定支持多个源语言或目标架构时。这样的经典设计最重要的收益出现了。

假设编译器在其优化器中使用一个通用的代码表示,那么可以不论什么可以编译到这个表示的语言编写一个前端,且可以为不论什么可以从这个表示编译获得的目标编写一个后端,如图所看到的。

                                                


LLVM

          LLVM是开源的编译器(compiler)架构,以C++编写而成,用于优化以随意程序语言编写的程序的编译时间(compile-time)、连接时间(link-time)、执行时间(run-time)以及空暇时间(idle-time),对开发人员保持开放,并兼容已有脚本。

          LLVM的设计就採用了上述三个阶段的设计。例如如下图所看到的。

                                               

         这样作的长处是假设需要支持一种新的编程语言。那么咱们仅仅需要实现一种新的前端。

假设咱们需要支持一种新的硬件设备。那咱们仅仅需要实现一个新的后端。

而优化阶段因为是针对了统一的LLVM IR,因此它是一个通用的阶段,不管是支持新的编程语言。仍是支持新的硬件设备,这里都不需要对优化阶段作改动。

   LLVM IR主要有三种格式:一种是在内存中的编译中间语言;一种是硬盘上存储的二进制中间语言(以.bc结尾)。最后一种是可读的中间格式(以.ll结尾)。这三种中间格式是全然相等的。

   LLVM IR是LLVM优化和进行代码生成的关键。

依据可读的IR,咱们可以知道终于生成目标代码以前。咱们已经生成了什么样的代码。而且依据IR。咱们可以选择使用不一样的后端而生成不一样的可运行代码。同一时候,因为使用了统一的IR,因此咱们可以重用LLVM的优化功能。即便咱们使用的是本身设计的编程语言。

  好比。llvm-gcc前端採用gcc。 llvm-gcc 是 GNU Compiler Collection (gcc) 的改动版本号,可以在使用  -S -emit-llvm  选项执行时会生成 LLVM 字节代码。


Clang ( 发音为 /klæŋ/) 

        Clang是一个C++编写、基于LLVM,C、C++、Objective-C、Objective-C++语言的轻量级编译器。源码公布于BSD协议下。

它与GNU C语言规范差点儿全然兼容(固然,也有部分不兼容的内容。包含编译命令选项也会有点差别),并在此基础上添加了额外的语法特性,比方C函数重载(经过__attribute__((overloadable))来修饰函数),其目标(之中的一个)就是超越GCC

       Clang 是一个编译器前端,这也就是说:Clang 将目标程序进行分析,而后生成结构化的,树状的语法表示 , 即抽象语法树 AST(Abstract Syntax Tree)。

一、Clang 的开发背景

        由于 GNU 编译器套装 (GCC) 系统庞大,而且 Apple 大量使用的 Objective-C 在 GCC 中优先级较低。同一时候 GCC 做为一个纯粹的编译系统。与 IDE 配合并不优秀。Apple 决定从零開始写 C family 的前端。也就是基于 LLVM 的 Clang 了。Clang 由 Apple 公司开发。源码受权使用 BSD 的开源受权。

二、基于 Clang 的编程

        与不少编译器前端相比。Clang 的最大特色就是良好的结构化设计,每部分都是一个单独的库 (library)。

也就是说您可以单独的使用当中的一部分。来编写本身的程序。

本站公众号
   欢迎关注本站公众号,获取更多信息