热门问题
时间线
聊天
视角
死程式码
在执行一个程序的源代码,但其结果是从未使用过任何其他计算。死代码的执行浪费计算时间和内存 来自维基百科,自由的百科全书
Remove ads
死程式码(dead code)有几种不同的定义。有一种定义是指程式运行时永远不会执行到的程式码(记忆体里的指令)[1][2][3]。在一些程序设计的领域中,死程式码是指源代码中有执行,但其他程式没有使用该执行结果的程式[4][5]。死程式码会浪费记忆体,若是有执行的死程式码,还会浪费执行时间。
死程式码的结果虽然不会被其他程式使用,但程式码可能会抛出异常或是影响全域变数,因此移除死程式码有可能会影响程式输出并引入未预期的程序错误。编译器在进行死码删除时,若某程式不确定是否会影响最后输出,编译器最佳化会比较保守。程式设计者也可以帮助编译器,利用静态函式、内联函数,并且启动连结时最佳化。
范例
int foo (int iX, int iY)
{
int iZ = iX/iY;
return iX*iY;
}
在上述例子中,尽管计算了iX除以iY的结果,但其从未被使用,并且当iY等于0时程序会抛出异常。因此移除这段代码可能会改变程序的输出。
分析
死码删除是优化编译器中的功能,删除程式中的死码。死码分析可以用活跃变数分析来进行,这属于静态程序分析和数据流分析。而不可达程式码分析是另一种分析,是以控制流分析为基础。
死码删除技术和不可达程式码删除和冗馀代码删除是同一类的最佳化。
在大型程式专案中,有时很不容易识别并且删除死程式码,特别是在整个模组都是死代码的情形下。测试脚手架(Test scaffolding)有可能会让程式码看起来仍存活,有时契约语言会要求交付一些已不相关的程式码[6]。
有些IDE(像Xcode、Visual Studio 2010[7]和Eclipse Galileo[8])可以在编译过程中找出死程式码。
大部份的最佳化技术是希望在程式实现时移除死程式码,但在对程式码大小有极致要求的最佳化中,有时会刻意引入一些看似无用的程式码,并且小心的编写这些程式码,因为这些程式码可以将一些无关的程式区块集中在一起(因此减少其大小),这段额外的程式码不会影响程式码的主要执行路径,而是用于执行其他执行路径所需的操作,而在其他执行路径下,会有其他的程式码段未使用到。可能因此成为无用程式码。从更具体的功能层面来看,这可以看作是人为地引入无害/有用的副作用,也可以看作是减少程式码冗馀。此外,这种方法还可以应用到操作码级别,从而允许使用更短的指令。如果没有刻意引入由无用程式码产生的副作用,在合并程式码序列时是无法实现这一点的。
Remove ads
相关条目
参考资料
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads