反向数据流问题的迭代算法
介绍 :
写这篇文章的原因是为了告诉你一个关于向后统计浮动问题的迭代规则集。在开始之前,您必须了解一些与统计浮动分析相关的术语。
数据流分析:
它是一种收集有关在计算机程序的各个点计算的可能值集的信息的技术。
是在事物流图之上对统计漂移的go的评估,即确定程序中统计定义和使用的记录的评估。在此评估的帮助下,可以进行优化。一般来说,它的方式,其中值已经计算使用统计流评估。与drift 属性相关的统计数据表示可用于优化的记录。
控制流图(CFG) :
它用于决定分配给变量的特定费用可能传播到的软件元素。
控制流图 (CFG) 是在包或应用程序的整个执行过程中管理计算流的图形说明。除了编译器应用程序之外,控制流图更常用于静态评估,因为它们能够适当地表示应用程序单元的内部流程。管理与漂移图最初是通过 Frances E. Allen 的方式演变而来的。
例子 -
if A = 10 then
if B > C
A = B
else A = C
endif
endif
print A, B, C
上述例子的流程图——
上述示例的控制流程图–
天真的方法(Kildall 方法)——
对包进行data-waft评估的最简单方法是为控制-waft图的每个节点安装data-waft方程,并通过一次又一次地计算每个节点的输入输出,直到整个设备稳定,即它达到一个固定点。
迭代算法——
一组迭代规则是解决漂移评估方程的事实的最常见的方法。在这组规则中,我们特别有第一个状态是在国家内,而相反的状态是在国家外。规则集从每个块的本地近似开始,然后通过利用在状态下的切换功能的方式进行计算。通过使用操作的一部分,状态是最新的。重复后面的步骤,直到我们达到固定点:状态现在不再改变的场景。
上述算法的效率——
该算法求解数据流方程的效率受访问本地节点的顺序影响,还取决于数据流方程是否用于 CFG 上的前向或后向数据流评估(管理流程图)。
下面提到了一些固定数据浮点方程的生成顺序——
- 随机顺序 -
在这个新的发布顺序中,并不总是意识到数据流方程是否解决了前向或后向数据流问题。因此,与专门的新发布订单相比,整体表现相当消极。 - 后购–
这个针对后向数据的新发布顺序存在漂移问题。一个节点在任何情况下都会被访问,它的后继节点被访问,并使用深度优先策略执行。 - 反向后序-
此生成顺序用于转发数据传输与漂移问题。该节点在其任何后继节点被访问之前被访问,此外通过返回边的方式到达后继节点。
后向分析——
它是一种借助想象来研究随机算法的方法,从输出到输入,就好像它在时间上倒退了一样。
例子 -
块的状态 –
在它的开头包含的变量集,它最初包含块中包含的所有变量,然后执行传递函数并计算实际包含的值。
块的外状态 -
包含在块末尾的变量集,由块的后继者的状态的并集计算。
Initial code -
b1: a = 3;
b = 5;
d = 4;
x = 100;
if a > b then
b2: c = a + b;
d = 2;
b3: endif
c = 4;
return b * d + c;
Backward data analysis -
// in: {}
b1: a = 3;
b = 5;
d = 4;
x = 100; //x is never being used later thus not in the out set {a,b,d}
if a > b then
// out: //union of all (in) successors of b1 => b2: , and b3:
// in: {a,b}
b2: c = a + b;
d = 2;
// out: {b,d}
// in: {b,d}
b3: endif
c = 4;
return b * d + c;
// out:{}
从上面的例子中,我们可以观察到三点——
- 首先,b3 的 in-state 只包含 b 和 d,而是写入了 c。
- 其次,b1 的外邦是 b2 和 b3 的内邦的联合。
- 最后一点是可以删除 b2 中 c 的定义,因为 c 不是在语句之后立即包含的。
进度表——Processing Out-state Old in-state New in-state Worklist b3 {} {} {b, d} (b1, b2) b1 {b, d} {} {} (b2) b2 {b, d} {} {a, b} (b1) b1 {a, b, d} {} {} ()
工作清单——
它是仍然需要处理的块的列表。
Note -
The b1 changed into entered withinside the listing earlier than b2, which compelled processing b1
twice (b1 changed into re-entered as
the predecessor of b2).Inserting b2 earlier than b1 could
have allowed in advance completion.
要记住的一点——
- 用空集初始化是一种乐观初始化,因为所有变量一开始都是死的。
- 外部状态不能从一个新版本减少到下一个新版本,即使外部国家可能小于内部国家。
- 王国开始因为空集而开始,它能够在类似的迭代中最简单地发展。