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 = 1goto 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则是在这节课的基础上来进行的。
写到最后。这一节学下来,也许你会觉得静态分析的基础内容大多是一种人为的抽象定义,给予它的一些设定的规则。但实际上对应于多种不同的语言,如何实现抽象统一是一个十分困难的点。先理解学会这些定义,在后续的运用中就会慢慢体会到这些定义的深层含义和它这样设计的意义何在。
lecture2 Intermediate Representation-笔记相关推荐
- 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)
写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...
- MLIR(Multi-Level Intermediate Representation Compiler)架构 Infrastructure
MLIR(Multi-Level Intermediate Representation Compiler)架构 Infrastructure Overview • Context • About M ...
- 程序分析之中间表示(Intermediate Representation)
静态分析 目录 静态分析 中间表示(Intermediate Representation) 抽象语法树(Abstract Syntax Tree,AST) 三地址码(Three Address Co ...
- Intermediate Representation (IR) 中间表示
Intermediate Representation(IR,中间表示)是在计算机科学和编译器设计中使用的概念,它是一种中间形式的程序表示,用于在不同编译阶段之间传递和处理代码.下面将详细介绍Inte ...
- 【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation
- MLIR(Multi-Level Intermediate Representation)概述
我们知道TensorFlow是使用数据流图作为数据结构来进行各种数值计算,要让这些计算运行在硬件上,我们需要一个TensorFlow的编译生态系统: 整个编译流程先将TensorFlow的图转化为XL ...
- MLIR (Multi-Level Intermediate Representation)
MLIR 意思为:多级中间表示,是一种新的IR表示.MLIR 是 LLVM 项目的子项目. MLIR 是一种新型的编译器框架,其设计中参考了已有的编译器优点,规避了一些缺陷.包括了中间表示的定义.转换 ...
- 《Deep Learning With Python second edition》英文版读书笔记:第十一章DL for text: NLP、Transformer、Seq2Seq
文章目录 第十一章:Deep learning for text 11.1 Natural language processing: The bird's eye view 11.2 Preparin ...
- 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...
最新文章
- HDU 2561 第二小整数
- python文件读取输出-python分批定量读取文件内容,输出到不同文件中的方法
- Winform中使用zxing实现二维码生成(附dll下载)
- python语言format用法_python基础_格式化输出(%用法和format用法)
- 《C++ Primer》7.3.4节练习
- labelme实例分割_GitHub:图像分割最全资料集锦
- 【转载】TCP拥塞控制算法 优缺点 适用环境 性能分析
- 4.SOA架构:服务和微服务分析及设计--- Web服务及微服务的分析与建模
- windows10无线网络未连接打红叉怎么办
- 在线博客系统——文章详情(redis incr自增实现增加阅读数和评论数)
- Springboot使用@EnableCache缓存
- python混淆ios代码_XSDK——iOS代码混淆原理
- 视频教程-遥感影像深度学习样本制作-深度学习
- phpStorm MarkDown插件下载
- 《JavaWeb从入门到改行》fileupload,没毛病
- 射频——MIMO概念
- (休息几天)读米什金之货币银行学——货币
- clamav杀毒软件
- 20165331 学习基础和C语言基础调查
- linux ip 流量 脚本,如何通过IP在Linux中进行流量整形?