[英]Ruby 2.0 Bytecode Export / Import
我一直在閱讀有關新的ruby 2.0功能 ,並發現它將支持字節碼導入/導出:
Ruby 2.0有望簡化將預編譯的Ruby腳本保存到字節碼表示中,然后直接運行它們。
我已經安裝了ruby-2.0.0-p0,但是我沒有找到任何關於如何導出字節碼的信息(或者通常是關於這個問題的文檔)。 此功能是否已實施,如果已實施,我該如何使用它?
我也想知道一些細節。 YARV字節碼是否應該與平台無關? 所有寶石都自動包含在字節碼中嗎?
在有更好信息的人看到這個問題之前,我做了一些研究:
此功能是否已實施,如果已實施,我該如何使用它?
它已實現,但似乎沒有暴露(例如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。 你的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); */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.