-->

红宝石2.0字节码导出/导入(Ruby 2.0 Bytecode Export / Import)

2019-08-07 07:16发布

我一直在阅读有关的新的Ruby 2.0的功能 ,并发现它会支持字节码导入/导出:

红宝石2.0有望使简单的预编译Ruby脚本保存成字节码的表示,并然后直接运行这些。

我已经安装了Ruby-2.0.0-P0,但我没有找到如何导出字节码(或一般就此事的文件)的任何信息。 难道这个功能已经实现,如果是这样,我怎么使用它?

我也想知道的一些细节。 是YARV字节码应该是独立于平台的? 是否所有的宝石自动包含在字节码?

Answer 1:

直到有人提供更好的信息看这个问题,我做了一些研究:

难道这个功能已经实现,如果是这样,我怎么使用它?

它的实现,但它似乎并没有被暴露(如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字节码应该是独立于平台的? 是否所有的宝石自动包含在字节码?

在上面的例子中,宝石不包括在内。 你InstructionSequence将包括字节码等同的require 'active_record'或者你有什么。 我怀疑,如果倾销和字节代码的加载被直接提供ruby可执行文件,此行为将保持不变。

如果任何人有更多的信息,我很想看看吧!



Answer 2:

不幸的是,它看起来像验证没有得到2.0-P0实现,其结果是负载的功能仍然是注释掉(从iseq.c,行2260):

/* disable this feature because there is no verifier. */
/* rb_define_singleton_method(rb_cISeq, "load", iseq_s_load, -1); */


文章来源: Ruby 2.0 Bytecode Export / Import