虽然Ruby 1.9 正在编译为 bytecode,但它无法将预编译的脚本保存到磁盘。
我们被告知期望Ruby 2 允许将编译后的字节码保存到磁盘,但我没有听到太多关于这个的讨论,也没有看到大量描述如何通过编译获得性能的博客文章,我希望看到它是否在事实上在 Ruby 2.x 的某个地方实现。
专注的谷歌搜索似乎没有返回任何有用的东西。
2.1(或更早版本)有可能吗?如果没有,这是否仍在路线图上?
虽然Ruby 1.9 正在编译为 bytecode,但它无法将预编译的脚本保存到磁盘。
我们被告知期望Ruby 2 允许将编译后的字节码保存到磁盘,但我没有听到太多关于这个的讨论,也没有看到大量描述如何通过编译获得性能的博客文章,我希望看到它是否在事实上在 Ruby 2.x 的某个地方实现。
专注的谷歌搜索似乎没有返回任何有用的东西。
2.1(或更早版本)有可能吗?如果没有,这是否仍在路线图上?
iseq.so
load
字节码方法可用require "zlib"
require "./ext/iseq" # ./ext/iseq.so
# ARGV[0] compile or load
# ARGV[1] file to compile or load
case ARGV[0]
when 'compile'
File.open("#{File.basename(ARGV[1],'.rb')}.bin",'w') do |f|
f << Zlib::Deflate.deflate(
Marshal.dump(
ISeq.compile_file( ARGV[1] ).to_a
)
)
end
when 'load'
( File.open( ARGV[1], 'r') do |f|
ISeq.load(
Marshal.restore(
Zlib::Inflate.inflate( f.read )
)
)
end ).eval
else
puts 'need options'
end
$ ruby compilator.rb compile my_project.rb # => compile to bytecode
$ ruby compilator.rb load my_project.bin # => load from bytecode and eval
对于最简单的项目,它适用于同一个 ruby 解释器(1.9.3 和 2.xx 不兼容)。但是对于稍微复杂的项目,它不起作用(分段错误)。
通过阅读 ruby-core (我是提交者),我还没有看到任何这方面的工作。在 ruby 中编译为字节码不需要很长时间。与大多数 ruby 程序的运行时相比,将编译后的字节码保存到磁盘还没有意义。