「Essentials of Compilation筆記」修訂間的差異

增加 1,163 位元組 、 2024年4月7日 (星期日)
無編輯摘要
 
行 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]]、[簡報載點 https://github.com/IUCompilerCourse/Essentials-of-Compilation/blob/master/Essentials_of_Compilation_Racket.pptx]
** 備份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 堆疊速度比較慢