跳转到内容

死程式碼

维基百科,自由的百科全书
(重定向自死碼

死程式碼(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])可以在編譯過程中找出死程式碼。

大部份的最佳化技術是希望在程式實現時移除死程式碼,但在對程式碼大小有極致要求的最佳化中,有時會刻意引入一些看似無用的程式碼,並且小心的編寫這些程式碼,因為這些程式碼可以將一些無關的程式區塊集中在一起(因此減少其大小),這段額外的程式碼不會影響程式碼的主要執行路徑,而是用於執行其他執行路徑所需的操作,而在其他執行路徑下,會有其他的程式碼段未使用到。可能因此成為無用程式碼。從更具體的功能層面來看,這可以看作是人為地引入無害/有用的副作用,也可以看作是減少程式碼冗餘。此外,這種方法還可以應用到操作碼級別,從而允許使用更短的指令。如果沒有刻意引入由無用程式碼產生的副作用,在合併程式碼序列時是無法實現這一點的。

相關條目

[编辑]

參考資料

[编辑]
  1. ^ Hongwei Xi, Dead Code Elimination through Dependent Types (PDF). [2020-05-06]. (原始内容 (PDF)存档于2012-03-10). 
  2. ^ [1] 互联网档案馆存檔,存档日期2020-05-20. DO-178B
  3. ^ DO-178B英语DO-178B Wikipedia/DO-178B.
  4. ^ Debray, S. K., Evans, W., Muth, R., and De Sutter, B. 2000. Compiler techniques for code compaction. ACM Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 378–415.
  5. ^ Andrew Appel 1998 Modern Compiler Implementation in Java. Cambridge University Press.
  6. ^ Douglas W. Jones Dead Code Maintenance, Risks 8.19 (Feb. 1, 1989) 互联网档案馆存檔,存档日期2011-07-08.
  7. ^ Habib Heydarian, Microsoft Corp
  8. ^ Eclipse Developer Guide

外部連結

[编辑]