LLVM 与 Clang;IR 与AST

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

一、编译器的组成

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

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


二、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。

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值