一山超えた

とりあえず、出来たけど、デカいしソースはまだ汚いのでソースは公開しない方向で。
PL/0やPascalやOberonのソースを読んだりしてて、Oberonでの解説があるんですけど、
英語なのと、参照使いまくってるので、ソースの理解がまだ出来てないとかあって、
もっと、うまくやる方法があるのかも、、、ってことで、調べている所です。
アドレス計算のやり方の論文も参考にしないと行けない気がするし。

ポインタやら、構造体やら、多次元配列が入り組んだデータを扱う、
一番苦しい所は理解したし、非常に簡潔に書けました。
細かい問題は残ってますけど。

内部コードをスタックマシンにした事で、レジスタアロケーションとか余計な事を考えなくてよくなって、
もっとも本質的な所がわずかな数十行で見れるようになりました。
俺が苦しんでいたのが、たったコレだけでかけるのか、し、信じられない。だが事実だ!っていう。

でも、まだ納得いってないので、奇麗にまとめてから公開しようと思ってます。
作り方を書くのが時間かかるんです。理解が進むと、順番を変えたくなって、前の記事に反映させたくなり、
反映させるとなると、大幅に労力が食われる。
なので、おおざっぱに、書いて最後にきっちり書くのがいいのかなと思ってます。

1. void関数をつくれるようにする。
2. 値を返す関数をつくる。値はレジスタで返し、文の実行後、voidでないならpopして捨てる。
3. if文をつくる。

とりあえず、この3つを次にクリアにする。
実はスタックマシン用のコンパイラは本格的に作っていなかった事に気がついた今日この頃です。
なので、ちょっとメンドクサイです。
でも、ポインタやら構造体やらの入り組んだデータ弄るよりはずっと楽です。

関数呼び出しは、引数分だけ、popしてレジスタに突っ込んで、
関数を呼び出し、戻って来たら、voidでない場合は%raxをpushする。

64bitのコンパイラは64bitのみでつくるのがシンプルだ。
ってことに気がついてしまって、大幅に変更が必要になってしまった。

とにかく、一度、フルセットに近い実装を作って、そこから削る形で、説明しようかと思ってます。
あと、コンパイラの教科書も読んで参考にする。
関数型と命令型両方のコンパイラを参考にしつつ、より、単純で良い物をつくる。
そりゃ難しいよ。

で、出来たら、諸々のチェックを入れる。まだまだ先は長い。
そして、パターンマッチングを入れたり、最適化したり、先は長い。bitmapGCも入れたい。