我在一本书上读到这样一句话:
事实证明,构建一个可以实际执行的编译器是不可能的
确定 C++ 函数是否会更改 a 的值
特定变量。
该段落讨论了为什么编译器在检查常量性时是保守的。
为什么不可能构建这样的编译器?
编译器始终可以检查变量是否被重新分配,是否正在对其调用非常量函数,或者是否作为非常量参数传入......
为什么不可能构建这样的编译器?
出于同样的原因,您无法编写一个程序来确定任何给定程序是否将终止。这被称为停止问题 http://en.wikipedia.org/wiki/Halting_problem,这是不可计算的事情之一。
需要明确的是,您可以编写一个编译器来确定函数确实更改了变量在某些情况下,但是您无法编写一个可靠地告诉您该函数将或不会更改每个可能函数的变量(或停止)的代码。
这是一个简单的例子:
void foo() {
if (bar() == 0) this->a = 1;
}
编译器如何仅通过查看该代码来确定是否foo
将会永远改变a
?是否执行取决于函数外部的条件,即执行bar
。证明停止问题不可计算的证据还不止这些,但在链接的维基百科文章(以及每本计算理论教科书)中已经很好地解释了它,所以我不会尝试在这里正确解释它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)