我一直在閱讀有關的new ruby 2.0 features,發現它會支持字節碼導入/導出:紅寶石2.0字節碼導出/導入
紅寶石2.0有望使簡單的保存預編譯的Ruby腳本字節碼錶示,然後直接運行這些。
我已經安裝了ruby-2.0.0-p0,但是我沒有找到任何有關如何導出字節碼的信息(或關於該問題的一般文檔)。這個功能是否已經實現,如果有,我該如何使用它?
我也想知道一些細節。 YARV字節碼應該是平臺無關的嗎?所有的寶石都會自動包含在字節碼中嗎?
我一直在閱讀有關的new ruby 2.0 features,發現它會支持字節碼導入/導出:紅寶石2.0字節碼導出/導入
紅寶石2.0有望使簡單的保存預編譯的Ruby腳本字節碼錶示,然後直接運行這些。
我已經安裝了ruby-2.0.0-p0,但是我沒有找到任何有關如何導出字節碼的信息(或關於該問題的一般文檔)。這個功能是否已經實現,如果有,我該如何使用它?
我也想知道一些細節。 YARV字節碼應該是平臺無關的嗎?所有的寶石都會自動包含在字節碼中嗎?
直到有人提供更好的信息看這個問題,我做了一些研究:
是這個功能已經實現,如果是這樣,我怎麼使用它?
它已實施,但似乎並未公開(例如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
可執行文件直接提供的,則此行爲將保持不變。
如果其他人有更多的信息,我很樂意看到它!
不幸的是,它看起來像驗證沒有得到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); */
是'RubyVM :: InstructionSequence在2.0中真的很新穎嗎?請參閱http://www.ruby-doc.org/core-1.9.3/RubyVM/InstructionSequence.html。我也會期望主要的紅寶石可執行文件的一些標誌。 –