Компиляция Ruby 2.1 в байт-код

пока Ruby 1.9 компилировался в байт-код, не удалось сохранить предварительно скомпилированный скрипт на диск.

нам сказали ожидать Ruby 2, чтобы сохранить скомпилированный байт-код на диск, но я не слышал много разговоров об этом, или видел bazillions сообщений в блоге, описывающих, как получить производительность через компиляцию, которую я ожидал бы увидеть, если бы она была фактически реализована где-то в Ruby 2.х.

A сфокусированный поиск Google похоже, ничего полезного не возвращает.

возможно ли это в 2.1 (или ранее)? Если нет, это все еще в планах?

2 ответов


Я не видел никакой работы в этом направлении от чтения ruby-core (я коммиттер). Компиляция байт-кода в ruby не занимает много времени. По сравнению со временем выполнения большинства программ ruby пока не имеет смысла сохранять скомпилированный байт-код на диск.


это наполовину возможно.

  • загрузить расширение из здесь и скомпилировать его.
  • требуется lib 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

Примечание

для простых проектов это работает по тому же Руби interpreeter (1.9.3 и 2.X. X несовместимы). Но чуть сложнее проект не работает (ошибка сегментации).