Ruby 2.0 Экспорт/импорт байткода

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

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

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

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

Ответ 1

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

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

Он реализован, но, похоже, он не отображается (например, 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 будет включать эквивалент байт-кода a require 'active_record' или что у вас есть. Я подозреваю, что если демпинг и загрузка байт-кода были предоставлены непосредственно с помощью исполняемого файла ruby, это поведение останется прежним.

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

Ответ 2

К сожалению, похоже, что верификатор не реализован в 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); */