什麼是中間程式碼生成?
中間程式碼可以將源程式轉換為機器程式。生成中間程式碼是因為編譯器無法在一遍中直接生成機器程式碼。因此,它首先將源程式轉換為中間程式碼,然後進行高效的機器程式碼生成。中間程式碼可以表示為字尾表示法、語法樹、有向無環圖、三地址碼、四元式和三元式。
如果可以將編譯階段分為兩部分,即前端和後端,那麼此階段位於兩者之間。
中間程式碼生成的示例:
- 三地址碼:這些語句的形式為 c = a op b,即最多包含三個地址,兩個用於運算元,一個用於結果。每條指令的右側最多隻有一個運算子。
語句的三地址碼示例
- 字尾表示法:在後綴表示法中,運算子位於運算元之後,即運算子位於運算元後面。
示例
表示式 (a+b) * (c+d) 的字尾表示法為 ab + cd + *。
表示式 (a*b) - (c+d) 的字尾表示法為 ab*cd+-。
語法樹:它是語法樹的簡化形式,其中葉子是識別符號,內部節點是運算子。
示例
- 四元式表示:具有運算子和運算元欄位的記錄可以用來描述三地址語句。可以使用具有欄位的記錄結構,第一個欄位儲存運算子“op”,接下來的兩個分別儲存運算元 1 和 2,最後一個欄位儲存結果。這種三地址表示法稱為四元式表示法。
- 三元式表示:運算元 1、運算元 2 和結果欄位的內容通常是指向這些欄位定義的名稱的符號記錄的指標。因此,重要的是在生成臨時名稱時將它們新增到符號表中。
這可以透過使用語句的位置定義臨時值來避免。如果完成此操作,則只需要一個具有三個欄位的記錄結構來定義三地址語句:第一個欄位儲存運算子,接下來的兩個分別儲存運算元 1 和運算元 2 的值。這種表示法稱為三元式表示法。
中間程式碼生成的優點
它是與機器無關的。它可以在不同的平臺上執行。
它使程式碼最佳化功能更容易實現。可以使用與機器無關的程式碼最佳化器來最佳化中間程式碼以生成程式碼。
它可以進行高效的程式碼生成。
可以從現有的前端為給定的後端生成新的編譯器。
語法制導翻譯實現了中間程式碼生成,因此可以透過增強解析器將其摺疊到解析中。
廣告