LLVM/Clang

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

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

什么是GCC的前端呢,这要从经典编译器说起。

经典编译器

1、经典编译器介绍

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

前端解析源代码,检查错误,并构建一个特定于语言的抽象语法树(AST)来代表输入的代码。可选地AST被转换到一个新的用于优化的表示,优化器及后端可以运行这个代码。

优化器负责进行各种转换尝试改进代码的运行时间,比如重复计算消除,通常或多或少与语言及目标无关。

然后后端(也被称为代码产生器)把代码映射入目标指令集。除了制作正确的代码,它负责产生利用所支持架构不寻常功能的好代码。一个编译器后端的通用部分包括指令选择,寄存器分配,及指令调度。

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

2、当一个编译器决定支持多个源语言或目标架构时,这种经典设计最重要的收益出现了。如果编译器在其优化器中使用一个通用的代码表示,那么可以任何可以编译到这个表示的语言编写一个前端,且可以为任何可以从这个表示编译得到的目标编写一个后端,如图所示。

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)。

1、Clang
的开发背景

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

2、基于 Clang 的编程

与许多编译器前端相比,Clang 的最大特点就是良好的结构化设计,每部分都是一个单独的库 (library)。也就是说您可以单独的使用其中的一部分,来编写自己的程序。

时间: 2024-10-10 11:26:11

LLVM/Clang的相关文章

Sublime Text3 & MinGW & LLVM CLang 安装配置C-C++编译环境

Sublime Text是一款强大的跨平台代码编辑器,小巧而且丰富实用的功能是Visual Studio不能比拟的,但是编译运行是一个软肋,本文通过在sublime中配置g++编译器实现程序的编译功能.具体步骤如下: (一)       下载安装Sublime text3 for windows (二)       下载安装 MinGW (三)       下载安装 LLVM CLang (四)       Sublime Text3配置 (五)       编译测试 (六)       配置编

ndk-R19C 编译FFPMEG(LLVM/CLANG)

ffmpeg的configure脚本里里已经有了对android ndk 编译的支持了,但是有问题,不修改的话就就连编译器检查都不能通过.会报 C compile test fail 默认的configure里,有检查target-os, 如果是android cc_default 会被设置成clang,但是仅仅这样是不够的 使用llvm编译,不需要修改 .c 源码, 不会因为因为系统头文件的 #define B0 00000 这个宏需要修改源文件中的 B0 变量:不需要修改udp.c文件中的

在Linux下使用LLVM Clang以及Blocks

可以从这个链接下载:http://llvm.org/releases/download.html sudo apt-get install llvm sudo apt-get install clang sudo apt-get install libblocksruntime-dev 代码: #include <stdio.h> #include <Block.h> int main() { void (^hello)(void) = ^(void) { printf("

Debian/Ubuntu Linux 下安装LLVM/Clang 编译器

第一步,首先编辑 /etc/apt/sources.list,增加下面源: (加入源后务必执行apt-get update,假设有错误提示,先执行第二步,然后apt-get update) Debian平台: deb http://llvm.org/apt/wheezy/ llvm-toolchain-wheezy main deb-src http://llvm.org/apt/wheezy/ llvm-toolchain-wheezy main deb http://llvm.org/apt

LLVM/Clang编译相关研究

https://blog.csdn.net/guojin08/article/details/54310858 https://juejin.im/entry/5c64da44518825620b450918 https://www.jianshu.com/p/269d68d25df4 https://blog.csdn.net/Deft_MKJing/article/details/84943381 https://www.itcodemonkey.com/article/7459.html

Clang+llvm windows运行环境配置

下了官网Pre-built Binaries:Clang for Windows( llvm.org/releases/3.5.0/LLVM-3.5.0-win32.exe )03 Sep 2014 3.5.0 The LLVM Compiler Infrastructure(llvm.org) download LLVM(llvm.org/releases/) 由于刚刚安装了 TDM GCC 4.9.2 tdm64-gcc-4.9.2-3.exe 2014 December 12th(tdm-

编译器:gcc, clang, llvm

clang Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言.传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd).在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树:优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效:后端则是将已经优化的中间代码转化为针对各自平台的机器代码.Clang则是以LLVM为后端的一款高效易用,并且与IDE结合很好的编译前端. llvm LLVM的命名

从今天起,写一本关于LLVM的书----《深入理解LLVM》

一直想写一本关于深入学习LLVM的书,这个想法有了很久了,但是一直没有机会动手.现在虽然很忙,但是依然觉的有必要马上动手去做这个事情.任何事情都是一点一点积累起来的,如果一直不动手,什么都做不成.还有句话:活在当下.抓紧时间去做想做的事情,才不会给自己的人生留遗憾. 现在关于LLVM的书,只见过一本英文的<Getting Started with LLVM Core Libraries>,据说还有一本日文的更早,但是一直没见过,有待调查补充.所以我很期待这本书能成为第一本中文的关于LLVM的书

Building clang on RedHat

http://btorpey.github.io/blog/2015/01/02/building-clang/ clang is a great compiler, with a boatload of extremely helpful tools, including static analysis, run-time memory and data race analysis, and many others.  And it's apparently pretty easy to ge