变量不再有效,因为它们没有可观察到的影响。
它们会递增和递减,但绝不会出于任何目的查询这些值。它们没有打印出来。没有控制流依赖于它们。没有其他变量是使用它们的值计算的。如果它们不增加和减少,没有人会注意到。
消除它们不会以任何方式影响程序输出。所以他们应该被淘汰。
作为活性的更正式定义,我们可以从以下内容开始:
该递归定义排除了将未使用的变量仅用于计算其自身或其他非实时变量的值的使用。这只是我在答案第一部分所说的更精确的说法:如果消除它不会对程序的执行产生明显的影响,那么分配是无关紧要的。
“可观察效果”的精确定义将根据计算模型而有所不同,但它基本上意味着该值以某种方式在程序执行之外传递给世界。例如,如果值在控制台上打印或写入文件(包括用作要创建的文件的名称,因为文件目录也是文件),则该值是活动的。如果它存储在数据库中,或者导致指示灯闪烁,则它是实时的。 C 标准包括在可观察行为类别中读取和写入易失性内存,这是一种封装 CPU 的方式,CPU 使用特定内存地址的加载和存储作为从外围设备发送和接收数据的方式。
有一个古老的哲学谜语:如果一棵树倒在无人居住的森林里,它会发出声音吗? 如果我们忽略这个问题的人类中心性,回答“不”似乎是合理的,就像许多 19 世纪的科学家一样。他们说,“声音”不仅仅是空气的振动,而是大气振动引起耳朵神经反应的结果。 (当然,可以想象一片森林根本没有任何有生命的生命,而不仅仅是人类生命,所以哲学家可以在这种防御中避难。)这基本上就是这种计算活性模型的最终结果:计算是可观察的,如果某人可以观察到它。 [注1]
现在,这仍然可以解释,因为 某人 可能,例如,通过测量计算所花费的时间来“观察”计算。从这个意义上说,所有优化都应该是可观察的,因为如果不缩短计算时间,它们就毫无意义。
如果我们将其视为可观察行为的一部分,则不可能进行有用的优化。所以在大多数情况下,这不是可观察性的特别有用的定义。但是有极少数用例需要保留计算使用的时间量。典型的此类案例是对抗安全攻击,该攻击通过计时值的各种不同用途来推断应该是秘密变量的值。如果您正在编写旨在维护高度机密的代码(例如,访问银行帐户所需的密码密钥),那么您可能希望在某些控制流中包含循环,这些循环没有任何计算目的,而是有意为之花费与使用相同秘密值的不同控制流完全相同的时间。
举一个更有趣的例子,当我年轻得多并且计算机使用更多的电力来执行更慢的计算时,我们注意到您可以通过调整收音机来“收听”程序的执行以接收电磁振动由 CPU 产生。然后你可以编写不同类型的无意义循环来制作不同的音符或节奏人工制品。这种无意义的循环可以在微控制器中使用,以产生闪烁的显示,甚至直接驱动音频扬声器。因此,在某些情况下,您肯定希望编译器不消除“无用”代码。
尽管如此,拒绝所有优化技术以实现可预测的执行时间可能不是一个好主意。大多数时候,我们真的希望我们的程序尽可能快地运行,或者消耗最少的不可再生能源;换句话说,避免做不必要的工作。但是由于在某些用例中优化会影响通常认为不可观察的行为,因此编译器需要为程序员提供一种机制来关闭特定代码段的优化。这些不是 Aho&c 正在讨论的案例,并且有充分的理由。
注意事项:
-
乔治·伯克利,写于 1710 年:
……似乎同样明显的是,印在感官上的各种感觉或想法,无论是如何混合或组合在一起(即,无论它们构成什么对象),都只能存在于感知它们的心灵中……
当时的一些哲学家提出了无所不知的上帝存在的必要性,以避免伯克利引起的混乱,在这种混乱中,当他闭上眼睛并重新创造时,他写作工作室中的物体突然不复存在。当他再次打开它们时眨眼。在这个论点中,不断看到一切的上帝保证了伯克利主教工作室中物体的连续性。我一直觉得这是一个神灵特别卑微的目的。 (她当然可以将这种平凡的任务委派给下属。)但每个人都是自己的。
如需更多参考资料和小讨论,您可以开始here on Wikipedia。或者只听Bruce Cockburn's beautiful environmental anthem。