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));とか書く…

コード行数が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がレジスタ未割り…

2番地コードに変更

x86のアセンブリは基本的に2番地コードなのに、何故か3番地コードにしてた。 今は最適化とかやらないので、実装の容易さを優先して2番地コードに変更した。

レジスタ割り当て実装

3番地コードに対してレジスタ割り当てを実装した。 干渉グラフに基づくグラフカラーリングによる実装にした。カラーリングの最適化は殆どやっていない。干渉レジスタの多いところから優先的に割り当てるという程度。これで実行可能なコードを生成できるとこ…

READMEとかChangeLogとか書いた

それだけ。何気に今まで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などはコンパイラをその言語自身…

dlopen()の仕組み

rowl内でdlopen()相当の事を行う必要が出てきた。選択肢は2通り FFIを実装してglibcのdlopen()を呼ぶ。 dlopen()の仕組みを調べて,自分で書く FFIはいずれ実装しなきゃならないんだけど、ブートストラップで作るという目的上rowl自身の実装は後者で行きたい…

型推論の実装

現在Hindley-Milnerの型システムを実装している。 でも、rowl0の貧弱な機能だとなかなか実装が大変。変数がすべてx0,x1,...,p0,p1,...なのが一番つらい。 最低限の実装でさっさとrowl1を完成させたほうが良いかも。

rowl0: コード生成の実装

通常のコンパイラは大体こんな感じになっているが、 パース(構文木生成) → 型チェック等 → 中間言語化 → 最適化 → 低レベル中間言語化 → スケジューリング&レジスタ割り当て → コード生成rowl0はアセンブリ実装の為、簡略化して パース(コード生成)となって…

rowlのコメント構文

コメント構文を # ...から (% ... %)というものに変更した。一行コメントはないが入れ子可にすればあまり困らないはず。OCamlと同じく。実を言うと、rowlのコメントは将来的に文字列リテラルになる予定である。 つまり x = (% foo bar baz %)とか書けて、こ…

vimのsyntax・indentファイル追加

現状アセンブリでのrowl0実装は終了して、rowlでrowl自身のコンパイラを作る段階に入っている。 今日はautoindentがないのがつらいのでvim用のindent定義ファイルとついでにsyntax定義ファイルを作った。 またヒープメモリを叩く関数も作った。これによってv…

rowl0:字句解析の実装

字句解析には状態遷移表に基づく方法(lexはこれ)と状態遷移図に基づく方法があります。 rowl0は後者を手作業で実装しました。1. トークンの定義 (token.s) 解析対象のトークンにIDを振ります。単一文字のトークンはそのascii番号をトークンIDとします。 した…

名前変更しました

"growl"という名前で言語作り始めましたが、Mac OS Xのアプリに同名の物があったのでいろいろ考えた末gを取って"rowl"に変えました。

rowl0 実装完了

ブートストラッピングの第1段階rowl0の実装が終わりました。 rowlのサブセット言語 GNU assemblerで書いてある こんな感じでrowlコードをアセンブリ言語にコンパイルできます。 % cat hoge.rl fib: (p0) { if (p0 hoge.rl > hoge.as % as hoge.as -o hoge.o…