我一直在阅读ruby 2.0 的新特性,发现它将支持字节码导入/导出:
Ruby 2.0 有望简化将预编译的 Ruby 脚本保存为字节码表示,然后直接运行这些脚本。
我已经安装了 ruby-2.0.0-p0,但是我没有找到任何关于如何导出字节码的信息(或者关于这个问题的一般文档)。此功能是否已经实现,如果是,我该如何使用它?
我也想知道一些细节。YARV 字节码是否应该与平台无关?是否所有 gem 都自动包含在字节码中?
我一直在阅读ruby 2.0 的新特性,发现它将支持字节码导入/导出:
Ruby 2.0 有望简化将预编译的 Ruby 脚本保存为字节码表示,然后直接运行这些脚本。
我已经安装了 ruby-2.0.0-p0,但是我没有找到任何关于如何导出字节码的信息(或者关于这个问题的一般文档)。此功能是否已经实现,如果是,我该如何使用它?
我也想知道一些细节。YARV 字节码是否应该与平台无关?是否所有 gem 都自动包含在字节码中?
在有更好信息的人看到这个问题之前,我做了一些研究:
此功能是否已经实现,如果是,我该如何使用它?
它已实现,但似乎没有暴露(例如ruby --dump-bytecode
不存在)。也没有太多的文档。据我所知,您正在寻找的是:
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
将包括等效于 arequire 'active_record'
或您拥有的字节码。我怀疑如果字节码的转储和加载是由ruby
可执行文件直接提供的,那么这种行为将保持不变。
如果其他人有更多信息,我很乐意看到它!
Unfortunately it looks like the verifier didn't get implemented in 2.0-p0, and as a result the load functionality is still commented out (from iseq.c, line 2260):
/* disable this feature because there is no verifier. */
/* rb_define_singleton_method(rb_cISeq, "load", iseq_s_load, -1); */