簡體   English   中英

Ruby 2.0字節碼導出/導入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM