[問題] 如何讓C盡量有組合語言的形式

作者: wei115 (ㄎㄎ)   2019-05-06 23:49:47
問題(Question):
我想試試看實作一個C編譯器
之前沒有學過編譯器,看了幾個星期的資料後,還是不太懂編譯器
不過土法煉鋼,還是煉出了一些東西
因為不知道寫一個編譯器的難度,所以簡化一下目標,只做編譯器的前端
使用C作為中間語言,希望可以去除語法糖,和格式盡量和組合語言相近,以便後端實做
使用遞迴下降方法,沒有多少檢查(int str = "aabbcc"; 是可以的)
語法3成參考K&R,7成用猜的,程式碼寫的不夠合理,常常加一個功能就要動到整個專案
之後收集更多資料後會全部打掉重練
目前有做出int、char的宣告if、while
之後想做陣列&指標的功能,但不知道指標的宣告和使用該如何簡化
想請各位大大提供一些方向
謝謝
p.s
以一個1+...+100的迴圈程式為例
輸入:
int main()
{
int a = 101;
int out = 0;
while(a = a - 1)
out = out + a;
}
輸出:
int r0;int r1;int r2;int r3;int r4;int r5;int r6;int r7;int r8;int r9;int
r10;int r11;int r12;int r13;int r14;int r15;int r16;int r17;int r18;int r19;
int main()
{
r0 = 101;
int a = r0;
r0 = 0;
int out = r0;
L0:
r0 = a;
r1 = a;
r2 = 1;
r3 = r1 - r2;
r0 = r3;
a = r3;
if(!r0) goto L1;
r4 = out;
r5 = out;
r6 = a;
r7 = r5 + r6;
r4 = r7;
out = r7;
goto L0;
L1:
}
希望輸入的程式碼可以轉成這種最簡形式
作者: Lipraxde (Lipraxde)   2019-05-07 07:41:00
你知道 SSA form 是什麼東西嗎?你好像是想在產生中間表示法的時後做暫存器分配?暫存器分配是後端該做的事那你有 AST 嗎?
作者: wei115 (ㄎㄎ)   2019-05-07 11:53:00
沒有,詞彙分析後用遞迴下降,直接輸出中間碼中間基本上全部寫成一陀.....
作者: Lipraxde (Lipraxde)   2019-05-07 12:10:00
先建立 AST,之後再從 AST 產生中間碼會比較容易寫
作者: wei115 (ㄎㄎ)   2019-05-07 12:26:00
目前對ast不夠了解,之後收集足夠的資料後打算全部重寫,但是現在對要產生怎樣形式的中間碼還沒有什麼頭緒
作者: Lipraxde (Lipraxde)   2019-05-07 13:22:00
用你原本的方法就好了啊,不然 java bytecode、llvm IR之類的,還是你是打算後端也自己寫?
作者: Killercat (殺人貓™)   2019-05-07 13:47:00
可惜不是C++ 不然板上一堆CPPGM的心得 XD
作者: eye5002003 (下一夜)   2019-05-07 18:17:00
作者: RishYang (Rish)   2019-05-09 03:16:00
小弟我最近寫了簡單的Lexer與Parser參考了http://rosettacode.org/wiki/Compiler寫了網誌https://reurl.cc/Qmr2O 希望有幫助

Links booklink

Contact Us: admin [ a t ] ucptt.com