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); */