作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題Re: [問題] 如何讓C盡量有組合語言的形式
時間Tue May 7 18:04:33 2019
編譯器真的很難。
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