scheme
./mosh -t で実行されるテスト実行過程と結果表示を変更。 "\r" を利用してテスト数がカウントアップされる。(CPAN のテストみたいに) Running 752/765 (13 ToDo) ... passed ToDo 記法も用意。エラーにしたくはないが、将来必ず通すべきテストである事を明…
libgmp をリンクしようとして以下のエラーが出たら。 ld: warning in /usr/local/lib/libgmp.dylib, file is not of required architecture Undefined symbols: "___gmpz_init", referenced from: _main in cce3wyEi.o ld: symbol(s) not found collect2: ld…
mpq_set_si の3つめの引数は unsigned 。はまった。
Flonum は double で表現することに。Bignum は mpz_t 。異なる型同士の演算は似たような関数が多くなる。プリプロセッサマクロで楽をした。多少読みづらくはなるが、ミスの可能性が局所化されるので利用する。加減乗除と比較と write を実装。細かい手続や …
まずは仕様の概要をつかむ。 Numeric Tower number(数) complex (複素数) real (実数) flonum rational (有理数) integer (整数) fixnum bignum 正の無限大,負の無限大,非数(NaN) 0.0と-0.0 exact/inexact 演算 例えば GNU MP を使うとして、使える範囲は …
http://www.citeulike.org/tag/scheme で面白そうな論文を見つけて読もうと思ったら。有料だったorz...。
R6RS ライブラリの serialize/load を実装中。フレームワークは psyntax 側に用意されているのであれこれと読み漁る。 やっと動いたよ。これにより psyntax のS式変換フェーズをばっさり省略できるのでやっぱり速い。 いくつか考えるべき事があるのでメモ。 …
SICP を読みながら Scheme インタプリタを書いていた頃。quote の仕様と実装方法が分からなくて困ったことがあった。そのときなぜ分からなかったか?というのが今になって思い出したので書いておく。 理由はデータとコードとS式の関係がもやもやとして分かっ…
先日メールでお問い合わせ頂いたり、id:tazant さんにも触ってもらっているようなので、Mosh trunk のコンパイル方法を書いておきます。Makefile.am の # when you release comment out start という行から # when you release comment out end までをコメン…
equal? は速くないのであまり使わないように。assq で良いところを無駄に assoc を使っているところがあり遅かった。
Faslでコードの埋め込みをやるならば、更に進めて VM の初期状態を埋め込むと起動がめっさ速くなるんじゃなかろうか。 レジスタ スタック 名前空間のハッシュテーブル くらいを埋め込めば良い気がするね。(細かな問題はあるでしょうが)
スタックトレース中に assert で死ぬバグ Mosh のデフォルトの起動モードを R6RS モードに変更(以前は R5RS 相当がデフォルトだった) -b オプションは廃止。 これは感慨深い。 やっとまともな速度で動くようになった。 ファイルオープン時のエラーを error…
結論としては末尾呼び出しの最適化は以前からうまくいっていた。 ただスタックの自動伸長の実装がなかったので初期化時にスタックサイズが決められていて、その大きめのアロケーションのせいで起動が遅かった。 作業 stack自動伸長を実装する。 vm.scm で実…
input 末尾かどうか? 末尾までに消費したスタック output FRAME の削除 SHIFT の挿入 準備 vm/compiler をいじれるように用意する(rev 560) コンパイル結果を見せる 必ず記録を残す(こまめにコミット) 分からない動作 列挙 pass3/$local-assign val は ta…
いまさら末尾呼び出し最適化を見直しているのですが Gauche で以下のコードがスタックオーバーフローにならない理由が分からなくて混乱。 (define (my-map1 f l) (if (null? l) l (cons (f (car l)) (my-map1 f (cdr l))))) (my-map1 (lambda (x) x) (vector…
プリコンパイルして Mosh バイナリに埋め込まれる コンパイラ パターンマッチライブラリ psyntax を全て Fasl で読み込むようにした。 g++ でのコンパイル速度、Mosh 起動時のライブラリ読み込みともに速くなり幸せ。前者は予想していたが後者は予想外のうれ…
はまったのでメモ。 #\null と #\nul |...| と ... :hoge Gauche ではキーワード。Moshでは識別子 (import (srfi :1)) 的なときに注意。
Mosh にたくさんバグが見つかった。がんがん修正中。 バグその1 現象:GC の malloc に対して巨大なブロック割当を要求し warning 発生。 原因:unbound variable 例外の発生時に例外内容を表示しようとしたら更に例外発生。(ダブルフォルト的) こういうの…
とても長い vector の read が遅い。プロファイラで見たら yyparse の中で遅い。うわ。これは調べるの難しそうだ。 試しに gdb で実行して適当に SIG_INT で止めてみたら。getLastPair() だった。リストを読み出すときに append を使っているのが原因。 appe…
Fasl の reader/writer を実装した。これからテスト。
Scheme で書かれたコンパイル済みのコンパイラを C++ に埋め込む形で Mosh は書かれている。しかしながら2つほど問題がある。 g++ でビルドするときに遅い(環境によってはコンパイルが終わらない) コードを取得するときに重い 静的に決まらない部分の初期…
unbound variable のエラーがうまくハンドル出来ていなかった。
Record の eqv に実装漏れがあったので修正。
REPL で出る unbound variable の識別子が G24 のように gensym 由来の変数。ユーザーにはさっぱり理解できない。psyntax 側で何か仕組みを用意しているに違いない。 しかし見つからない。困った。と思ったら分かった。psyntax は gensym に識別子を渡してシ…
re2c は入力をバッファリングするので (eval (read) ...) 的な事が構造上難しい。 そこで苦肉の策として get-line を使用し (eval (call-with-port (open-string-input-port (get-line (current-input-port))) read) (environment '(rnrs))) のように REPL …
utf16->string なども実装が終わり、Bytevector の実装はほぼ完了。今回のリリースでは Bignum を含む Numeric Tower は実装しないので一部実装不可能なものがあるので「ほぼ」。残すは REPL psyntax.cpp などのプリコンパイル速度向上
id:fujita-y さんの Ypsilon の実装話を聞いて 論文読まねば CPU周りの基礎知識が足りない と強く感じた。前者はどうやったらそういう習慣がつくのかなあ。 後者はぱただかへねだかをもう一回読む。 懇親会でまた聞きしたのですが、Ypsilon のコンパイル済み…
Shibuya.lisp Tech Talk #1 無事終了しました。 スピーカーの皆さん、観客の皆さん、スタッフの皆さん、開催にたずさわった全ての皆さん本当にありがとうございました。 第1回という事で探り探りの開催でしたが、無事盛況のうちに終了しました。たくさんの出…
R6RS の Codec と Transcoder を Scheme 側で実装するかで激しく悩む。 C++ 側から多少のサポートがあれば実装出来ると思う。問題はパフォーマンスかな。 Scheme で実装してみるか。 ああ。いやでも C++ 側に実装しないと既存のポート周りの実装をごっそり直…
2.4 は後回し。 2.5 Operations on 16-bit integers エンディアンを考える必要。要は多バイトで構成されるデータを、どのようにバイト列に格納し取り出すかという話。 #vu8(#xff 0) をリトルエンディアンで取り出したら #x00ff で、ビックエンディアンなら #…