最近我一直在研究編譯器的設計。我已經成功掌握瞭解析階段,但在理解代碼生成的工作方式方面遇到了一些麻煩。彙編代碼生成如何工作?
從我讀過的東西,似乎是在代碼生成階段3個主要步驟:
- 指令選擇(貪婪平鋪)
- 指令調度
- 寄存器分配
現在,指令調度稍微超出了我目前所要做的,並且我認爲通過更多的學習和原型設計,我可以將我的思想包圍在圖形公司用於寄存器分配的loring算法。
什麼殘缺我是第一步,指令選擇。從我讀到的內容來看,目標機器語言中的每條指令都由一個圖塊表示;目標是找到匹配樹最大部分的指令(因此稱爲暱稱,貪婪的平鋪)。
我很困惑的事情是,當它們沒有實際上與語法樹1:1對應時,如何選擇指令?例如,基於累加器的體系結構(如Z80或MIP單指令體系結構)。在Z80上執行甚至16位整數運算可能需要使用累加器或影子寄存器。
還有一些說明只能用於某些寄存器,儘管它們是通用的。
我是否正確地承擔以下事項? a)瓦片可以由匹配語法樹模式的指令序列組成,而不僅僅是1:1匹配。 b)代碼生成器首先爲基於堆棧的體系結構(或具有無限臨時寄存器的體系結構)生成代碼,並在寄存器分配階段以必要的方式擴展和替換指令。