编译原理复习---活跃变量分析

适用于电子科技大学编译原理期末考试复习。

1. 活跃变量

对于变量x和程序点p,如果在程序流图中沿着从p开始的某条路径会引用变量x在p点的值,则称变量x在点p是活跃(live)的,否则称变量x在点p不活跃(dead)。

这里的程序点p可以是一行代码,或者是一个基本块。

活跃变量分析的用途:

  1. 删除无用赋值:如果在某点赋值,但是后面又不会用到的话,可以将该点的赋值删除。

  2. 寄存器分配:如果寄存器都被占用,则当再次申请寄存器的时候,需要替换掉一些占用寄存器的变量。通过活跃变量分析,可以将不活跃变量所占用的寄存器空出来。

2. 活跃变量分析的方法

考试时通常是以一行代码作为一个程序点,在进行分析时,我们需要将程序点像基本块一样作为结点,形成流图。

从活跃变量的定义就可以看出,活跃变量的信息是反向传播的,这意味着我们在进行活跃分析时,是从下向上分析的,即先分析后继结点,再分析前驱结点。

在分析开始之前,我们首先需要定义关于一个程序点活跃变量的四种集合:

  • use[B]:在程序点B中被引用的变量的集合。

  • def[B]:在程序点B中被定义的变量的集合。

  • in[B]:在进入程序点B之前,活跃的变量的集合。

  • out[B]:在经过程序点B之后,活跃的变量的集合。

 分析过程(假设n为当前结点,s为其后继结点):

  1. 以程序点为单位构建流图。

  2. 填写每一个程序点的use集和def集。

  3. 从最后一个结点(即没有后继结点的结点,暂且称其为终止结点)开始向前分析。

  4. out[n] = \bigcup in[s]

  5. in[n] = use[n] \cup (out[n] - def[n])

假如流图中没有终止结点,则可从任意结点开始分析,并重复多次分析过程,直到所有结点的in集和out集都不再发生变化。

 假如终止结点有多个,对每一个终止结点,都要将其作为起点分析一次,同样地,分析过程可能会重复多次。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大筒木老辈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值