Ответ 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
, это поведение останется прежним.
Если у кого-то еще есть больше информации, я бы с удовольствием посмотрел его!