配列を実装した
メモリマネージャがちゃんと動きました。GCも今のところ大丈夫っぽいです。
ということで、エラトステネスの篩を実装してみました。次期コンパイラ実装専用のDSLなので可読性が低いのは勘弁してください。
(fun main () ( (sieve 200000) (exit 0) )) (fun sieve (n) ( (var ary (array int n)) ; ヒープメモリ上に配列確保 (array_set int ary 0 0) (for i 1 n (array_set int ary i 1)) (for i 2 (/ n 2) (do (var j 2) (while (<= (* i j) n) (do (array_set int ary (- (* i j) 1) 0) (+= j 1) )) )) (for i 0 n (do (if (array_get int ary i) (do (puti (+ i 1)) (putc '\n') )) )) (return 0) ))
コンパイルしてrowlVM上で走らすと、200000要素で0.07秒くらいだったので最適化とかしていない状態にしてはまぁまぁ速いのかな。
(Core 2 Duo,Windows7上のVMPlayer内のDebian lennyで実行)
実は、メモリマネージャが1MBのブロック単位でメモリを扱っていて、まだそれ以上の連続したメモリ確保を実装していません。その為大体200000要素が限界となっているので、これ以上のサイズはまだテストが出来ないという状態です。