Ruby-1.9.1を使ってRubyVMを身近に感じてみる
Ruby-1.9.1を使うと、
以下のようにして簡単にRubyVMのInstaractionSequenceを見る事が出来ます。
ruby>>
puts RubyVM::InstructionSequence.new("puts 'Hello, world!'").disasm #=> nil
== disasm: <RubyVM::InstructionSequence:@ >==========
0000 trace 1 ( 1)
0002 putnil
0003 putstring "Hello, world!"
0005 send :puts, 1, nil, 8,
0011 leave
<<--
生成したInstractionSequence(aka iseq)は、evalメソッドを呼び出して実行する事もできます。
ruby>>
RubyVM::InstructionSequence.new("puts 'Hello, world!'").eval #=> nil
Hello, world!
<<--
さらに、to_aメソッドで個々のインストラクションに分解する事も出来ます。
ruby>>
RubyVM::InstructionSequence.new("puts 'Hello, world!'").to_a
["YARVInstructionSequence/SimpleDataFormat", 1, 1, 1, {:arg_size=>0, :local_size=>1, :stack_max=>2}, "", " ", :top, [], 0, [], [1, [:trace, 1], [:putnil], [:putstring, "Hello, world!"], [:send, :puts, 1, nil, 8, nil], [:leave]]]
<<--