2013-01-18 53 views
10

我一直在閱讀有關的new ruby 2.0 features,發現它會支持字節碼導入/導出:紅寶石2.0字節碼導出/導入

紅寶石2.0有望使簡單的保存預編譯的Ruby腳本字節碼錶示,然後直接運行這些。

我已經安裝了ruby-2.0.0-p0,但是我沒有找到任何有關如何導出字節碼的信息(或關於該問題的一般文檔)。這個功能是否已經實現,如果有,我該如何使用它?

我也想知道一些細節。 YARV字節碼應該是平臺無關的嗎?所有的寶石都會自動包含在字節碼中嗎?

回答

5

直到有人提供更好的信息看這個問題,我做了一些研究:

是這個功能已經實現,如果是這樣,我怎麼使用它?

它已實施,但似乎並未公開(例如ruby --dump-bytecode不存在)。也有不是很多documentation。據我所知,你正在尋找的是這樣的:

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可執行文件直接提供的,則此行爲將保持不變。

如果其他人有更多的信息,我很樂意看到它!

+0

是'RubyVM :: InstructionSequence在2.0中真的很新穎嗎?請參閱http://www.ruby-doc.org/core-1.9.3/RubyVM/InstructionSequence.html。我也會期望主要的紅寶石可執行文件的一些標誌。 –

4

不幸的是,它看起來像驗證沒有得到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); */