我一直在阅读有关的新的Ruby 2.0的功能 ,并发现它会支持字节码导入/导出:
红宝石2.0有望使简单的预编译Ruby脚本保存成字节码的表示,并然后直接运行这些。
我已经安装了Ruby-2.0.0-P0,但我没有找到如何导出字节码(或一般就此事的文件)的任何信息。 难道这个功能已经实现,如果是这样,我怎么使用它?
我也想知道的一些细节。 是YARV字节码应该是独立于平台的? 是否所有的宝石自动包含在字节码?
我一直在阅读有关的新的Ruby 2.0的功能 ,并发现它会支持字节码导入/导出:
红宝石2.0有望使简单的预编译Ruby脚本保存成字节码的表示,并然后直接运行这些。
我已经安装了Ruby-2.0.0-P0,但我没有找到如何导出字节码(或一般就此事的文件)的任何信息。 难道这个功能已经实现,如果是这样,我怎么使用它?
我也想知道的一些细节。 是YARV字节码应该是独立于平台的? 是否所有的宝石自动包含在字节码?
直到有人提供更好的信息看这个问题,我做了一些研究:
难道这个功能已经实现,如果是这样,我怎么使用它?
它的实现,但它似乎并没有被暴露(如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
可执行文件,此行为将保持不变。
如果任何人有更多的信息,我很想看看吧!
不幸的是,它看起来像验证没有得到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); */