LLVM用の素直なコンパイラ書いてます

x86_64なら安心だと思ってたけど、LLVMのほうがもっと安心だった。
ってことで、LLVM用の素直なコンパイラを書いてます。

スタックマシン的なコンパイラは作った訳ですが、仮想スタックが邪魔臭いので、素直にレジスタマシンへコンパイルする物を作ろうってわけで、これ作ったら公開しようと思っていた訳ですが、結構、こいつは大変だぞってことで、精神的にかなり大きな壁になっていました。どこから、どう手をつけよう?一から作り直すか、部分的修正をするかと考えてました。

辛いので、作戦タイムという感じで、オブジェクト指向とか、名前空間の研究をしてみたり、TAPLを読んでみたり、数学を勉強してみたり、パターンマッチの作り方を研究したりしてました。新しい言語のモデルを考えてみたり。

で、そろそろ、休憩もしたし、気合いを入れ直して作るぜってことで、レジスタマシン的LLVM用のコンパイラを作り始めました。

作戦

まず、簡単なスタックマシン的なコンパイラレジスタマシン的なコンパイラに書き換えます。
2,3日で書けたのかな?テストがあるので、それを1つずつ潰して行きました。軌道に乗るまでは苦しかったけど、慣れたらいい感じに進めて、完成する事が出来ました。


これで大体の感触をつかんだので、フルセットな言語に手を付けました。

最初の1個のテストを通すのがまず目標で、compile.scalaとll_emit.scalaをkNormal.scalaとllemit.scalaの2つに置き換える事にしました。

1個テストが通ったら、2個目3個目と最初は結構簡単です。
しかし、だんだん難しくなって行きます。次の目標はlong型のテストを全部通す事。
long型のテストでも、配列やら、ポインタも扱っているので、かなり大変ですが無事通りました。
次は構造体のテスト。こいつは、また厄介で、構造体内の構造体とか、構造体内の配列とか、構造体のポインタとか嫌な感じです。こいつもなんとかクリアしました。
次は、typedefのテスト。型に名前を付けて扱うってだけなんですけど、他にもアロー演算子とかポインタ使ったり、色々あって、今はここをやってます。

テストは22個のソースがあり、2/22と10%くらい終わったのかな?ってところで、まだまだ先は長い気もしますが、longが通れば、intもbyteも通るはずで、今は基本的作りを作っている段階でもあり苦しい所だと思うので、ある時点からはザザーっと一気に進んでくれる事を期待しております。

このテストが通ったら、次はOpenGLのプログラムが動くようにします。テストも増やすといいはずです。
そのあと、リファクタリングしたりすれば、ひとまずの完成ですが、パターンマッチを入れるとかした後、コンパイラが作れるようになると嬉しいので、多分、コンパイラを作れるようにして行くのかなと思います。メモリ管理を考えないと行けなくて、RustとかObjective-CとかC++/CX等を参考に考えてみようと思っています。

出来れば、オブジェクト指向を使わずに、リファレンスカウンタを持ったメモリ管理をしたい。
多相性とか、Haskellのクラスとか、モナドとかなんかそこらへんを使ってどうにか出来ないかと考えてます。