死程式碼(dead code)有幾種不同的定義。有一種定義是指程式運行時永遠不會執行到的程式碼(記憶體裡的指令)。在一些程序设计的領域中,死程式碼是指源代码中有執行,但其他程式沒有使用該執行結果的程式。死程式碼會浪費記憶體,若是有執行的死程式碼,還會浪費執行時間。
死程式碼的結果雖然不會被其他程式使用,但程式碼可能會抛出异常或是影響全域變數,因此移除死程式碼有可能會影響程式輸出並引入未預期的程序错误。編譯器在進行死碼刪除時,若某程式不確定是否會影響最後輸出,編譯器最佳化會比較保守。程式設計者也可以幫助編譯器,利用靜態函式、内联函数,並且啟動。
范例
int foo (int iX, int iY)
{
int iZ = iX/iY;
return iX*iY;
}
在上述例子中,尽管计算了除以的结果,但其从未被使用,并且当等于0时程序会抛出异常。因此移除这段代码可能会改变程序的输出。
分析
死碼刪除是优化编译器中的功能,刪除程式中的死碼。死碼分析可以用來進行,這屬於靜態程序分析和数据流分析。而不可達程式碼分析是另一種分析,是以控制流分析為基礎。
死碼刪除技術和刪除和冗餘代碼刪除是同一類的最佳化。
在大型程式專案中,有時很不容易識別並且刪除死程式碼,特別是在整個模組都是死代碼的情形下。測試腳手架(Test scaffolding)有可能會讓程式碼看起來仍存活,有時契約語言會要求交付一些已不相關的程式碼。
有些IDE(像Xcode、Visual Studio 2010和Eclipse Galileo)可以在編譯過程中找出死程式碼。
大部份的最佳化技術是希望在程式實現時移除死程式碼,但在對程式碼大小有極致要求的最佳化中,有時會刻意引入一些看似無用的程式碼,並且小心的編寫這些程式碼,因為這些程式碼可以將一些無關的程式區塊集中在一起(因此減少其大小),這段額外的程式碼不會影響程式碼的主要執行路徑,而是用於執行其他執行路徑所需的操作,而在其他執行路徑下,會有其他的程式碼段未使用到。可能因此成為無用程式碼。從更具體的功能層面來看,這可以看作是人為地引入無害/有用的副作用,也可以看作是減少程式碼冗餘。此外,這種方法還可以應用到操作碼級別,從而允許使用更短的指令。如果沒有刻意引入由無用程式碼產生的副作用,在合併程式碼序列時是無法實現這一點的。
相關條目
- 死碼刪除
- 代碼冗餘
*
*
- 0xDEADC0DE是用Hexspeak寫的魔術數字,是OpenWrt韌體裡的標示。
參考資料
外部連結
- [https://web.archive.org/web/20110722110715/http://java.net/projects/dcd/pages/Home Dead Code Detector (DCD) simply finds never used code in your Java/JEE applications]
- [https://web.archive.org/web/20110722110615/http://java.net/projects/dcd/pages/Alternatives Comparisons of some Java Dead Code Detector]
- [http://www.ucdetector.org/ UCDetector] Eclipse PlugIn to find dead java code
评论 (0)