10

Ruby 2.0の新しい機能について読んだところ、バイトコードのインポート/エクスポートがサポートされることがわかりました。

Ruby 2.0 では、コンパイル済みの Ruby スクリプトをバイトコード表現に簡単に保存し、これらを直接実行できるようになると期待されています。

ruby-2.0.0-p0 をインストールしましたが、バイトコードをエクスポートする方法に関する情報 (または一般的にはその問題に関するドキュメント) が見つかりませんでした。この機能は既に実装されていますか?実装されている場合、どのように使用すればよいですか?

細かいところも気になります。YARV バイトコードはプラットフォームに依存しないはずですか? すべての gem はバイトコードに自動的に含まれますか?

4

2 に答える 2

5

より良い情報を持っている人がこの質問を見るまで、私はいくつかの調査を行いました:

この機能は既に実装されていますか?実装されている場合、どのように使用すればよいですか?

実装されていますが、公開されていないようです (たとえば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 はバイトコードに自動的に含まれますか?

上記の例では、gem は含まれていません。a またはwhat have youInstructionSequenceに相当するバイトコードが含まれます。require 'active_record'バイトコードのダンプとロードがruby実行可能ファイルによって直接提供された場合、この動作は変わらないのではないかと思います。

他の誰かがより多くの情報を持っているなら、私はそれを見たいです!

于 2013-01-23T14:03:20.097 に答える
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); */
于 2013-03-18T22:06:20.360 に答える