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

看板C_and_CPP (C/C++)作者 (NEET)時間6年前 (2019/05/06 23:49), 6年前編輯推噓1(1014)
留言15則, 5人參與, 6年前最新討論串1/3 (看更多)
問題(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: } 希望輸入的程式碼可以轉成這種最簡形式 -- 「我不創造美少女,我只是從紙中看見了天使,並用手使她們自由。」 ——矢吹 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.109.77 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1557157798.A.E9F.html

05/07 07:41, 6年前 , 1F
你知道 SSA form 是什麼東西嗎?你好像是想在產生中間
05/07 07:41, 1F

05/07 07:41, 6年前 , 2F
表示法的時後做暫存器分配?暫存器分配是後端該做的事
05/07 07:41, 2F
會有這樣的現象是因為我在亂寫....,原本是計算機的形式(輸入一個算式,輸出是三位址 碼),處理的時候是以一行作為單位,處理完之後,暫存器編號歸零,後來擴充功能後這樣 的形式也保留了下來 ※ 編輯: wei115 (27.246.39.28), 05/07/2019 09:41:02

05/07 11:10, 6年前 , 3F
那你有 AST 嗎?
05/07 11:10, 3F

05/07 11:53, 6年前 , 4F
沒有,詞彙分析後用遞迴下降,直接輸出中間碼
05/07 11:53, 4F

05/07 11:54, 6年前 , 5F
中間基本上全部寫成一陀.....
05/07 11:54, 5F

05/07 12:10, 6年前 , 6F
先建立 AST,之後再從 AST 產生中間碼會比較容易寫
05/07 12:10, 6F

05/07 12:26, 6年前 , 7F
目前對ast不夠了解,之後收集足夠的資料後打算全部重寫,
05/07 12:26, 7F

05/07 12:26, 6年前 , 8F
但是現在對要產生怎樣形式的中間碼還沒有什麼頭緒
05/07 12:26, 8F

05/07 13:22, 6年前 , 9F
用你原本的方法就好了啊,不然 java bytecode、llvm IR
05/07 13:22, 9F

05/07 13:22, 6年前 , 10F
之類的,還是你是打算後端也自己寫?
05/07 13:22, 10F
普通的運算式我可以這樣寫,但像是指標和陣列我就不知道怎麼分解了......

05/07 13:47, 6年前 , 11F
可惜不是C++ 不然板上一堆CPPGM的心得 XD
05/07 13:47, 11F
C++感覺更難...... ※ 編輯: wei115 (27.246.39.28), 05/07/2019 14:03:13

05/07 18:17, 6年前 , 12F
05/07 18:17, 12F

05/09 03:16, 6年前 , 13F
小弟我最近寫了簡單的Lexer與Parser
05/09 03:16, 13F

05/09 03:17, 6年前 , 14F
05/09 03:17, 14F

05/09 03:20, 6年前 , 15F
寫了網誌https://reurl.cc/Qmr2O 希望有幫助
05/09 03:20, 15F
文章代碼(AID): #1Sq5UcwV (C_and_CPP)
文章代碼(AID): #1Sq5UcwV (C_and_CPP)