編譯原理(3)
來自專欄編譯原理學習筆記
(接上一節編譯過程)
5.代碼優化
關於為什麼要優化,優化的意義在數據結構課程上已經學了很多了。
對機器來講,加法比乘法簡單,移位又比加法簡單,這是從運算角度考慮優化。另外,循環體肯定是最費時間的,那讓循環中的語句少一點,快一點,也是優化的方向。這是一個優化的示例:
把循環不變數提到循環外面,然後還變換了乘法為加法。循環的強度一下子減少了,這塊的等價變化是根據數據流方程進行分析的。
6.目標代碼生成
對優化後的代碼一對一的翻譯:
以上就是對編譯過程的一個概述,下面學習編譯程序的結構:
三、編譯程序的結構
1.編譯程序總框:
上面講了五個過程,從上一個過程到下一個過程,中間還有一些細節,上圖就是編譯程序的結構,我們看到兩側加上了表格管理和出錯處理,老師講課時比作我們上大學,從一年級到四年級,每次升級都要維護檔案,比如成績登入啊,比如獲得什麼獎學金,這就是類似的表格管理。而考試可能會掛科,就要出錯處理。。每個學年的評定獎項還有最後畢業呢,保研還是出國工作,這些表格的數據都會用到等等。
下面是詳解:
2.表格與表格管理
下面是表格的一些舉例:
3.出錯處理
關於自動校準,還是很難的,而且校正時候可能最終的結果不是你想要的意思,所以說代價非常高,一般不會有這麼乾的編譯器。
錯誤有:
- 語法錯誤:不符合語法(或詞法)規則的錯誤,單詞拼寫錯誤、括弧不匹配錯誤......
- 語義錯誤:不符合語義規則的錯誤,說明錯誤、作用域作物、類型不匹配.....
4.遍:
按照常規的理解,我們先掃一遍詞法分析,然後掃一遍語法分析,接著掃一遍生成中間代碼等等,一共需要五遍。但是實際情況,舉個例子,比如有的程序語言本身比較簡單,結構很簡單,沒有必要跑五趟從頭到尾下來,那麼遍數能不能少一點,比如詞法語法合在一起做等等。
5.編譯前端與後端
編譯前端:主要由與源語言有關但與目標機無關的那些部分組成。詞法分析,語法分析,中間代碼生成。
編譯後端:包括編譯程序中與目標機有關的那些部分。代碼優化,目標代碼生成。
四、編譯程序生成
1.編譯程序的構造
編譯程序的構造大多採用機器語言或者彙編語言,現在越來越多採用高級語言。為了充分發揮效率或滿足不同需求,很多時候還會採用機器語言或彙編語言去構造編譯程序(或其核心部分)
2.T型圖
T型圖可以表示一個編譯程序。S表示源語言,I表示編譯程序實現語言,T表示目標語言。
3. 用高級語言L1構造編譯程序
4.編譯程序的移植
5.自編譯方式
先對語言的核心部分構造一個小小的編譯程序(可用低級語言實現)
再以它為工具構造能編譯更多語言成分的較大編譯程序
如此不斷擴展,最後形成整個編譯程序(滾雪球)
6.構造工具
構造編譯程序的工具稱為編譯程序-編譯程序、編譯程序產生器或翻譯程序書寫系統
自動產生掃描器 LEX FLEX
自動產生語法分析器 YACC BISON
推薦閱讀:
※詞法分析器
※從編譯原理看一個解釋器的實現
※編譯原理(4)第二章 詞法分析
※編譯原理(五)
※具有 e動作的NFA到DFA確定化演算法
TAG:編譯原理 |