版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系我們

[科普中國]-死碼刪除

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

死碼消除(Dead code elimination)是一種編譯器原理中編譯最優(yōu)化技術(shù),它的用途是移除對(duì)程序運(yùn)行結(jié)果沒有任何影響的代碼。

概念死碼消除(Dead code elimination)是一種編譯器原理中編譯最優(yōu)化技術(shù),它的用途是移除對(duì)程序運(yùn)行結(jié)果沒有任何影響的代碼。移除這類的代碼有兩種優(yōu)點(diǎn),不但可以減少程序的大小,還可以避免程序在運(yùn)行中進(jìn)行不相關(guān)的運(yùn)算行為,減少它運(yùn)行的時(shí)間。不會(huì)被運(yùn)行到的代碼(unreachable code)以及只會(huì)影響到無關(guān)程序運(yùn)行結(jié)果的變量(Dead Variables),都是死碼(Dead code)的范疇。

死碼的刪除死碼通常被視為無條件的(unconditionally),所以我們可以在編譯時(shí)期透過死碼刪除來移除這些無用的代碼1。

然而,在實(shí)現(xiàn)上,只有在特定的情形才會(huì)標(biāo)注一個(gè)代碼區(qū)塊是無用的,或是不會(huì)運(yùn)行到的,這可能無法在編譯時(shí)期所得知。例如在不同的運(yùn)行環(huán)境有不同的結(jié)果(舉例來說,目標(biāo)環(huán)境可能會(huì)有不同的操作系統(tǒng)版本,或是不同的驅(qū)動(dòng)程序及可用服務(wù)的組合),可能會(huì)在代碼內(nèi)要求不同特例的集合,同時(shí)在這些案例下就變成有條件的死碼。然而,軟件(例如驅(qū)動(dòng)程序、或是常駐服務(wù))可能會(huì)根據(jù)用戶的設(shè)置,而配置或排除特定的功能,使得在一些特定的情境,會(huì)變成部分無用的死碼。模塊化軟件實(shí)現(xiàn)方式,是在需要時(shí)才讀取動(dòng)態(tài)庫,在多數(shù)的案例中,不可能僅從特定的庫讀取相關(guān)的程序,它仍然會(huì)包含一些程序片段,在特定的環(huán)境下是可被視為死碼,但是這在編譯時(shí)期是無法被排除的。

動(dòng)態(tài)死碼刪除(dynamic dead code elimination)被使用在運(yùn)行時(shí)動(dòng)態(tài)偵測,可辨識(shí)及解析相依性,用以移除有條件的死碼,在運(yùn)行時(shí)期重新組合保留的代碼。

多數(shù)的計(jì)算機(jī)語言、編譯器、操作系統(tǒng)不提供,或是僅比動(dòng)態(tài)讀取庫及后鏈接(late linking)提供多一點(diǎn)點(diǎn)的功能,能使用動(dòng)態(tài)死碼刪除的軟件是相當(dāng)稀少的。

示例下列的示例,以C語言寫成:

int foo(void)

{

int a = 24;

int b = 25; /* 賦值給一個(gè)無用的變量*/

int c;

c = a > 1);
if (0) { /* DEBUG */
printf("%d\n", c);
}
return c;
}

由于0將永遠(yuǎn)被視為False,所以if判斷式內(nèi)的程序?qū)⒂肋h(yuǎn)不會(huì)被運(yùn)行,死碼刪除將會(huì)把它移除,這個(gè)技術(shù)在調(diào)試上相當(dāng)常見,我們可以透過一個(gè)數(shù)值來決定程序段是否該被編譯,使用死碼刪除的最優(yōu)化過程,將會(huì)使用預(yù)處理器來進(jìn)行相同的工作。

實(shí)現(xiàn)中,有些在最優(yōu)化過程中找到的死碼,是被其他最優(yōu)化技術(shù)產(chǎn)生,舉例來說,典型強(qiáng)度折減的技術(shù),將會(huì)在代碼內(nèi)插入新的運(yùn)算以取代昂貴的運(yùn)算行為,而被取代的代碼就成了死碼,隨后,死碼刪除會(huì)移除那些計(jì)算,以完成這個(gè)效果(沒有復(fù)雜的強(qiáng)度折減算法)。

從歷史上來看,死碼刪除使用來自數(shù)據(jù)流分析的信息,Cytronetal在原始文章中發(fā)布了一個(gè)基于靜態(tài)單賦值形式的算法,Shillingsburg改進(jìn)了這個(gè)算法,并開發(fā)了一個(gè)算法來移除無用的控制流(Control-flow)。

本詞條內(nèi)容貢獻(xiàn)者為:

鄢志丹 - 副教授 - 中國石油大學(xué)(華東)