在有更好信息的人看到这个问题之前,我做了一些研究:
此功能是否已实现?如果已实现,我该如何使用它?
它已实现,但似乎没有公开(例如ruby --dump-bytecode
不存在)。而且也没有太多文档 http://www.ruby-doc.org/core-2.0/RubyVM/InstructionSequence.html。据我所知,您正在寻找的是这样的:
seq = RubyVM::InstructionSequence.compile_file("./example.rb")
seq.disassemble
将为您提供一个格式良好的字符串,您可以将其转储到文件中,或者seq.to_a
将生成一个如下所示的数组:
["YARVInstructionSequence/SimpleDataFormat",
2,
0,
1,
{:arg_size=>0, :local_size=>1, :stack_max=>2},
"<main>",
"./example.rb",
"./example.rb",
1,
:top,
[],
0,
[],
[[:trace, 1],
[:putspecialobject, 3],
[:putnil],
[:defineclass,
:User,
["YARVInstructionSequence/SimpleDataFormat",
2,
0,
1,
{:arg_size=>0, :local_size=>1, :stack_max=>6},
"<class:User>",
....
如果您想将其保存到文件中,您可以执行以下操作:
File.write("out.dump", Marshal.dump(seq.to_a))
然后再次加载:
arr = Marshal.load(File.read("out.dump"))
不幸的是我似乎不知道如何创建一个新的InstructionSequence
给定上面加载的数组。
我也想知道一些细节。 YARV 字节码应该是平台无关的吗?所有的 gem 都会自动包含在字节码中吗?
在上面的示例中,不包括宝石。你的InstructionSequence
将包括相当于a的字节码require 'active_record'
或者你有什么。我怀疑如果字节码的转储和加载是由直接提供的ruby
可执行文件,此行为将保持不变。
如果其他人有更多信息,我很乐意看到!