Компиляция 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 несовместимы). Но чуть сложнее проект не работает (ошибка сегментации).