高速な Scheme 処理系として知られる Chez Scheme の実行速度の源泉はネイティブコンパイラであることとコンパイル速度自体も速くなるように工夫が凝らされていることによる。 対話的にすぐさま実行することも多いからなのかアセンブリ言語で出力してからアセンブルするような悠長なことはしておらず、逆アセンブルする機能も用意されていないのでどのようにコンパイルされたのか調べにくい。
そう思っていたのだがアセンブリ言語形式での出力を見れる方法の紹介をしているブログ記事を書いている方がいてありがたく読ませてもらった。 要するにパラメタ #%$assembly-output に #t または出力ポートを設定するとコンパイル時にアセンブリ言語形式でも出力するという仕組みがあるということのようだ。
しかし紹介された方法はファイル単位なので開発中に対話的に気軽に結果を見ることが出来ない。 少しアレンジして式を与えられるように変更してライブラリにまとめてみた。
#!r6rs
(library (assembly)
(export compile-to-assembly)
(import (rnrs control)
(rnrs base)
(only (chezscheme)
parameterize
interaction-environment
compile
$primitive))
(define compile-to-assembly
(case-lambda
((obj env)
(parameterize ((($primitive $assembly-output) #t))
(compile obj env)))
((obj)
(compile-to-assembly obj (interaction-environment))))))
これを適当にライブラリ用のパスに置いておけば
(import (assembly)) (compile-to-assembly '(+ 1 2))
のように式を与えるだけでそのコンパイル結果を見せてくれる。 便利!
Document ID: 30ad3a3a1d2c7c63102e09e6fe4bb253