热门问题
时间线
聊天
视角

定义可达性

来自维基百科,自由的百科全书

Remove ads

编译器程式设计语言理论中,一个指令的定義可達性(Reaching Definition,中国大陆译作到达定值)指的是一个赋值指令x = ...的效果是否可能影响到其他指令... = x。举例来说:

d1 : y := 3
d2 : x := y

d2中,d1为定义可达性。

而在下列的范例中:

d1 : y := 3
d2 : y := 4
d3 : x := y

d1d3不再是定义可达性,因为d2使它不再可能被到达。 需要注意的是,由于循环的存在,一个指令对其自身也可能存在定义可达性,如:

d1 : x = 0
d2 : y = 0
d3 : while x < 5:
d4 :   x = x + 1
d5 :   y = y + 1
d6 :   y = y + 1

对于d4d1d4都为到达定值。 而对于d5,由于其对y的定义被d6覆盖,其不为自身的到达定值。

Remove ads

分析用途

定义可达性可以看作数据流分析的一个实例。它静态地确定在代码当中哪些定义可以被到达,被使用在计算UD链(Use-Def)以及DU链(Def-Use)。由于相当简单,它在教课书当中通常被使用作数据分析的经典范例。相当于使用并集作为数据流汇流运算(data-flow confluence operator)的正向数据流分析。 转移函数则为:

换句话说,定义可达性的定义域为程序基本块集合,值域则为程序中所有赋值语句的幂集。的前驱,即控制流图(Control flow graph)中所有后继包含区块的基本块。定义可达性中的结果(OUT),为所有定义可达性自己前身的结果的并集减掉那些被剃除掉的定义(),再加上产生的新的定义()。

我们定义通用的指令如下:

为所有赋值给变量定义的集合,是一个独立的标签附加在赋值的指令,那么定义可达性的值域就是这些指令标签。

Remove ads

延伸阅读

Remove ads

另见

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads