より良い情報を持っている人がこの質問を見るまで、私はいくつかの調査を行いました:
この機能は既に実装されていますか?実装されている場合、どのように使用すればよいですか?
実装されていますが、公開されていないようです (たとえば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 バイトコードはプラットフォームに依存しないはずですか? すべての gem はバイトコードに自動的に含まれますか?
上記の例では、gem は含まれていません。a またはwhat have youInstructionSequence
に相当するバイトコードが含まれます。require 'active_record'
バイトコードのダンプとロードがruby
実行可能ファイルによって直接提供された場合、この動作は変わらないのではないかと思います。
他の誰かがより多くの情報を持っているなら、私はそれを見たいです!