2009-01-01から1ヶ月間の記事一覧

Scheme Compiler の勉強(40) - proper tail call

Tail call を以下のように実装中。あちこち理解が怪しいので注意。このテストが通れば tail call optimization は大丈夫、という例が欲しい。 まず現状の整理。手続き呼び出しは、今のところどんくさいが closure に対する funcall と llvm の関数を直接呼ぶ…

Clojure ML より

http://groups.google.com/group/clojure/browse_thread/thread/26c663af1cc64412 Clojure for Games/Simluation/Art (Optimization in Clojure) Clojure とパフォーマンス、Flock とか Processing の話。実に楽しげで、ちゃんと追いたいなぁ。時間が欲しい…

メモ

http://foldoc.org/ FOLDOC - Free On-Line Dictionary of Computing

LLVM tailcallopt について

Ghuloum さんの "An Incremental Approach to Compiler Construction", 3.10 Proper Tail Calls の実装のための準備。以下、嘘が含まれている可能性大ですのでご注意。まず LLVM は http://www.llvm.org/docs/CodeGenerator.html#tailcallopt にあるように、…

Gauche デバッグメモ

以下、3点セットで使う。 リーダーマクロ #?= (debug-print-width #f) ;; これを忘れると情報が一部しかでない。http://practical-scheme.net/gauche/man/gauche-refj_61.html#SEC166 write-object http://practical-scheme.net/gauche/man/gauche-refj_57.h…

メモ

地味なテストを追加中。 クロージャの別の例。普通に動く。嬉しい。 (run-program '(let ((make-adder (lambda (n) (lambda (x) (+ n x))))) (let ((add1 (funcall make-adder 1)) (add5 (funcall make-adder 5))) (- (funcall add1 3) (funcall add5 2)))))…

集合としてのリスト

(間違えて自分で自分に付けてしまったスターがどうしても取れない。仕方ないので削除して再度添付)自由変数を探す find-free-variables を実装中。リストで処理してもいいけど、ぐちゃぐちゃになるので srfi-1 の lset-union を使ってみた。Gauche はドキュ…

closure conversion

テンプレートのなかにリストを展開するような簡単なS式操作は分かっているつもりだけど、Closure Conversion みたいな式の形がだいぶ変わるような変換は初めてだ。再帰的な処理の固まりで難しい。しかしなんとかどんくさいコードながら実装。このエレガント…

Scheme の自由変数

http://d.hatena.ne.jp/cranebird/20081221/1229816029 で shiro さんに頂いたコメント。 1) 「この範囲には絶対に自由変数はないよ」とするととても大変なような。構文識別子は許すとしても、consもcarもcdrも使えなくなります。2) (lambda (x) (lambda (y)…

追記

opt runtime.bc -std-compile-opts runtime.opt.bc として LLVM の opt コマンドでランタイムを最適化したところ、全体で20秒くらい短縮できた。これは嬉しい。runtime.bc 7412 バイト, runtime.opt.bc 2168 バイト。ついでに lli で実行する際、 -force-i…

Scheme Compiler の勉強(39) - コンパイル速度の向上

自作 Scheme コンパイラもどきの続き。一つめ。今まで labels だけ特別に扱ってたので、let の中に labels がある場合にコンパイルできなかった。だいぶ構成をいじって、コンパイルできるように修正。二つめ。現在 (test-all) としてユニットテストを走らせ…

独白

何かを発信し続けるのは本当に難しい。ろくでもない駄文は反省を込めて削除。何とか前を向こう。

Scheme Compiler の勉強(38) - closure impl

ようやくクロージャを実装できた(はず)。ただし lambda を code/closure に変換する部分は未だ。やたら時間が掛かったのは、3.9 Closures で1/2ページくらいでさらりと書いてある内容を咀嚼してしかも全く分かっていない LLVM に変換するのに難儀したため…

tagged pointer など

vector 周りのバグを修正。tagged pointer を理解したと思っていたのに実装するときには間違っていた、というか忘れていた。しかも、 vector-ref と vector-set! の両方で間違えていたので何とか動いてしまっていて、気付くのが遅れた。恥ずかしい。改めて頭…

メモ

まずは自由変数を無視して、とりあえず closure を実装しよう。やっと少し手が動かせた。 関数のラベルを値に変換して vector のようにヒープに保存。ポインタにはタグを足しておく。 呼び出すときはポインタからタグを引いてそのポインタの示す値をロードし…

Scheme Compiler の勉強(37) - printer

ちょっと脱線して、scheme のオブジェクトを出力する機能をコンパイラに組み込む。じかに LLVM で書くのではなくて、Scheme で書いてコンパイルした結果を runtime に組み込むことにした。 リストの外部表現にはドット対(dotted notation)の他、 list notati…

メモ

クロージャーの前に、今までは C で印字していたけどちゃんとした printer を作っておこう、としたらいろいろとプログラムの粗が出てきた。うーん。 printf を直接呼び出すように declare しようとしたら、call インストラクションの呼び出しの整備、などな…

組み立て家具のためのライフハック

おおみそかにニトリとIKEAの組み立て家具を作るハメになった場合、ニトリ-IKEA の順で行うのがよい。親切な説明書付きのニトリの家具で経験値を上げるのだ。わたしの場合二つ目と三つ目のニトリの組み立て家具(CDラック)を全力で組み立てたあと、四つ目の IK…