Ruby 2.0字节码导出/导入

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

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

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

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

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

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

它已实现,但似乎没有暴露(例如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}, "
", "./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}, "", ....

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

 File.write("out.dump", Marshal.dump(seq.to_a)) 

然后再次加载:

 arr = Marshal.load(File.read("out.dump")) 

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

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

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

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

不幸的是,看起来validation器没有在2.0-p0中实现,因此加载function仍然被注释掉(来自iseq.c,第2260行):

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