1 / 11

第 10 回 RHG の逆襲

第 10 回 RHG の逆襲. 2009/1/25 澤田 淳二. 今日のテーマ. NODE から YARV コードへのコンパイル 変換 最適化. スクリプト実行までの流れ. rb_parser_compile_file [parse.y] 入力: Ruby スクリプト 出力: NODE rb_iseq_new_main [iseq.c] 入力:NODE 出力: YARV コード rb_iseq_eval_main [vm.c] 入力: YARV コード. rb_iseq_t. YARV コードの情報を格納

jerome
Download Presentation

第 10 回 RHG の逆襲

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第10回 RHGの逆襲 2009/1/25 澤田 淳二

  2. 今日のテーマ • NODEからYARVコードへのコンパイル • 変換 • 最適化

  3. スクリプト実行までの流れ • rb_parser_compile_file [parse.y] • 入力:Rubyスクリプト • 出力:NODE • rb_iseq_new_main [iseq.c] • 入力:NODE • 出力:YARVコード • rb_iseq_eval_main [vm.c] • 入力:YARVコード

  4. rb_iseq_t • YARVコードの情報を格納 • RDataを使ってVALUEにラッピングされる • 以下の単位で作られる • トップレベル • クラス定義 • メソッド定義 • ブロック • その他

  5. rb_iseq_new_main • コンパイル用領域の用意 • コンパイル処理rb_iseq_compile_node [compile.c] • コンパイル用領域の解放

  6. コンパイルで使われるデータ構造 • LINK_ANCHOR 変換中に利用するリスト • LINK_ELEMENT リストの各要素 • INSN < LINK_ELEMENT 各YARV命令 • LABEL < LINK_ELEMENT ifとかの飛び先

  7. LINK_ANCHOR図解 LINK_ANCHOR anchor next INSN LINK_ELEMENT next prev INSN last LABEL INSN LABEL

  8. コンパイルで使われるマクロ • ADD_INSN* LINK_ANCHORにYARV命令を追加 • ADD_SEQ LINK_ANCHORに別のLINK_ANCHORを連結 • ADD_CATCH_ENTRY 例外テーブルにエントリを追加

  9. rb_iseq_compile_node • ローカル変数サイズの設定 • 引数の設定 • NODEをLINK_ANCHORに変換iseq_compile_each • LINK_ANCHORからYARVコードに変換iseq_setup

  10. iseq_compile_each • NODEをLINK_ANCHORに変換 • 再帰的に呼び出される • 条件部を構築するための再帰 戻り値をADD_SEQで連結 • メソッド定義などによる再帰 戻り値のVALUEを命令の引数に使用

  11. iseq_setup • LINK_ANCHORを最適化 • 意味のないジャンプの除去など • 特化命令への置き換え • オペランド融合、命令融合 • スタックキャッシング • LINK_ANCHORからYARVコードへの変換 • ラベル位置の計算、ジャンプ先の設定 • 例外テーブルの設定 • ダイレクトスレッデッドコードの生成

More Related