Ruby 2.0字节码导出/导入

luc*_*nte 10 ruby bytecode yarv ruby-2.0

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

Ruby 2.0有望简化将预编译的Ruby脚本保存到字节码表示中,然后直接运行它们.

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

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

Joh*_*ter 5

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

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

它已实现,但似乎没有暴露(例如ruby --dump-bytecode,不存在).还有很多文档.据我所知,你要找的是:

seq = RubyVM::InstructionSequence.compile_file("./example.rb")
Run Code Online (Sandbox Code Playgroud)

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>",
    ....
Run Code Online (Sandbox Code Playgroud)

如果要将其保留到文件中,可以执行以下操作:

File.write("out.dump", Marshal.dump(seq.to_a))
Run Code Online (Sandbox Code Playgroud)

然后再次加载:

arr = Marshal.load(File.read("out.dump"))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我似乎无法弄清楚如何创建一个新的InstructionSequence给定上面加载的数组.

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

在上面的示例中,不包括gem.你InstructionSequence会包含相当于a require 'active_record'或者你有什么的字节码.我怀疑如果直接由ruby可执行文件提供转储和加载字节码,这种行为将保持不变.

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