适用于电子科技大学编译原理期末考试复习。
1. 活跃变量
对于变量x和程序点p,如果在程序流图中沿着从p开始的某条路径会引用变量x在p点的值,则称变量x在点p是活跃(live)的,否则称变量x在点p不活跃(dead)。
这里的程序点p可以是一行代码,或者是一个基本块。
活跃变量分析的用途:
删除无用赋值:如果在某点赋值,但是后面又不会用到的话,可以将该点的赋值删除。
寄存器分配:如果寄存器都被占用,则当再次申请寄存器的时候,需要替换掉一些占用寄存器的变量。通过活跃变量分析,可以将不活跃变量所占用的寄存器空出来。
2. 活跃变量分析的方法
考试时通常是以一行代码作为一个程序点,在进行分析时,我们需要将程序点像基本块一样作为结点,形成流图。
从活跃变量的定义就可以看出,活跃变量的信息是反向传播的,这意味着我们在进行活跃分析时,是从下向上分析的,即先分析后继结点,再分析前驱结点。
在分析开始之前,我们首先需要定义关于一个程序点活跃变量的四种集合:
use[B]:在程序点B中被引用的变量的集合。
def[B]:在程序点B中被定义的变量的集合。
in[B]:在进入程序点B之前,活跃的变量的集合。
out[B]:在经过程序点B之后,活跃的变量的集合。
分析过程(假设n为当前结点,s为其后继结点):
以程序点为单位构建流图。
填写每一个程序点的use集和def集。
从最后一个结点(即没有后继结点的结点,暂且称其为终止结点)开始向前分析。
假如流图中没有终止结点,则可从任意结点开始分析,并重复多次分析过程,直到所有结点的in集和out集都不再发生变化。
假如终止结点有多个,对每一个终止结点,都要将其作为起点分析一次,同样地,分析过程可能会重复多次。