答案 0 :(得分:14)
你可以使用解释器将一大块Ruby代码编译成字节码(当然,只有Ruby MRI 1.9可以工作,因为它是唯一使用YARV虚拟机的实现),并得到它的Ruby-是的代表:
ruby-1.9.2-p180 :007 > require 'pp'
=> true
ruby-1.9.2-p180 :008 > pp RubyVM::InstructionSequence.compile('puts "hello world"').to_a
["YARVInstructionSequence/SimpleDataFormat",
1,
2,
1,
{:arg_size=>0, :local_size=>1, :stack_max=>2},
"<compiled>",
"<compiled>",
nil,
1,
:top,
[],
0,
[],
[1,
[:trace, 1],
[:putnil],
[:putstring, "hello world"],
[:send, :puts, 1, nil, 8, 0],
[:leave]]]
这正是HotRuby所做的:它使用MRI作为解析器和AST-to-YARV转换器,然后只用JavaScript执行代码。
您可以使用RubyVM::InstructionSequence.disasm
方法获取现有方法的字节码。它期望Proc
作为参数,因此首先使用object.method(:name).to_proc
将您的方法转换为块。
我不太确定'验尸'是什么意思。在异常处理程序中? Ruby与SEGV发生冲突后?后者几乎不可能,因为解密器无法成功运行任何Ruby代码。你需要为此做一个C扩展,并做很多肮脏的黑客攻击。在异常处理程序中使用此技巧是完全可能的,通过。
答案 1 :(得分:2)
据我了解,RubyVM::InstructionSequence.compile
就是您所需要的。
答案 2 :(得分:0)
要获得更具可读性的输出,可以在NSImageView
之后使用disasm
compile