10

我一直在阅读ruby​​ 2.0 的新特性,发现它将支持字节码导入/导出:

Ruby 2.0 有望简化将预编译的 Ruby 脚本保存为字节码表示,然后直接运行这些脚本。

我已经安装了 ruby​​-2.0.0-p0,但是我没有找到任何关于如何导出字节码的信息(或者关于这个问题的一般文档)。此功能是否已经实现,如果是,我该如何使用它?

我也想知道一些细节。YARV 字节码是否应该与平台无关?是否所有 gem 都自动包含在字节码中?

4

2 回答 2

5

在有更好信息的人看到这个问题之前,我做了一些研究:

此功能是否已经实现,如果是,我该如何使用它?

它已实现,但似乎没有暴露(例如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可执行文件直接提供的,那么这种行为将保持不变。

如果其他人有更多信息,我很乐意看到它!

于 2013-01-23T14:03:20.097 回答
4

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); */
于 2013-03-18T22:06:20.360 回答