110 likes | 224 Views
第 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 コードの情報を格納
E N D
第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コードの情報を格納 • RDataを使ってVALUEにラッピングされる • 以下の単位で作られる • トップレベル • クラス定義 • メソッド定義 • ブロック • その他
rb_iseq_new_main • コンパイル用領域の用意 • コンパイル処理rb_iseq_compile_node [compile.c] • コンパイル用領域の解放
コンパイルで使われるデータ構造 • LINK_ANCHOR 変換中に利用するリスト • LINK_ELEMENT リストの各要素 • INSN < LINK_ELEMENT 各YARV命令 • LABEL < LINK_ELEMENT ifとかの飛び先
LINK_ANCHOR図解 LINK_ANCHOR anchor next INSN LINK_ELEMENT next prev INSN last LABEL INSN LABEL
コンパイルで使われるマクロ • ADD_INSN* LINK_ANCHORにYARV命令を追加 • ADD_SEQ LINK_ANCHORに別のLINK_ANCHORを連結 • ADD_CATCH_ENTRY 例外テーブルにエントリを追加
rb_iseq_compile_node • ローカル変数サイズの設定 • 引数の設定 • NODEをLINK_ANCHORに変換iseq_compile_each • LINK_ANCHORからYARVコードに変換iseq_setup
iseq_compile_each • NODEをLINK_ANCHORに変換 • 再帰的に呼び出される • 条件部を構築するための再帰 戻り値をADD_SEQで連結 • メソッド定義などによる再帰 戻り値のVALUEを命令の引数に使用
iseq_setup • LINK_ANCHORを最適化 • 意味のないジャンプの除去など • 特化命令への置き換え • オペランド融合、命令融合 • スタックキャッシング • LINK_ANCHORからYARVコードへの変換 • ラベル位置の計算、ジャンプ先の設定 • 例外テーブルの設定 • ダイレクトスレッデッドコードの生成