lecture2 Intermediate Representation-笔记

本文参考了该作者的一些图解和见解:https://zhuanlan.zhihu.com/p/129361229

一、Intermediate Representaion(IR)

在编译器中,要想从源码编译为计算机可执行的机器码,需要以下这几个过程:

词法分析->语法分析->语义分析->中间代码生成(IR)->目标代码生成

由上图可知,静态分析一般在中间代码上进行,但少数也会在AST抽象语法树上进行。而中间代码则是本节课所要讲述的内容,那在IR上进行静态分析的原因是什么呢?

(1)中间表达往往是语言无关的,不同的上层语言例如Java和JS,都可以转换成同一种中间代码,所以静态分析只需要对这种中间代码实现就可以分析很多不同的前端语言,LLVM和华为的方舟编译器就是例子

(2)中间代码的流程很直观的反映了控制流(control flow)信息

而这两点恰恰是进行静态分析所需要的重要特性。谈到IR,则要谈一谈AST抽象语法树,下图为AST和IR的直观对比。

IR: Three-Address Code (3AC);中间代码有很多种,而本门课最主要讲解三地址码3AC

3AC:There is at most one operator on the right side of an instruction.一条指令(表达式)至多一个操作符。

如上所示,所谓三地址码,也即每个表达式只包含三个实体,这些实体可以是:变量、常量、编译器生成的临时变量。

3AC in Real Static Analyzer: Soot,下图为soot中jimple的一个样例(更多例子在老师的slides上可见):

而另一种经典的中间码格式——Static Single Assignment(SSA),特点是为每一次赋值行为赋予一个新的变量名,且每一个变量仅有其唯一的定义,如下图3AC与SSA的对比可知:

可知在SSA中每一表达式都有一个确切定义的变量名,那如果一个变量在控制流的交界处(分支)呢?如下:

这里提出了一个特殊的合并操作符∅(称之为phi-function)来避免分支汇合产生的多个定义情况(用于条件选值)。

对应SSA如下:

if (e) goto L1 
    x1 = 1
    goto L2
L1  x2 = 0
L2  x_t = phi(x1, x2)
    y = x_t -7

SSA的优缺点: 

其flow Information被间接合并到唯一的变量名上,因此其用来进行flow-insensitive分析能达到flow insensitive分析的部分精度,其分析速度也更快,但同样导致了精度下降。此外,在某些按需任务中的数据存储和传输更有效。在一些优化任务上SSA的效果更好(如,条件常量传播,全局值编号) 。但缺点也很明显,就是引入过多的变量名和∅函数且转换为机器代码时可能会导致效率低下的问题(由于复制操作)。

二、Control Flow Graphs (CFG)

在讲CFG之前,有必要谈一下Basic Blocks(BB)。静态分析的基本结构是CFG,而CFG的基础是Basic Blocks。

Basic Blocks(BB):只能从块的入口进入(at the begging)和从块的末尾作为出口(at the end)的最大连续三地址指令序列。如图从块中第一条语句进入,从块中最后一条语句跳出该块,由出口到入口的最大三地址指令所组成的序列看做为一个BB。

已知BB的概念后,接下来尝试一下将一连串三地址码转为多块BB。由于一个Basic Block的重点在于找到每一块的入口和出口,那么只需要找到每一块的块头,则其出口为下一块块头的前一块。那么BB的划分则转换为了一个寻找入口的算法。

寻找Basic Block入口的算法如下:

1)程序第一条指令;

2)跳转指令所跳转的新指令则是BB的入口;

3)跳转指令顺序下来的下一条指令。

可知,根据1可找出(1)为B1入口;

           根据2可知(7)、(12)、(3)分别为B4、B6、B2的入口;

           根据3可知(5)、(11)、(12)分别为B3、B5、B6的入口;

在了解了Basic Block的定义之后,那么可以开始讲解CFG了。

CFG中BB作为它的节点(node)存在,则将原先指令序列中的跳转指令的跳转地址从跳转指令转换为块跳转,即从块的end跳转到另一块的begging。此外,每一块的从上往下的顺序也是数据流通的方向。为这些块之间添加有向连接,如下图所示:

由这里就可知了,所谓控制流图CFG就是程序中各块的流通方向,根据CFG则可以知道程序中各模块之间如何进行数据流通。

下一节的Data Flow Analysis则是在这节课的基础上来进行的。

写到最后。这一节学下来,也许你会觉得静态分析的基础内容大多是一种人为的抽象定义,给予它的一些设定的规则。但实际上对应于多种不同的语言,如何实现抽象统一是一个十分困难的点。先理解学会这些定义,在后续的运用中就会慢慢体会到这些定义的深层含义和它这样设计的意义何在。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值