luc*_*nte 10 ruby bytecode yarv ruby-2.0
我一直在阅读有关新的ruby 2.0功能,并发现它将支持字节码导入/导出:
Ruby 2.0有望简化将预编译的Ruby脚本保存到字节码表示中,然后直接运行它们.
我已经安装了ruby-2.0.0-p0,但是我没有找到任何关于如何导出字节码的信息(或者通常是关于这个问题的文档).此功能是否已实施,如果已实施,我该如何使用它?
我也想知道一些细节.YARV字节码是否应该与平台无关?所有宝石都自动包含在字节码中吗?
在有更好信息的人看到这个问题之前,我做了一些研究:
此功能是否已实施,如果已实施,我该如何使用它?
它已实现,但似乎没有暴露(例如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可执行文件提供转储和加载字节码,这种行为将保持不变.
如果有其他人有更多的信息,我很乐意看到它!
| 归档时间: |
|
| 查看次数: |
2228 次 |
| 最近记录: |