Fino a quando qualcuno con una migliore informazione guarda a questa domanda, ho fatto qualche ricerca:
è proprio questa caratteristica già implementata, e se sì, come posso usarlo?
È implementato, ma non sembra essere esposto (ad esempio, ruby --dump-bytecode
non esiste). Inoltre non c'è molto documentation. Per quanto posso dire, quello che stai cercando è qualcosa di simile:
seq = RubyVM::InstructionSequence.compile_file("./example.rb")
seq.disassemble
vi darà una stringa formattata che si potrebbe scaricare un file, o seq.to_a
genererà un una matrice che assomiglia 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>",
....
Se si vuole persistere ad un file, è possibile fare qualcosa di simile:
File.write("out.dump", Marshal.dump(seq.to_a))
E poi caricare di nuovo:
arr = Marshal.load(File.read("out.dump"))
Purtroppo non riesco a capire come creare un nuovo InstructionSequence
dato l'array caricato sopra.
Mi chiedo anche alcuni dettagli. Il bytecode YARV dovrebbe essere indipendente dalla piattaforma? Tutte le gemme sono incluse automaticamente nel bytecode?
Nell'esempio precedente, le gemme non sono incluse. Il tuo InstructionSequence
includerebbe l'equivalente bytecode di un require 'active_record'
o di quello che hai. Sospetto che se il dumping e il caricamento di bytecode fossero forniti direttamente da un eseguibile ruby
, questo comportamento sarebbe rimasto lo stesso.
Se qualcun altro ha ulteriori informazioni mi piacerebbe vederlo!
è 'RubyVM :: InstructionSequence' davvero nuovo nel 2.0? Vedi http://www.ruby-doc.org/core-1.9.3/RubyVM/InstructionSequence.html. Mi sarei anche aspettato alcune bandiere per l'eseguibile principale di ruby. –