Goコンパイラをゼロから作って147日でセルフホストを達成するまで

進捗を毎日つぶやいてたのでまとめました
24
前へ 1 ・・ 10 11 次へ
DQNEO @DQNEO

deferの超簡易版を実装してみた。 github.com/DQNEO/minigo/c…

2019-04-22 21:21:39
DQNEO @DQNEO

これによって、第二世代パーサのパース時の動きを終えるようになった!これはかなりうれしい。 pic.twitter.com/kIPUz8UKBt

2019-04-22 21:22:48
拡大
DQNEO @DQNEO

map set時に、別の要素が消えてしまうバグがある...

2019-04-23 01:53:39
DQNEO @DQNEO

heap周りの挙動がかなり怪しかったので、heap領域を用途ごとに別々に用意したら、干渉が減ったためかうまく動くようになった。しばらくはこの設計でやってみよう。

2019-04-27 12:34:24
DQNEO @DQNEO

for文がネストしてる場合に、breakすると別のfor文の末尾にジャンプするというとんでもないバグがあったw

2019-04-28 21:15:19
DQNEO @DQNEO

GW前半の成果:第二世代パーサが徐々に動くようになってきて、ついに謎のアセンブリコードらしきものを吐くようになった。これが第三世代コンパイラの卵となるはず 🐣 pic.twitter.com/vwd78XzmPk

2019-05-02 21:00:39
拡大
DQNEO @DQNEO

グローバル変数定義の値の中にポインタが登場するケース、自分では解決策が思い浮かばず、結局8ccのコードからロジックを拝借した。github.com/rui314/8cc/blo… これを移植したら動いたけど、ぼんやりとしか理解してない。アセンブラ/バイナリの深い理解が必要っぽい。

2019-05-03 23:40:58
DQNEO @DQNEO

自分のオリジナル実装も発想としては近かった気がするんだけど、ネスト構造に対応できないのとか、ポインタが途中に登場するとバグるとか、挙動がダメダメだった...w github.com/DQNEO/minigo/c…

2019-05-03 23:46:18
DQNEO @DQNEO

グローバル変数のネストデータ構造、まだバグってたが、おかげでだいぶ理解できるようになってきた。

2019-05-06 21:40:18
DQNEO @DQNEO

しかし、あの .data 0, data 1を駆使してグローバル変数の定義内に別の変数を埋め込むテクニック、自分では絶対思いつかないんだけど、ruiさんはどうやって考案したんだろう?? アセンブラの世界ではよく知られたテクニックだったりするのかな? github.com/rui314/8cc/blo…

2019-05-06 21:57:42
DQNEO @DQNEO

ptr.field = slice がバグってたので直した。コードが汚いのであとできれいにする。github.com/DQNEO/minigo/c…

2019-05-07 13:59:25
DQNEO @DQNEO

第二世代コンパイラが、最小のGoプログラムをコンパイルして実行するところまでできたーgithub.com/DQNEO/minigo/c…

2019-05-07 21:17:59
DQNEO @DQNEO

とこで、ABIの引数 rdi, rsi, rdxの順番を3つだけちゃんと覚えたらアセンブリを書くスピードがあがった。こういう基礎力は意外と重要。

2019-05-07 23:47:54
DQNEO @DQNEO

ついに第二世代コンパイラで hello worldを完全にコンパイルできるようになった 🎉 これはうれしい pic.twitter.com/KiRX9Xaqn3

2019-05-08 12:40:39
拡大
DQNEO @DQNEO

第1世代コンパイラと第二世代コンパイラでhello world出力アセンブリが完全に一致した。

2019-05-08 12:42:29
DQNEO @DQNEO

map get/set まわりのややこしいバグを直した。これで、 v, ok := m[k] のような左辺第二変数が動くようになった 😂 github.com/DQNEO/minigo/c…

2019-05-08 22:28:31
DQNEO @DQNEO

今日一日(振休で仕事休み)でめちゃくちゃ進捗して、第二世代コンパイラがいろいろなテストファイルをコンパイルできるようになった。github.com/DQNEO/minigo/c…

2019-05-08 23:38:23
DQNEO @DQNEO

今週はめちゃくちゃ進捗したぞ〜 github.com/DQNEO/minigo/c… ゴールが見えてきた気がする〜

2019-05-10 22:35:33
DQNEO @DQNEO

もう累計 9,000行も書いた。 参考にしてる 8ccが 7,865行なので、そろそろかな〜 pic.twitter.com/q3nrWTJKIF

2019-05-10 22:44:34
拡大
DQNEO @DQNEO

第二世代パーサーでコンパイラの全ファイルをパースできるようになった!🎉

2019-05-11 16:19:11
DQNEO @DQNEO

パース後のフェーズめ、メソッドテーブルの構築に失敗していて、レシーバ型とメソッド一覧を管理しているmapのデータがゴミ値になってしまう…なんでや… 今日は行き詰まったので寝る

2019-05-12 01:25:44
DQNEO @DQNEO

map set直後にmap getしたらすでに壊れていることが判明。だいぶ範囲が絞れてきた。

2019-05-12 21:10:04
DQNEO @DQNEO

やっと原因わかった... mapのmapをget/setするところが根本的に未実装だった。(未実装と気づくまでが大変) そもそも、map/slice/interface変数をスタック24バイト割り当てる設計にしたのが根本的な間違いだった気がする。。。痛い経験だった

2019-05-12 22:39:18
DQNEO @DQNEO

この最初の設計をミスってなければ、全体の工数1-2ヶ月くらい短縮できてたかもしれない.... まあGoコンパイラ作ったの初めてだからしょうがないか...

2019-05-12 23:04:13
DQNEO @DQNEO

mapのmapが動くようになったー。これでパース後にメソッドテーブルが構築できるようになったー github.com/DQNEO/minigo/c…

2019-05-13 00:14:02
前へ 1 ・・ 10 11 次へ