2,619
次編輯
Tankianting(討論 | 貢獻) (→第三章) |
Tankianting(討論 | 貢獻) |
||
行 5: | 行 5: | ||
* {{ISBN|9780262047760}} | * {{ISBN|9780262047760}} | ||
* 書源 Repo:https://github.com/IUCompilerCourse/Essentials-of-Compilation/tree/master | * 書源 Repo:https://github.com/IUCompilerCourse/Essentials-of-Compilation/tree/master | ||
** 備份PDF檔:[[:檔案:Essentials of Compilation- An Incremental Approach in Racket 2023 Edition.pdf]]、[ | ** 備份PDF檔:[[:檔案:Essentials of Compilation- An Incremental Approach in Racket 2023 Edition.pdf]]、[https://github.com/IUCompilerCourse/Essentials-of-Compilation/blob/master/Essentials_of_Compilation_Racket.pptx 簡報載點] | ||
==概要== | ==概要== | ||
行 79: | 行 79: | ||
*就是要用子型別Lvar繼承Lint,然後必要的時候呼叫super.interp(),其餘時候調用interp() | *就是要用子型別Lvar繼承Lint,然後必要的時候呼叫super.interp(),其餘時候調用interp() | ||
P.16:我們編譯從P1語言轉成P2語言,再用x86語言編譯就得到想要的結果。 | |||
但是也可以用P1的直譯得到同樣的結果。 | |||
*global:令主程式空間在外界使用。 | |||
*64bit:計算機記憶體的使用, | |||
*counter:指下一個執行指令的地址 | |||
<pre> | |||
.global main ;x86 | |||
main: | |||
movq $10,%rax ; $指整數常量,引數還可以用記憶體位置,寄存器名稱。 | |||
addq $32, %rax | |||
retq | |||
</pre> | |||
寄存器有16個 | |||
movq s, d, $n, callq, retq, jmp label | |||
[ | |||
*rsp stack堆疊之指標,向下增長 | |||
*減掉其值,則增加stack堆疊之大小。 | |||
總之這一段不會組合語言就很難懂。 | |||
要定義子語言,建議創立一個instr系列的records,儲存指令,以利模式比對。 | |||
使用pass各自解決一個子問題求解 | |||
要明確知道選擇,以及我們循序漸進編譯: | |||
* uniqify :唯一化變數名稱 | |||
*remove complex operands:primitive處理的運算元變成var or integer | |||
*explicate control:明確化執行順序 | |||
*select instruction:轉換L_var到x86 | |||
* assign_homes:變數轉換至暫存器或堆疊位置。 | |||
* patch instruction | |||
* prelude and conclusion(x86的頭和尾) | |||
==第三章== | ==第三章== | ||
stack 堆疊速度比較慢 | stack 堆疊速度比較慢 |