南京大学-程序分析-课程02-中间表达

1. Compilers and Static Analyzers

编译器和静态分析之间的关系
南京大学-程序分析-课程02-中间表达_第1张图片

  • 词法分析
  • 语法分析
  • 语义分析
  • AST
  • IR
  • 静态分析
  • 二进制编码

2. AST vs. IR

2.1 AST

AST(抽象语法树)
• 高级且接近语法结构
• 通常与语言相关
• 适用于快速类型检查
• 缺乏控制流信息

2.2 IR

IR(中间代码)
• 低级且接近机器代码
• 通常与语言无关
• 紧凑而统一
• 包含控制流信息
• 通常被视为静态分析的基础

3. IR: Three-Address Code (3AC)

三地址码是一种用于表示中间代码的形式,通常用于编译器的内部表示。中间代码是在源代码和目标代码之间的一种抽象表示,有助于简化编译器的设计和实现。

三地址码的基本思想是将每条语句表示为最多包含三个操作数的形式,其中每个操作数可以是变量、常数或临时变量。每个三地址码指令通常执行一个简单的操作,如赋值、算术运算或跳转。

3.1 一些常见的三地址形式

南京大学-程序分析-课程02-中间表达_第2张图片

3.2 JVM中的四种调用方式

  1. invokespecial: 用于调用实例构造器 方法、私有方法,以及使用 super 关键字调用父类方法。
  2. invokestatic: 用于调用静态方法。被调用的方法在编译期就可以确定。
  3. invokevirtual:用于调用对象的实例方法。在运行时,根据对象的实际类型确定被调用的方法。
  4. invokeinterface: 用于调用接口中的方法。与invokevirtual 类似,但用于调用接口中的方法。

3.3 其他

方法签名:包含类名、返回值、方法名(参数)

4. 3 AC in Real Static Analyzer: Tai-e

4.1 三地址码中的循环

南京大学-程序分析-课程02-中间表达_第3张图片

4.2 三地址码中的方法调用

南京大学-程序分析-课程02-中间表达_第4张图片
南京大学-程序分析-课程02-中间表达_第5张图片

4.3 三地址码中的类编译

南京大学-程序分析-课程02-中间表达_第6张图片

5. Static Single Assignment (SSA)

SSA(静态单赋值)是一种在编译器优化中使用的中间表示形式,用于简化分析和转换。在SSA形式中,每个变量在其整个生命周期内只被赋值一次,这有助于消除一些数据流分析中的复杂性,使得编译器能够更容易地进行优化。

在常规的中间表示形式中,一个变量在不同的程序点可能会被多次赋值,这会增加数据流分析的难度。而在SSA中,每个变量都有一个唯一的版本号,每次赋值都创建一个新版本。这使得在分析数据流时,可以更轻松地跟踪变量的值,因为每个版本都有一个明确定义的范围。

SSA的特点包括:

  1. 唯一赋值: 每个变量只在程序中的一个地方被赋值。
  2. 版本号: 对于每个变量,每次赋值创建一个新版本,使用版本号来区分不同的赋值。
  3. 简化分析: SSA形式可以简化数据流分析,例如活跃变量分析、可达性分析等。
  4. 优化:SSA形式使得一些优化更容易实施,如死代码消除、循环不变式提升等。

使用SSA形式,编译器可以更好地理解程序中变量的行为,从而能够更有效地进行优化。SSA通常在高级语言到中间代码的编译阶段引入,并在后续的优化和代码生成阶段中使用。

6. Basic Blocks (BB)

基本块(Basic Block)是在程序流控制图中的一段连续的、没有分支入口和出口的代码。它是一种在编译器和优化器中常用的基本结构,有助于进行代码分析和优化。

基本块的特点:
一个基本块包含一组顺序执行的语句,其中只有一个入口点(第一个语句)和一个出口点(最后一条语句)。在基本块中,程序的执行顺序是线性的,没有条件分支或跳转语句。如果在基本块中遇到条件分支或跳转语句,就会结束当前基本块,形成一个新的基本块。

  1. 单一入口: 一个基本块只有一个入口点,即第一条语句。
  2. 单一出口: 一个基本块只有一个出口点,即最后一条语句。除非遇到分支或跳转语句。
  3. 连续性: 语句在基本块中是顺序执行的,没有中途的分支或跳转。
//如何构建基本块
输入:
程序P的三地址指令序列。
输出:
程序P的基本块列表。
方法:
步骤1:确定Leader
	P中的第一条指令是Leader。
	任何条件或无条件跳转的目标指令都是Leader。
	任何紧随条件或无条件跳转的指令也是Leader。
步骤2:构建基本块(BB) for P
	基本块(BB)由Leader及其后续指令组成,直到下一个Leader。

7. Control Flow Graphs (CFG)

控制流程图的基本节点上BB(Basic Block).
如果块A和块B之间存在一条有向边,仅当:

  • 存在一个有(无)条件的跳转从A的结尾指向B的开始
  • B 紧随在 A 的原始指令顺序中,且 A 以有条件跳转结束。

将跳转指令替换为基本块跳转是正常的。
南京大学-程序分析-课程02-中间表达_第7张图片

你可能感兴趣的:(笔记)