必威电竞|足球世界杯竞猜平台

代碼膨脹
來源:互聯網

代碼膨脹(英語:Code bloat)是指代碼有著不必要的長度、緩慢或者其他浪費資源的情況。代碼膨脹可能是由于編寫代碼的語言、編譯時所用的編譯器,或者編寫的程序員所致。因此,雖然代碼膨脹通常指源代碼存在不必要的部分(由程序員導致),但也可指生成的代碼或者二進制文件文件有膨脹問題。

常見原因

通常來說,膨脹的代碼是由于程序員使用了較多的代碼行,而非解決問題的最佳方案。

程序員寫出膨脹代碼的部分原因有:

??過度使用面向對象(OOP)結構,如類和繼承。這可能導致麻煩且混亂的設計,用掉多于最佳解決方案的代碼行。

??不正確的使用設計模式——面向對象的開發人員可能在不需要使用設計模式的地方強行使用,從而導致問題。

??沒有用適當的封裝方案使代碼可重復利用,導致代碼重復

??宣告式編程——在命令式或面向對象語言中實現宣告式編程風格通常會導致代碼膨脹。

??過度的循環展開——不理智的過度優化性能。

??過度使用多重If條件語句——而沒有使用如查找表。

C++中采用的模板系統的一些原生實現是編譯該語言的編譯器之不足之處的例子。

實現此特性的原生編譯器可以為使用的每個數據類型引入一個模板類版本的方法。但是,這也導致被編譯的方法可能永遠不會被用到,導致代碼膨脹。更尖端的編譯器和鏈接器能檢測多余的副本并將其丟棄,或者避免產生它們,從而減少膨脹。因而,使用能放棄死代碼的編譯器可以使模板代碼產生更小的二進制。

一些原生編譯器推導膨脹的例子包括:

??死代碼——代碼被執行,但從未被使用。

??冗余計算——重新計算已經計算過的表達式。這種冗余計算經常在實現防止緩沖區溢出的“邊界檢查”代碼時產生。尖端的編譯器只將其計算一次,使用常用子表達式消除和循環不變代碼外提技術消除冗余計算。

例子

下列ECMAScript算法有著大量的冗余變量、不必要的邏輯,以及低效的字符串連接。

而相同的邏輯可以用下列方式更有效地表達:

不同語言的代碼密度

各種計算機語言的代碼密度有著很大差別,以“緊湊”語言(例如領域特定語言、微軟P代碼、線程代碼)編寫的程序以及緊湊語言(以機器代碼編寫)的解釋器通常比直接用機器語言編寫程序消耗更少的代碼量。

減少膨脹

減少代碼膨脹的一些技術包括:

??重構經常使用的代碼序列為子程序,并從多個位置調用該子程序,而不是在各個位置上復制并粘貼這段代碼。

??重新使用已經被編寫的子程序(可能利用附加參數),而不是從頭編寫它們的新代碼。

參考資料 >

生活家百科家居網