rowl
難航している。でも、型安全なhashtableなどを実装する時には多相関数があった方が良いと思う。 実装方法はtemplate instansiationとdictionary passingの混合。メンドくさいけど、非ボックス化型を扱うrowlでは仕方がない。
こんな感じのサンプルコードがコンパイル出来るようになった。dictionary passingへの布石。 plus: (a, b) { return a + b; }; f: () { return plus; }; export main: () { g : f(); syscall(1, g(1, 2)); };ちゃんと型安全です。 syscall(1, g(1));とか書く…
アセンブリ実装のrowl0 rowl0実装のrowl1 あわせて1万行超えた。そろそろrowl0での開発が破綻してきた。変数名・パラメータ名・タプルインデックスなどマジックナンバーだらけ当たり前といえば当たり前。 rowl1では名前管理ができるようになっているんで、早…
タプルを関数の戻り値にすることができるようにした。パターンマッチで値が取り出せる為、下のように多値返却として利用することもできる。 return_tuple: () { return (1, 2) }; export main: () { (a, b) : return_tuple(); syscall(a, b); }下のようなコ…
ローカルタプル rowlのタプルは非ボックス化型とした。 こんな感じで書くと、レジスタもしくはスタック上にタプルが構築される。 x : (1, (2, 3));ボックス化したいときはC++のnewのように明示的に書くことにする(syntaxなど考え中)。 パターンマッチング タ…
何をやってるかわかりやすくした。
rowl1で plus: (x,y) { return x+y; };をコンパイルすると、中間コードが _plus.ii2TiL: pushl %ebp movl %esp, %ebp movl 12(%ebp), %p9 movl 8(%ebp), %p8 movl %p8, %p10 addl %p9, %p10 movl %p10, %eax leave retになる。%p8,%p9,%p10がレジスタ未割り…
x86のアセンブリは基本的に2番地コードなのに、何故か3番地コードにしてた。 今は最適化とかやらないので、実装の容易さを優先して2番地コードに変更した。
3番地コードに対してレジスタ割り当てを実装した。 干渉グラフに基づくグラフカラーリングによる実装にした。カラーリングの最適化は殆どやっていない。干渉レジスタの多いところから優先的に割り当てるという程度。これで実行可能なコードを生成できるとこ…
それだけ。何気に今までREADMEを書いたことがなかった。ChangeLogもちゃんと書いたことなかった。 今はかなり雑だけど、徐々に体裁を整えていこう。
とりあえず、rlc1では三番地コードを中間コードにすることにした。教科書通り。 バックエンドは簡易レジスタ割り当てのみ実装。スケジューリングはしない。
rowlはC言語風の構文にしたいと思っている。例えば if (...) { ... };の様にelse節を持たないif文を定義することもできるようにしたい。また値もreturnを使って返すようにしたい。 この場合、例えば f: (a,b,c) { if (a > 0) { return b; }; return c; };み…
GCを搭載したモダンな言語にしたい という事は当初から考えていた訳だけれども、ブートストラップでこれを実現するのは難しい。 高級すぎる言語ではGCなどの低レイヤーの処理を実装できないから。 例えばO'Caml、GHC、erlangなどはコンパイラをその言語自身…
rowl内でdlopen()相当の事を行う必要が出てきた。選択肢は2通り FFIを実装してglibcのdlopen()を呼ぶ。 dlopen()の仕組みを調べて,自分で書く FFIはいずれ実装しなきゃならないんだけど、ブートストラップで作るという目的上rowl自身の実装は後者で行きたい…
現在Hindley-Milnerの型システムを実装している。 でも、rowl0の貧弱な機能だとなかなか実装が大変。変数がすべてx0,x1,...,p0,p1,...なのが一番つらい。 最低限の実装でさっさとrowl1を完成させたほうが良いかも。
通常のコンパイラは大体こんな感じになっているが、 パース(構文木生成) → 型チェック等 → 中間言語化 → 最適化 → 低レベル中間言語化 → スケジューリング&レジスタ割り当て → コード生成rowl0はアセンブリ実装の為、簡略化して パース(コード生成)となって…
コメント構文を # ...から (% ... %)というものに変更した。一行コメントはないが入れ子可にすればあまり困らないはず。OCamlと同じく。実を言うと、rowlのコメントは将来的に文字列リテラルになる予定である。 つまり x = (% foo bar baz %)とか書けて、こ…
現状アセンブリでのrowl0実装は終了して、rowlでrowl自身のコンパイラを作る段階に入っている。 今日はautoindentがないのがつらいのでvim用のindent定義ファイルとついでにsyntax定義ファイルを作った。 またヒープメモリを叩く関数も作った。これによってv…
字句解析には状態遷移表に基づく方法(lexはこれ)と状態遷移図に基づく方法があります。 rowl0は後者を手作業で実装しました。1. トークンの定義 (token.s) 解析対象のトークンにIDを振ります。単一文字のトークンはそのascii番号をトークンIDとします。 した…
"growl"という名前で言語作り始めましたが、Mac OS Xのアプリに同名の物があったのでいろいろ考えた末gを取って"rowl"に変えました。
ブートストラッピングの第1段階rowl0の実装が終わりました。 rowlのサブセット言語 GNU assemblerで書いてある こんな感じでrowlコードをアセンブリ言語にコンパイルできます。 % cat hoge.rl fib: (p0) { if (p0 hoge.rl > hoge.as % as hoge.as -o hoge.o…