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

代碼優化

以老師PPT爲標準,借鑑部分教材內容,AlvinZH學習筆記。數組

概述

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

原則:進行優化必須嚴格遵循「不能改變原有程序語義」原則。函數

2. 優化的分類學習

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

從優化涉及的範圍,又分爲:局部優化、循環優化、全局優化。code

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
- 《編譯原理級編譯程序構造》
相關文章
相關標籤/搜索