2013-01-18 6 views
10

Ho letto circa la new ruby 2.0 features, e ha scoperto che sosterrà bytecode import/export:Rubino 2.0 Bytecode Export/Import

Rubino 2.0 è previsto per rendere più semplice per salvare script Ruby pre-compilati alle rappresentazioni bytecode e quindi eseguirle direttamente.

Ho installato ruby-2.0.0-p0, ma non ho trovato alcuna informazione su come esportare il bytecode (o in genere la documentazione su tale argomento). Questa funzione è già implementata e, in caso affermativo, come la utilizzo?

Mi sto anche interrogando su alcuni dettagli. Il bytecode YARV dovrebbe essere indipendente dalla piattaforma? Tutte le gemme sono incluse automaticamente nel bytecode?

risposta

5

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!

+0

è '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. –

4

Purtroppo sembra che il verificatore non ha ottenuto implementato in 2.0 p0, e di conseguenza la funzionalità di carico è ancora commentate (da iseq.c, linea 2260):

/* disable this feature because there is no verifier. */ 
/* rb_define_singleton_method(rb_cISeq, "load", iseq_s_load, -1); */