热门问题
时间线
聊天
视角

死程式码

在执行一个程序的源代码,但其结果是从未使用过任何其他计算。死代码的执行浪费计算时间和内存 来自维基百科,自由的百科全书

Remove ads

死程式码(dead code)有几种不同的定义。有一种定义是指程式运行时永远不会执行到的程式码(记忆体里的指令)[1][2][3]。在一些程序设计的领域中,死程式码是指源代码中有执行,但其他程式没有使用该执行结果的程式[4][5]。死程式码会浪费记忆体,若是有执行的死程式码,还会浪费执行时间。

死程式码的结果虽然不会被其他程式使用,但程式码可能会抛出异常或是影响全域变数,因此移除死程式码有可能会影响程式输出并引入未预期的程序错误。编译器在进行死码删除时,若某程式不确定是否会影响最后输出,编译器最佳化会比较保守。程式设计者也可以帮助编译器,利用静态函式内联函数,并且启动连结时最佳化英语link-time optimization

范例

int foo (int iX, int iY)
{
	int iZ = iX/iY;

	return iX*iY;
}

在上述例子中,尽管计算了iX除以iY的结果,但其从未被使用,并且当iY等于0时程序会抛出异常。因此移除这段代码可能会改变程序的输出。

分析

死码删除优化编译器中的功能,删除程式中的死码。死码分析可以用活跃变数分析英语live-variable analysis来进行,这属于静态程序分析数据流分析。而不可达程式码分析是另一种分析,是以控制流分析为基础。

死码删除技术和不可达程式码英语unreachable code删除和冗馀代码删除是同一类的最佳化。

在大型程式专案中,有时很不容易识别并且删除死程式码,特别是在整个模组都是死代码的情形下。测试脚手架(Test scaffolding)有可能会让程式码看起来仍存活,有时契约语言会要求交付一些已不相关的程式码[6]

有些IDE(像Xcode、Visual Studio 2010[7]和Eclipse Galileo[8])可以在编译过程中找出死程式码。

大部份的最佳化技术是希望在程式实现时移除死程式码,但在对程式码大小有极致要求的最佳化中,有时会刻意引入一些看似无用的程式码,并且小心的编写这些程式码,因为这些程式码可以将一些无关的程式区块集中在一起(因此减少其大小),这段额外的程式码不会影响程式码的主要执行路径,而是用于执行其他执行路径所需的操作,而在其他执行路径下,会有其他的程式码段未使用到。可能因此成为无用程式码。从更具体的功能层面来看,这可以看作是人为地引入无害/有用的副作用,也可以看作是减少程式码冗馀。此外,这种方法还可以应用到操作码级别,从而允许使用更短的指令。如果没有刻意引入由无用程式码产生的副作用,在合并程式码序列时是无法实现这一点的。

Remove ads

相关条目

参考资料

外部链接

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads