Ruby 2.0 Байт-код Экспорт / Импорт

Я читал о новых возможностях ruby ​​2.0 и обнаружил, что он будет поддерживать импорт / экспорт байт-кода:

Ожидается, что Ruby 2.0 упростит сохранение предварительно скомпилированных сценариев Ruby в представления байт-кода и затем запустит их напрямую.

Я установил ruby-2.0.0-p0, но не нашел никакой информации о том, как экспортировать байт-код (или вообще документацию по этому вопросу). Эта функция уже реализована, и если да, то как ее использовать?

Мне также интересно узнать о некоторых деталях. Должен ли YARV-байт-код быть независимым от платформы? Все драгоценные камни автоматически включены в байт-код?

2 ответа

Пока кто-то с лучшей информацией взглянет на этот вопрос, я провел небольшое исследование:

Эта функция уже реализована, и если да, то как ее использовать?

Он реализован, но, кажется, не подвергается (например, ruby --dump-bytecode не существует) Также есть не очень много документации. Насколько я могу судить, вы ищете что-то вроде:

seq = RubyVM::InstructionSequence.compile_file("./example.rb")

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>",
    ....

Если вы хотите сохранить это в файле, вы можете сделать что-то вроде:

File.write("out.dump", Marshal.dump(seq.to_a))

А потом снова загрузить:

arr = Marshal.load(File.read("out.dump"))

К сожалению, я не могу понять, как создать новый InstructionSequence учитывая массив, загруженный выше.

Мне также интересно узнать о некоторых деталях. Должен ли YARV-байт-код быть независимым от платформы? Все драгоценные камни автоматически включены в байт-код?

В приведенном выше примере драгоценные камни не включены. Ваш InstructionSequence будет включать в себя байт-код, эквивалентный require 'active_record' или что у тебя. Я подозреваю, что если сброс и загрузка байт-кода были предоставлены непосредственно ruby исполняемый, это поведение останется прежним.

Если у кого-то еще есть информация, я бы с удовольствием ее увидел

К сожалению, похоже, что верификатор не был реализован в 2.0-p0, и в результате функциональность загрузки все еще закомментирована (из iseq.c, строка 2260):

/* disable this feature because there is no verifier. */
/* rb_define_singleton_method(rb_cISeq, "load", iseq_s_load, -1); */
Другие вопросы по тегам