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); */