編譯原理學習筆記(十二)代碼優化


代碼優化

以老師PPT為標准,借鑒部分教材內容,AlvinZH學習筆記。

概述

.1. 目的:提高目標代碼運行效率。時間效率(減少運行時間);空間效率(減少內存容量)。

原則:進行優化必須嚴格遵循“不能改變原有程序語義”原則。

2. 優化的分類

從優化的層次,與機器是否有關,分為:獨立於機器的優化、與機器有關的優化。

從優化涉及的范圍,又分為:局部優化、循環優化、全局優化。

3. 滿足以下三個條件的程序段,稱為基本塊:

  • 只有一個入口和一個出口,且語句為順序執行的程序段。
  • 它使得所有轉向該基本塊的入口都是該基本塊的第一條語句。
  • 如果塊中任一語句被執行,則該塊內的所有語句也將被執行(無分支),且執行次數一樣(無循環)。

基本塊划分問題

(1)確定入口語句

  • 語句序列第一句為入口語句;
  • 任何可以由條件/無條件跳轉而轉移到的第一條語句為入口語句;
  • 緊跟在跳轉語句之后的第一條語句為入口語句;

(2)每個入口語句直到下一個入口語句或程序結束,之間的語句屬於同一個基本快。

優化基本方法

1. 利用代數性質(代數變換)

  • 編譯時完成常數表達式的計算,如a:=5+6+x變成a:=11+x。
  • 數組下標引用時,下標偏移可在編譯時預先做好。
  • 運算強度減弱,如x*8變成x<<3。

2. 復寫(copy)傳播:如 x:=y 這樣的賦值語句,二者值相同,有些情況可以用y代替x編譯。其實就是將多語句簡化,減少值的傳播過程。

3. 刪除公共達式:具有相同值的子表達式在兩個以上地方出現時,稱它為公共子表達式。可以將之刪除至一次,將多次計算變為一次。

4. 刪除冗余代碼:冗余代碼就是毫無實際意義的代碼,又稱死代碼 (deadcode)或無用代碼(useless code)。永遠不會執行的代碼。

5. 循環優化

  • 循環不變式的代碼外提:提取出循環過程中不隨循環控制變量改變的表達式至循環之外,從而減少計算次數,也稱頻度削弱。
  • 循環展開:將循環展開減少執行語句數量,以空間換時間。
  • 歸納變量的優化和條件判斷的替換
  • 其他循環優化方法:把多重嵌套的循環變成單層循環;把 n 個相同形式的循環合成一個循環等。

6. in_line展開:把過程(或函數)調用改為in_line展開可節省許多處理過程(函數)調用所花費的開銷。省去了函數調用時參數壓棧,保存返回地址等指令。這也僅僅限於簡單的函數。

7. 其他方法,如控制流方法。

引用說明

- 邵老師課堂PDF
- 《編譯原理級編譯程序構造》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM