標籤:

編譯原理(3)

編譯原理(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:編譯原理 |