編譯原理之中間代碼生成

中間代碼定義

源程序的一種內部表示,不依賴目標機的結構,易於機械生成目標代碼的中間表示。
如果不生成中間代碼而是直接生成機器語言或者彙編語言形式的目標代碼,優點是編譯時間短,缺點是目標代碼執行效率和質量都比較低,移植性差。

爲什麼不直接翻譯成機器碼呢,而多此一舉生成中間代碼再轉換?(代碼的魯棒性)

是爲了提高編譯器的可移植性,因爲不同的cpu的指令集是不一樣的,假如直接翻譯成機器代碼,那麼當你換了一塊cpu之後,可能你的編譯器就完全不能運行了,所以爲了魯棒性,將代碼先翻譯成中間代碼,然後在能在多個不同的cpu上做出相應的改變並且運行了。
在這裏插入圖片描述

使用中間代碼的好處:

1)一是便於編譯器程序的開發和移植(魯棒性)
2)二是代碼進行優化處理

常見的中間代碼表示形式

逆波蘭式(後綴式)、三地址碼(三元式、四元式)、抽象語法樹、有向無環圖。

逆波蘭式 運算量(操作數)寫在前面,把運算符寫在後面,因此又稱爲後綴表示法
在這裏插入圖片描述

三地址碼——最常用的中間代碼形式是三地址碼,它的實現形式常採用四元式形式。
指每條代碼包含一個運算和三個地址,兩個地址用於存放運算對象,一個地址用於存放運算結果。其一般形式爲x=y op z。
四元式
一個四元式具有四個域的記錄結構,表示爲:(op,arg1,arg2,result)。op爲運算符;result存放運算結果;arg爲運算對象,如果爲空,則使用空格,留出位置。
四元式與三元式的唯一區別:
將由序號所表示的運算結果改爲:用(臨時)變量來表示。
此改變使得四元式的運算結果與其在四元式序列中的位置無關.爲代碼的優化提供了極大方便,因爲這樣可以刪除或移動四元式而不會影響運算結果.
在這裏插入圖片描述

例:將 a=b*c+b*d用三元形式
(1) (*,b,c)
(2) (*,b,d)
(3) (+,(1),(2))
(4) (=,(3),a)

例:將 a=b*c+b*d用四元式形式
寫成三地址碼的賦值語句形式如下:
    1) t1 = b*c
    2) t2 = b*d
    3) t3 =t1+t2
    4) a = t3
寫成四元形式如下:
    1) (*,b,c,t1)
    2) (*,b,d,t2)
    3) (+,t1,t2,t3)
    4) (=,t3, ,a)

抽象語法樹
抽象語法樹(Abstract SyntaxCode,AST)是語法樹的一種簡化形式,是源程序的抽象語法結構的樹狀表示,樹的每個節點都表示源代碼中的一種結構。

有向無環圖
有向無環圖(Directed Acyclic Graph,簡稱DAG)對錶達式中的每個子表達式都有一個結點,內部結點表示運算符,它的孩子代表運算分量。DAG中代表公共子表達式的結點只出現一次,具有多個父結點。

一個例子

聲明語句的翻譯之變量的聲明 一個變量的聲明應該由兩部分來完成:類型的定義和變量的聲明
類型定義:爲編譯器提供存儲空間大小的信息
變量聲明:爲變量分配存儲空間
組合數據的類型定義和變量聲明:定義與聲明在一起,定義與聲明分離.

引用於介篇文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章