Compiler construction 什么是;《守则》动议;“的平均值”;循环不变码运动;?

Compiler construction 什么是;《守则》动议;“的平均值”;循环不变码运动;?,compiler-construction,Compiler Construction,在编译器中,该短语描述循环中的代码表达式或语句,这些表达式或语句在一次迭代中不会改变,因此可以移动到循环之外进行一次计算 我理解这个短语的“循环不变”部分,但是“代码运动”是什么意思?代码运动只是指代码从循环中移出,因为如果代码在循环内重复执行或在循环外执行一次,则不会有任何区别。编译器获取不需要在循环中的代码,并将其移出循环以达到优化目的 这里有一个例子: for ( int x=0; x < string.length(); x++) { //other code here }

在编译器中,该短语描述循环中的代码表达式或语句,这些表达式或语句在一次迭代中不会改变,因此可以移动到循环之外进行一次计算

我理解这个短语的“循环不变”部分,但是“代码运动”是什么意思?

代码运动只是指代码从循环中移出,因为如果代码在循环内重复执行或在循环外执行一次,则不会有任何区别。编译器获取不需要在循环中的代码,并将其移出循环以达到优化目的

这里有一个例子:

for ( int x=0; x < string.length(); x++) {
    //other code here
}
for(int x=0;x

如果编译器知道循环中的任何内容都不会改变字符串的长度,它可以将字符串的长度硬编码到程序中,而不是在适当的字符串上插入对方法
length()
的实际调用,因为方法调用将始终返回相同的结果,并且只会浪费内存和处理器时间。方法调用的代码在循环之前移动,而不是留在循环中。本文称之为“代码运动”,尽管我只是称之为普通的旧优化,因为大多数优化都涉及移动代码D

似乎从维基百科的文章中可以看出,循环不变代码实际上是作为一个优化步骤移动到循环之外的。

术语“代码移动”可以用于任何情况,其中一些代码移动到其他地方,并且程序的语义不变。当然,编译器希望获得某种好处,例如寄存器压力降低、代码大小减小、计算量减少等等。这是一个非常通用的优化,很容易描述,但很难“很好地”实现。循环不变代码运动的情况是一个简单的例子,其中许多计算被删除,但对于其他情况,通常很难确定对于特定输入的最佳方法。困难在于所有的法律法规动议是什么,以及哪些是最好的、次优的,或者至少是有益的。

也许我太挑剔了。我理解代码被移动到循环之外,但是“运动”意味着持续不断的位移,而“运动”意味着位置的一次性变化。也许我对这个短语读得太多了。@Ross我想你读得太多了。代码移动是一个更好的名称,因为它绝对不是连续的。:)