ボトムアップ(2)

compile.scm を追いかける前の準備。shiro さんに教えてもらったVMへのフラグを使うと、最適化前の命令列が手に入る。これはとてもいい。

gosh> (vm-dump-code (compile-pass3 (compile-pass1 '(+ 1 2))))
main_code (name=%toplevel, code=0x5cd590, size=3, const=0, stack=0):
args: #f
     0 CONST 3
     2 RET 
#<undef>
gosh> (vm-compiler-flag-set! SCM_COMPILE_NOINLINE_LOCALS)
gosh> (vm-compiler-flag-set! SCM_COMPILE_NOINLINE_GLOBALS)
gosh> (vm-dump-code (compile-pass3 (compile-pass1 '(+ 1 2))))
main_code (name=%toplevel, code=0xb9578, size=10, const=1, stack=5):
args: #f
     0 CONST 1
     2 PUSH 
     3 CONST 2
     5 PUSH 
     6 GREF #<identifier gauche.internal#+>; +
     8 TAIL-CALL(2)             ; (+ 1 2)
     9 RET 
#<undef>

まだまだ知識が断片的だけど。

余談。検索すると Maeve の scinfaxi さんの日記が見つかった。3年前かぁ。

この shiro さんのコメントは記憶に残っているなぁ。この記事は一度以上読んでいて、しかし意味を理解できていなかったようだ。少し理解が追いついてきたか。