7. 中间代码生成

中间代码生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h2csTGf7-1642042154925)(…/picture/29.png)]

IR (程序分析和代码优化),优化在特定的中间表示上才可以或容易进行

  • 图IR (将编译器的知识编码到图中) DAG(抽象语法树)
  • 线性IR (类似某些抽象机上的伪代码) 三地址码 (RISC)
  • 混合IR (结合了图IR和线性IR的要素)控制流图(CFG):更精细的三地址码,适合做程序分析、程序优化。  静态单赋值形式 (SSA) 更精细的控制流图,同时编码控制流信息和数据流信息。

图IR

语法分析树: 对输入程序的推导或语法分析的图表示

抽象语法树:

  • 将语法分析树中对编译器其余部分没有实际用途的那些结点抽象掉。
  • 保留了语法分析树的基本结构
  • 忽略了表示非终结符的大部分节点

有向非循环图/有向无环图(DAG)

  • DAG可以重用一些子树,结点可以有多个父节点,相同子树可以被重用,是具有共享机制的AST。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMp9GLLj-1642042154927)(…/picture/30.png)]

控制流图(CFG)

  • 程序中最简单的控制流单位是一个基本程序块
  • CFG是对程序中各个基本程序块之间的控制流建立了模型
  • 基本块中是线性IR,形成混合IR形式

依赖关系图

  • 使用图来编码表示值从创建之处(定义)到使用之处(使用)的流动。
  • 结点表示操作:定义或使用
  • 边连接两个节点:一个节点定义一个值,另一个节点使用该值,边从定义处指向使用处。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WAbnJQLb-1642042154928)(…/picture/31.png)]

  • 未能完全捕获程序的控制流,如要求语句1和2在6之前执行,但并未要求在3之前执行。
  • 通常用作衍生IR,即针对特定的任务从权威IR构建依赖关系图,使用依赖关系图完成任务,而后丢弃。
  • 指令调度领域,发挥核心作用。

调用图:进行过程间分析和优化,表示运行时过程之间的控制转移

为表示运行时过程之间的控制转移,使用调用图。

线性IR

类似抽象机的汇编代码

以编码表达程序中各个位置之间的控制转移,通常包括条件分支和跳转。

堆栈机代码
  • 单地址代码,操作数存在一个栈中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7V1Z6E2s-1642042154929)(…/picture/32.png)]

特点:

  • 栈本身建立了一个隐式的命名空间,消除了IR中许多名字,缩减IR形式下程序的大小。
  • 所有的结果和参数都是暂态的。
三地址代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TFpJzS8-1642042154930)(…/picture/33.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1FZxDYf-1642042154931)(…/picture/34.png)]

基本思想
  • 给每个中间变量和计算结果命名,没有复合表达式
  • 只有最基本的控制流
    • 没有各种控制结构 if、while、 for
    • 只有goto、 call
  • 三地址码可以看成是抽象的指令集,通用或抽象的RISC
运算符集合

底层操作:跳转、分支、简单的内存操作

复杂操作:min max

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Juf81iP4-1642042154932)(…/picture/35.png)]

三地址码通常实现为一组四元组,表示为四个字段:一个运算符、两个操作数、一个目标

实现四元组、将各个四元组连接起来:短数组、指针数组、链表

优点:

所有的操作是原子的

控制流结构被简化了,只有跳转

是抽象的机器代码

不足:

程序的控制流信息是隐式的

需要做进一步的控制流分析

控制流图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kmqtI5CO-1642042154933)(…/picture/36.png)]

三地址码在跳转时,不知道某一个块的入度。

基本概念:

基本块/基本程序块:是语句的一个序列,从第一条执行到最后一条。

  • (具有最大长度的)无分支代码序列
  • 不能从中间进入,不能从中间退出(跳转指令只能出现在最后)
入口:
  • 程序的第一条语句
  • 条件跳转语句或无条件跳转语句的跳转目标语句
  • 条件跳转语句后面的相邻语句
