6

虽然Ruby 1.9 正在编译为 bytecode,但它无法将预编译的脚本保存到磁盘。

我们被告知期望Ruby 2 允许将编译后的字节码保存到磁盘,但我没有听到太多关于这个的讨论,也没有看到大量描述如何通过编译获得性能的博客文章,我希望看到它是否在事实上在 Ruby 2.x 的某个地方实现。

专注的谷歌搜索似乎没有返回任何有用的东西。

2.1(或更早版本)有可能吗?如果没有,这是否仍在路线图上?

4

2 回答 2

5

这是一半可能的。

  • 从这里下载扩展并编译它。
  • 需要库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 不兼容)。但是对于稍微复杂的项目,它不起作用(分段错误)。

于 2014-06-14T01:59:50.173 回答
3

通过阅读 ruby​​-core (我是提交者),我还没有看到任何这方面的工作。在 ruby​​ 中编译为字节码不需要很长时间。与大多数 ruby​​ 程序的运行时相比,将编译后的字节码保存到磁盘还没有意义。

于 2014-04-23T20:39:41.433 回答