Hatena::ブログ(Diary)

新言語 Xtalを作る日記

2006-10-03 末尾再帰

Xtalはある理由のため、末尾再帰、末尾関数呼び出しを必ず最適化し、その関数フレームを再利用します。

そのため次の例はスタックオーバーフローになったり、メモリを使い果たしたりすることなく、永遠に実行されます。

 f : fun(i){
   println(i);
   return f(i+1);
 }
 f(0);

ポータビリティについて 00:11  ポータビリティについてを含むブックマーク

Xtalは今のところwindowsでの動作しか確認していませんが、C++標準の関数以外は使用していないため、Linuxでも動作する(はずです)。

例えばfiberはその機能名から、Win32APIのFiberを使用しているのでは、と想像する人が多いかもしれませんが、使用してはいません。

fiberという名前を採用したのは、単にcoroutineよりタイプの少ない単語だからです。

パース 00:11  パースを含むブックマーク

XtalはLexerやParser部分にyacc等を使用しておらず、完全に手書き再帰下降型となっています。

当初はBoost.Spiritを使用していましたが、全構文の3分の1を入れた時点でコンパイル時間がめちゃくちゃ長いわ、メモリが足りないからコンパイルオプションで指定しろ言われるわ、とてもながーい何が原因かわからないコンパイルエラーが出るわで、なんか面倒になったので諦めて手書きすることにしました。

バイトコード採用 00:11  バイトコード採用を含むブックマーク

Xtalは独自のバイトコードを独自の仮想マシンが解釈して駆動します。XtalのバイトコードJavaバイトコードの仕様を参考にして作られました。

当初はバイト単位ではなく、マシンが一番早く計算できるword単位にしていました。何故変えたかというと、ある日試しにbyte単位のを試してみたところ、それほど処理速度が落ちなかったためです。

正確な記録は無いのですが10〜20%くらいの速度低下でした。2.0秒で動いていたのが2.2秒になった、とかそんな感じだったはずです。