LLVM 与 Clang;IR 与AST

关于LLVM和clang,要说回编译器的组成部分。

一、编译器的组成

传统编译器通常由三部分组成,分别是前端(frontEnd)优化器(frontEnd)后端(backEnd)

在编译过程中,前端主要负责词法、语法分析和语义分析,将源代码转化为中间代码;优化器对生成的中间代码进行优化,试图使代码更高效;后端则是负责将已经优化的中间代码转化为针对各自平台的机器代码,这一过程会最大化地利用目标机器的特殊指令,以提高代码的性能。
LLVM 与 Clang;IR 与AST_第1张图片


二、LLVM 与 Clang

LLVM (Low Level Virtual Machine,底层虚拟机) 是伊利诺伊大学(UIUC)的一个开源项目,它提供了完整的 C/C++工具链,Clang 属于其中的一个子项目,是 LLVM 原生的 “ C/C++/Objective-C ”编译器前端。

Clang 负责完成词法分析和语法分析,并将分析结果转换为抽象语法树( Abstract Syntax Tree,AST),最后使用 LLVM 作为后端代码的生成器。简而言之,LLVM提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成,可以作为多种编译器的后台来使用。


三、IR 与 AST

AST:高级,更接近于语法结构,依赖于语言种类,适用于快速类型检查,缺少控制流信息
AST跟语法耦合度很深,有很多语意一样语法不同的构造。比如许多语言都有多种不同的循环结构,分支结构。

IR:低级,更接近于机器码,不依赖语言种类,压缩且简洁,包含控制流信息,是静态分析的基础。
平台无关中间指令(中间表示,简称为IR),不对应任何特定的硬件CPU架构,但是,仍然需要定义最基本的内存数据load/store、寄存器寻址、分支跳转、栈操作等等。LLVM的主要优点就是引入了SSA(虽然不是原创,据说原创是Open64),但SSA仅仅是一种约束,以方便后端优化。那么,什么是IR的核心特性?——“虚拟寄存器”。

看起来,貌似修饰后的AST经过翻译之后生成低级语言IR。

LLVM 与 Clang;IR 与AST_第2张图片

LLVM 与 Clang;IR 与AST_第3张图片

你可能感兴趣的:(学习)