我在 C 或 Java 中使用的编译器有死代码预防(当一行永远不会被执行时发出警告)。我的教授说,编译器永远无法完全解决这个问题。我想知道为什么会这样。我对编译器的实际编码不太熟悉,因为这是一个基于理论的课程。但我想知道他们检查了什么(例如可能的输入字符串与可接受的输入等),以及为什么这还不够。
死代码问题与停机问题有关。
Alan Turing 证明,不可能编写一个通用算法来给定一个程序,并能够决定该程序是否对所有输入都停止。您可能能够为特定类型的程序编写这样的算法,但不是针对所有程序。
这与死代码有何关系?
停止问题可以 简化 为查找死代码的问题。也就是说,如果您找到一种算法可以检测 任何 程序中的死代码,那么您可以使用该算法来测试 任何 程序是否会停止。由于这已被证明是不可能的,因此为死代码编写算法也是不可能的。
如何将死代码算法转换为停机问题算法?
很简单:在要检查是否停止的程序结束后添加一行代码。如果您的死代码检测器检测到该行已死,那么您就知道程序没有停止。如果没有,那么您知道您的程序停止了(到达最后一行,然后到达您添加的代码行)。
编译器通常会检查可以在编译时证明是死的东西。例如,依赖于可在编译时确定为假的条件的块。或 a 之后的任何语句return(在同一范围内)。
return
这些是特定情况,因此可以为它们编写算法。可以为更复杂的情况编写算法(例如检查条件在语法上是否矛盾并因此总是返回错误的算法),但仍然不能涵盖所有可能的情况。