• 软件分析笔记2 IR


    术语

    IR = Intermediate Representation 代码的中间形式
    AST = Abstract Semantic Tree 抽象语法树

    IR

    上节讲到的同态映射需要一个具体的载体,类比我们常常将n维线性空间同构到R^n上考虑,这里就引入了IR
    IR也是一种语言,可以作任意语言到IR的同态映射,静态分析通常建立在IR的基础上,也就是分析的实际上是IR

    回顾编译的流程:

    source code - scanner - 词法分析 regular expression
    tokens - parser - 语法分析 context free grammar
    AST - type check- 语义分析 attribute grammar
    D-AST - translate - 转换
    IR - optimize - 优化
    IR - code gen - 生成机器码

    SA通常在出现IR的环节发挥作用,也即是前后端之间

    3AC是一种特殊的IR,它和汇编是非常像的

    3AC vs. AST

    AST的结构与语法高度相关,通常和语言高度相关,缺少控制流的信息

    3AC相反,且有简洁和形式简单的优点

    java call

    invokespecial: call constructor, superclass methods, private methods

    invokevirtual: instance methods(virtual dispatch)

    invokeinterface: same as virtual but cannot optimize and checks interface implementation()

    invokestatic: call static methods

    invokedynamic: JVM在若干版本之后支持各种语言,这东西让dynamic language方便地在JVM上跑起来

    一对尖括号<>内的内容叫做method的signature(签名), 包含 class name, ret type, 方法名字(可选), param type
    格式形如 InstanceName.<ClassName: ReturnType MethodName(Param1Type, ...)>(params, ...)

    java constructor

    init是动态的构造函数,clinit是静态构造函数

    具体的可能还要后面补,我尽量...

    SSA

    是一种特殊的3AC,满足:
    每个重复使用的变量都会有不同的名字(而不改变语义)

    会有特殊的情况,比如说3AC

    1: x = 3
    2: if x < 5 goto 5:
    3: y = 0
    4: goto 6:
    5: y = 1
    6: z = y
    

    可以发现,经过不同的分支得到的y的别名应该是不同的,即在控制流合并的地方会出现多个别名取其一的情况,这种时候引入(phi)函数来选取

    1: x1 = 3
    2: if x1 < 5 goto 5:
    3: y1 = 0
    4: goto 6:
    5: y2 = 1
    6: y3 = phi(y1, y2)
    7: z1 = y3
    

    SSA的优势

    1. 程序流的信息可以从变量下标中抽取(即可以用变量定位代码位置),从而可以打乱3AC的顺序而保持部分流的信息(或许可以并行?)
    2. 变量的定义/使用成对,有利于某些任务

    劣势

    1. 会引入多余的变量和phi函数
    2. 变量变多了,性能会受影响(感觉和1重了)

    CFG

    即control flow graph,是静态分析的基本结构
    图的节点通常是若干语句(可以是单条)打包形成的blocks(basic blocks=BB)

    BB

    BB是极大的, 连续的, 满足(这个block的入口只能在第一条)这一性质的 3AC指令的序列
    定义比较好理解,我们用BB造出来一个图G,再用所有的3AC造一个图G',那么G'就是G的一个图的细分

    根据定义很容易给出BB的一个寻找算法,只需要注意到:

    1. 有非平凡出边的点一定是某个block的bottom
    2. 有非平凡入边的点一定是某个block的top
    3. 每个block的bottom一定紧接下一个block的top
      就好了

    本文来自博客园,作者:jjppp。本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议

  • 相关阅读:
    位向量法、二进制法枚举子集
    jfinal 下载文件时重命名
    Java程序员开发参考资源
    (二)Hive1.2.2
    (一)Hive1.2.2
    YARN资源调度框架
    MapReduce并行编程模型
    HDFS 分布式文件系统
    Kafka
    观察者模式
  • 原文地址:https://www.cnblogs.com/jjppp/p/14875136.html
Copyright © 2020-2023  润新知