有时,在程序的控制流中访问的变量的值不可能对其输出产生任何影响.例如:
global var_1
global var_2
start program hello(var_3, var_4)
if (var_2 < 0) then
save-log-to-disk (var_1, var_3, var_4)
end-if
return ("Hello " + var_3 + ", my name is " + var_1)
end program
这里只有var_1和var_3对输出有任何影响,而var_2和var_4仅用于副作用.
变量如var_1和var_3在dataflow-theory / compiler-theory中有一个名字吗?
可以使用哪种静态数据流分析技术来发现它们?
将特别感谢关于该主题的学术文献的参考.
最佳答案 你说的问题一般是不可判定的,
即使是以下非常狭窄的特殊情况:
给定单个例程P(x),其中x是整数类型的参数. P(x)的输出是否与x的值无关,即确实如此
P(0)= P(1)= P(2)= ……?
我们可以将以下仍然不可判定的暂停问题版本减少到上面的问题:给定图灵机M(),该程序吗?
从不停止空输入?
我假设我们使用(图灵完备)语言,我们可以在其中构建“图灵机器模拟器”:
给定程序M(),构造这个例程:
P(x):
if x == 0:
return 0
Run M() for x steps
if M() has terminated then:
return 1
else:
return 0
现在:
P(0) = P(1) = P(2) = ...
=>
M() does not terminate.
M() does terminate
=> P(x) = 1 for a sufficiently large x
=> P(x) != P(0) = 0
因此,编译器很难确定变量是否实际上不影响例程的返回值;在你的例子中,“副作用例程”可能会操纵其中一个值(甚至无限循环,这肯定会改变例程的返回值;-)
当然,仍有可能进行过度表现.例如,如果变量根本没有出现在例程主体中,则可以得出结论,变量不会影响返回值.您还可以看到一些经典的编译器分析(如表达式简化,常量传播),其副作用是消除此类冗余变量的出现.