compiler-theory – 如何识别不影响程序输出的变量?

有时,在程序的控制流中访问的变量的值不可能对其输出产生任何影响.例如:

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

因此,编译器很难确定变量是否实际上不影响例程的返回值;在你的例子中,“副作用例程”可能会操纵其中一个值(甚至无限循环,这肯定会改变例程的返回值;-)
当然,仍有可能进行过度表现.例如,如果变量根本没有出现在例程主体中,则可以得出结论,变量不会影响返回值.您还可以看到一些经典的编译器分析(如表达式简化,常量传播),其副作用是消除此类冗余变量的出现.

点赞