msumimz's diary

RubyにJITコンパイラを実装する個人プロジェクトの情報発信ブログです。

RubyでASTやIRを表示する

JITコンパイラを書くには、まずRubyの生成するASTを調べる必要があります。そのためのツールとして、以前に読んだ「Rubyソースコード完全解説」でnodedumpという外部ライブラリを使っていました。
じゃあそれを使おうと思ってググってみましたが、どうも最新バージョンには対応していないらしく、自分で作らないといけないかと思っていました。
が、実は最近のRubyには--dumpという隠しオプションがあり、ASTやIRを表示できるのでした。
例えば、ASTを表示させたいときは--dump=parsetreeを指定します。

[~/work/rbjit]$vc10/Debug/miniruby.exe --dump=parsetree -e "1 + 2"
###########################################################
## Do NOT use this node dump for any purpose other than  ##
## debug and research.  Compatibility is not guaranteed. ##
###########################################################

# @ NODE_SCOPE (line: 1)
# +- nd_tbl: (empty)
# +- nd_args:
# |   (null node)
# +- nd_body:
#     @ NODE_CALL (line: 1)
#     +- nd_mid: :+
#     +- nd_recv:
#     |   @ NODE_LIT (line: 1)
#     |   +- nd_lit: 1
#     +- nd_args:
#         @ NODE_ARRAY (line: 1)
#         +- nd_alen: 1
#         +- nd_head:
#         |   @ NODE_LIT (line: 1)
#         |   +- nd_lit: 2
#         +- nd_next:
#             (null node)

大きく警告が表示されますが、確かにASTが出力されています。
さらに、--dump=parsetree_with_commentを使うと、説明つきのASTが表示されるようです。
また、IRを表示するときは--dump=insnsです。

[~/work/rbjit]$vc10/Debug/miniruby.exe --dump=insns -e "1 + 2"
== disasm: @-e>======================
0000 trace            1                                               (   1)
0002 putobject_OP_INT2FIX_O_1_C_
0003 putobject        2
0005 opt_plus         
0007 leave

便利ですね!