Let's start Scheme

2011-06-12

マルチスレッド

とりあえずなんとなく形になってきた。
Windowsでも動くようにしたら後はバグ取りなんだろうけど、どこにバグがあるのかさっぱり分からない。マルチスレッドは難しいなぁ。正直、デッドロックが発生した際にそれがC側なのかScheme側なのか判別が難しい。今になって必要だったかなぁ?と少し疑問も。。。

それはさておき、現状で少し(大分?)問題が露呈してきた。
まず、遅い!!
通常の状態ならそこまで遅くないのだが、(rnrs)ライブラリのimportが遅い。理由は分かっていて、(rnrs)ライブラリをimportすると40近いファイルをロード&コンパイルする。これはそもそもr6rsのスタンダードライブラリが20以上に分かれていて、Sagittariusの実装ではそれぞれがファイルになっている。っで、さらにその中に実装の記述が入っていて、初回ロードでコンパイルと実行がなされるので遅い。
この辺、MoshとYpsilonでは(rnrs)ライブラリを組み込みにしていて、少なくともコンパイルの処理がカットされているのでそこまでの負荷にはなっていない。加えて、Sagittariusではsyntax-rulesが重たい処理なのでR6RSが要求するcase-lambdaなどsyntax-rulesで記述されているマクロのコンパイル及び、展開が非常に重い。これはsyntax-rulesをsyntax-caseで書けば早くなるのだが、何故かexportが上手くいっていないのでとりあえず保留にしてある。
次いで、エラー処理。
with-exception-handlerやguardマクロを使って何かを記述した際に、C側(VM含む)で何らかの例外を投げると、例外処理がされずに終了することがある。これも理由は分かっていて、Schemeで記述されたassertion-violationをC側で呼び出さないと落ちる。理由は分かっているのだが、最終的に同じ関数を呼び出すのになぜこれが起きるのかいまいち理解してない。とりあえず、VMと、CとSchemeを繋ぐ部分のエラー処理でassertion-violationを使用することで回避。
まだいくつかあるけど、大きなのでREPLがない。
REPLを実装すること自体はそんなに難しくないんだけど(履歴なし、変な入力を受け付けないものならSchemeで実装されたものがあったりする)、そのままでは使い辛すぎてもう少し何とかしないと、と思いつつ他の方にいってて進まない。どうしようかな。

落ちはない。

No comments:

Post a Comment