2015-10-17 18 views

回答

2

这将显示YARV指令

code = <<END 
x=1 
x.to_s 
puts x 
END 
puts RubyVM::InstructionSequence.compile(code).disasm 

如果您想了解更多,你可以看看这本书红宝石在显微镜下

这将是输出

1.9.3-p547 :012 > code = <<END 
1.9.3-p547 :013"> x=1 
1.9.3-p547 :014"> x.to_s 
1.9.3-p547 :015"> puts x 
1.9.3-p547 :016"> END 
=> "x=1\nx.to_s\nputs x\n" 
1.9.3-p547 :017 > puts RubyVM::InstructionSequence.compile(code).disasm 
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>========== 
local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s1) 
[ 2] x   
0000 trace   1            ( 1) 
0002 putobject  1 
0004 setlocal   x 
0006 trace   1            ( 2) 
0008 getlocal   x 
0010 send    :to_s, 0, nil, 0, <ic:0> 
0016 pop    
0017 trace   1            ( 3) 
0019 putself   
0020 getlocal   x 
0022 send    :puts, 1, nil, 8, <ic:1> 
0028 leave   
2

如果你使用了Rubinius你可以像这样运行它,并获得字节码:

$ rbx compile simple.rb -o simple.bytecode 

你可以看到一个全面的解释here和关于Rubinius的编译here的解释。

+0

即时通讯使用MRI,我想将MRI将我的示例代码转换为字节或直接解释它 –

+0

我不认为MRI正在编译为字节码。看到这个答案:http://stackoverflow.com/questions/717490/is-ruby-really-an-interpreted-language-if-all-of-its-implementations-are-compile – davidrac