为什么在控制流图中变量“i”和“j”被认为是死的? 注意事项:

问题描述

我正在阅读红龙书中的归纳变量消除主题,在那里我遇到了以下示例。

考虑下面的控制流图:

Original Control Flow Graph

图。 1 : 原始控制流图

现在作者对上图应用强度折减得到下图:

Control flow graph after applying strength reduction

图2:应用强度降低后的控制流程图

例 10.4。在对 B2B3 周围的内部循环应用强度降低后,ij 的唯一用途是确定块 {{ 中的测试结果1}}。我们知道B4i的值满足关系t2,而t2 = 4*ij的值满足关系t4,所以测试 t4 = 4* j 等价于 t2>=t4一旦进行了这个替换,块i> = j中的i和块B2中的j成为死变量,并且在这些块中对它们的赋值变为可以消除的死代码,产生如下图 3 所示的流程图。 □

Flow graph after induction variable elimination

图3:归纳变量消除后的流程图

我不明白的是“块B3中的i和块B2中的j成为死变量”的说法。但是,如果我们沿着图 2 中的绿色路径考虑以下图形:

Doubt illustration image

变量 B3i 可能分别存在于块 jB2 中,如果我们沿着绿色路径如图所示并计数使用B3i(在它们各自的块中)在其赋值的右侧。这种特殊用途是

解决方法

变量不再有效,因为它们没有可观察到的效果。

它们会递增和递减,但绝不会出于任何目的查阅这些值。它们不会被打印出来。没有控制流依赖于它们。没有使用它们的值计算其他变量。如果它们不递增和递减,没有人会注意到。

消除它们不会以任何方式影响程序输出。所以他们应该被淘汰。


作为一个更正式的活性定义,我们可以从以下开始:

  • 如果变量的值将变为可观察的(通过在程序执行之外可见,见下文),则该变量是活动的(在程序中的某个点)。

  • 如果变量的当前值用于计算实时值,则该变量也是实时的。

该递归定义排除了将未以其他方式使用的变量仅用于计算其自身或其他非活动变量的值的情况。这只是我在答案的第一部分中所说的话的一种更精确的表达方式:如果消除赋值不会对程序的执行产生明显的影响,则它是无关紧要的。

“可观察效果”的准确定义会因计算模型而异,但它基本上意味着该值以某种方式传达给程序执行之外的世界。例如,如果在控制台上打印或写入文件(包括用作要创建的文件的名称,因为文件目录也是文件),则该值是实时的。如果它存储在数据库中,或者使灯闪烁,则它是实时的。 C 标准包括可观察行为读写易失性存储器,这是一种封装 CPU 的方式,CPU 使用特定内存地址的加载和存储作为从外围设备发送和接收数据的一种方式。

有一个古老的哲学谜语:如果一棵树倒在无人居住的森林里,它会发出声音吗?如果我们忽略这个问题的人类中心性,回答“不”似乎是合理的,就像许多 19 世纪的科学家一样。他们说,“声音”不仅仅是空气的振动,而是大气振动引起耳朵神经反应的结果。 (当然,可以想象一片完全没有任何生命的森林,而不仅仅是人类的生命,所以哲学家可以在这种防御中避难。)这就是这种计算活性模型的最终结果:如果满足以下条件,计算是可观察的某人可以观察到它。 [注1]

现在,这仍然有待解释,因为某人可能会通过测量计算所花费的时间来“观察”计算。从这个意义上说,所有优化都应该是可观察的,因为如果不缩短计算时间,它们就毫无意义。

如果我们将其视为可观察行为的一部分,则不可能进行有用的优化。所以在大多数情况下,这并不是一个特别有用的可观察性定义。但是在极少数用例中,需要保留计算使用的时间量。典型的此类案例是对抗安全攻击,该攻击通过对值的各种不同用途进行计时来推断应该是秘密变量的值。如果您正在编写旨在维护高度机密的代码 - 例如,访问银行帐户所需的密码密钥 - 那么您可能希望在某些控制流中包含循环,这些控制流没有任何计算目的,而是旨在花费与使用相同秘密值的不同控制流完全相同的时间。

举一个更有趣的例子,当我更年轻时,计算机使用更多的电力来进行更慢的计算,我们注意到您可以通过调谐收音机来接收电磁振动来“聆听”程序的执行由 CPU 产生。然后你可以编写不同类型的无意义循环来制作不同的音符或有节奏的人工制品。这种无意义的循环可以用在微控制器中,以产生闪烁的显示,甚至直接驱动音频扬声器。因此,在某些情况下,您肯定希望编译器不消除“无用”代码。

尽管如此,为了实现可预测的执行时间而拒绝所有优化技术可能不是一个好主意。大多数时候,我们真的希望我们的程序尽可能快地运行,或者消耗最少的不可再生能源;换句话说,避免做不必要的工作。但是由于在某些用例中优化会影响通常不被认为是可观察到的行为,编译器需要为程序员提供一种机制来关闭特定代码段的优化。这些不是 Aho&c 正在讨论的案例,而且有充分的理由。


注意事项:

  1. 乔治·伯克利(George Berkeley)于 1710 年撰写:

    ……似乎同样明显的是,印在感官上的各种感觉或观念,无论如何混合或组合在一起(即,它们构成的任何对象)都不能存在,除非存在于感知它们的心灵中……

    当时的一些哲学家认为,全知上帝存在的必要性是为了避免伯克利(Berkeley)所唤起的混乱,即当他闭上眼睛并重新创建时,他的写作工作室中的物体突然不复存在当他再次打开它们时眨眼。在这个论证中,不断地看到一切的上帝保证了伯克利主教工作室中物体存在的连续性。这一直让我印象深刻,这是一个神灵特别卑微的目的。 (当然,她可以将如此平凡的任务委派给下属。)但每个人都有自己的。

    要获得更多参考和一些讨论,您可以开始here on Wikipedia。或者只听Bruce Cockburn's beautiful environmental anthem

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...