划分基本块的方法
  • (1)求出各个基本块的入口语句
  • (2)对每个入口语句,构造其所属的基本块。它是由该语句到下一个入口语句(不包括下一个入口语句),或者到某个跳转语句(包括该跳转语句),或者到某个停语句(包括该停语句)之间的语句序列组成的。

控制流图:控制流图是一个有向图 G = ( N , E ) G=(N,E) G=(N,E)

  • 每个节点 n ∈ N n \in N nN:是基本块

  • 如果一个节点的基本块的入口语句是程序的第一条语句,则称此结点为首结点

  • 每个边 e = ( n i , n j ) ∈ E e=(n_i,n_j) \in E e=(ni,nj)E:是基本块之间的跳转关系

    • 对应于从块 n i n_i ni到块 n j n_j nj的一个可能的控制转移
    • 两种情况:
      • n j n_j nj是块 n i n_i ni之后的相邻基本块,并且基本块 n i n_i ni的最后一条语句不是无条件跳转语句 g o t o goto goto或停语句或者返回语句
      • n i n_i ni的最后一条语句是无条件跳转或者条件跳转到块 n j n_j nj的入口语句,即 n i n_i ni出口语句的跳转目标地址指向 n j n_j nj的入口语句。
  • 可以假定每个CFG有一个唯一的入口结点 n 0 n_0 n0,一个唯一的出口结点 n f n_f nf

C F G CFG CFG表示块之间的关系。

编译器的很多部分显示或隐式的依赖 C F G CFG CFG

生成控制流图

JAVA:高层语言有特别规整控制流结构。

C:三地址码->控制流图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cv30IrJQ-1642042154934)(…/picture/37.png)]

可以采用死基本块删除优化示例:无入度的基本块可以删除。

SSA:静态单赋值形式

  • 是一种命名规范,基于值的命名系统
  • 将程序中控制流和数据值流动的信息编码到名字中,广泛用于优化中
  • 名字唯一的对应到代码中特定的定义位置
  • 每个名字都是通过单个操作定义的
  • 每次在操作中使用某个名字作为参数时,这个名字都编码了对应值的来源地信息。

SSA:①每个定义都有一个不同的名字 ②每次使用引用一个定义

IR转化为SSA:

① 在不同控制流路径合并的位置(汇合点)插入 ϕ \phi ϕ函数

② 然后重命名变量,使之满足名字分派的唯一性

ϕ \phi ϕ函数:获取几个名字并将其合并,以定义一个新的名字。

选择其中一个参数的值来定义目标SSA的名字,该参数对应于CFG中控制流进入当前块的边。

每个定义都知道其使用

每个使用都知道它唯一的定义,使得优化更容易更快速。

构建SSA

对每一个基本块

  • 重命名每个定义
  • 利用最近的定义重写每个使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgtoFh2J-1642042154935)(…/picture/38.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H280393i-1642042154936)(…/picture/39.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ztAuEm1r-1642042154937)(…/picture/40.png)]

ϕ \phi ϕ函数
  • 如果一个基本块 b b b p p p个前驱, b b b是汇合点
  • x = ϕ ( x 1 , x 2 , … , x p ) x=\phi(x_1,x_2,\dots,x_p) x=ϕ(x1,x2,,xp)
  • 执行前消除 ϕ \phi ϕ函数。

定义

  • 利用最近的定义重写每个使用

[外链图片转存中…(img-dgtoFh2J-1642042154935)]

[外链图片转存中…(img-H280393i-1642042154936)]

[外链图片转存中…(img-ztAuEm1r-1642042154937)]

ϕ \phi ϕ函数
  • 如果一个基本块 b b b p p p个前驱, b b b是汇合点
  • x = ϕ ( x 1 , x 2 , … , x p ) x=\phi(x_1,x_2,\dots,x_p) x=ϕ(x1,x2,,xp)
  • 执行前消除 ϕ \phi ϕ函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值