我想知道Perl是否执行常见的子表达式消除?
是做了什么样的优化?
答案 0 :(得分:1)
不,但我这样做。
现在,我不会手动展开循环,因为一旦熟悉编程,循环就是一个更简单的概念。因为您可以使用序列命令执行任何操作,所以循环清楚地表明您正在重复执行任务。
但无论语言的实现如何,CSE都可以提高代码效率。所以我这样做。它不会使代码成为巴洛克式的,并且它可以在不自动包含的语言中运行。
Perl提供语法的压缩,因此通常需要手动消除的子表达式较少。
答案 1 :(得分:1)
不,除非是非常简单的情况,否则它也无法做到。
为了消除常见的子表达式,您必须知道它们之间没有更改它们的值。但是,由于两个表达式之间可能会发生相隔几行,因此几乎无法判断子表达式是否仍然是 common 。
你唯一可以消除的东西就是纯粹的表达,比如“7 + 5
”。但是证明像函数调用这样的东西是可以安全消除的。不会发生。
要做到这一点,你需要强大而保守的静态分析,这是Perl所没有的,并且不太可能获得(在C / C ++中你需要功能较少的东西,因为语言不那么动态,但你还需要一些东西)