看板 C_and_CPP 關於我們 聯絡資訊
編譯器真的很難。 https://descent-incoming.blogspot.com/2017/01/blog-post.html 這篇描述我的學習方式, 讓你參考看看。 也列出我有購買的編譯器書籍, 看看你有沒有興趣的。 https://descent-incoming.blogspot.com/2018/01/44.html 這幾篇描述我一步步走來的紀錄。 從建立 AST 到輸出組合語言。 最後我也寫了一個簡單的組譯器, 輸出的 elf object file 可以和 gnu ld, link, 最後我停留在這裡。 這幾篇文章最主要是展示我的學習方式, 也許你有不同的學習之路。 我是建議產生 AST, 有了 AST, 後續的動作會很好處理。 ※ 引述《wei115 (NEET)》之銘言: : 問題(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 : → Lipraxde: 你知道 SSA form 是什麼東西嗎?你好像是想在產生中間 05/07 07:41 : → Lipraxde: 表示法的時後做暫存器分配?暫存器分配是後端該做的事 05/07 07:41 : 會有這樣的現象是因為我在亂寫....,原本是計算機的形式(輸入一個算式,輸出是三位址 : 碼),處理的時候是以一行作為單位,處理完之後,暫存器編號歸零,後來擴充功能後這樣 : 的形式也保留了下來 : ※ 編輯: wei115 (27.246.39.28), 05/07/2019 09:41:02 : → Lipraxde: 那你有 AST 嗎? 05/07 11:10 : → wei115: 沒有,詞彙分析後用遞迴下降,直接輸出中間碼 05/07 11:53 : → wei115: 中間基本上全部寫成一陀..... 05/07 11:54 : → Lipraxde: 先建立 AST,之後再從 AST 產生中間碼會比較容易寫 05/07 12:10 : → wei115: 目前對ast不夠了解,之後收集足夠的資料後打算全部重寫, 05/07 12:26 : → wei115: 但是現在對要產生怎樣形式的中間碼還沒有什麼頭緒 05/07 12:26 : → Lipraxde: 用你原本的方法就好了啊,不然 java bytecode、llvm IR 05/07 13:22 : → Lipraxde: 之類的,還是你是打算後端也自己寫? 05/07 13:22 : 普通的運算式我可以這樣寫,但像是指標和陣列我就不知道怎麼分解了...... : → Killercat: 可惜不是C++ 不然板上一堆CPPGM的心得 XD 05/07 13:47 : C++感覺更難...... : ※ 編輯: wei115 (27.246.39.28), 05/07/2019 14:03:13 -- 紙上得來終覺淺,絕知此事要躬行。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.196.174.254 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1557223480.A.ACB.html ※ 編輯: descent (113.196.174.254), 05/07/2019 18:13:31
cutekid: 推(Y) 05/07 20:29
kishow01: 推推 剛剛好也在學編譯器 05/07 21:12
wei115: d大我有看你的文章!但我程度還是不夠,要消化需要一段時 05/08 03:04
wei115: 間 05/08 03:04
wei115: 之後我會試試看實作AST 05/08 03:05