実行時バイトコード特化の オブジェクト指向言語への拡張 中間発表 アフェルト レナルド – 米澤研究室 オブジェクト特化 オブジェクト指向プログラミングの特質: – 小さいメソッド – 入れ子オブジェクト – オブジェクト生成 プログラム特化による最適化(部分評価): – 定数伝播 – メソッドインライニング – 定数式評価 – ループアンローリング オブジェクト指向プログラムの特化は効果的 本研究の目的 出発点: 実行時バイトコード特化 [増原01] – プログラムの実行中に特化する – JAVAバイトコードの小さい部分集合がターゲット – 配列とオブジェクトのサポートはない 目的: – Imperativeな操作と – オブジェクト指向 のサポートを加える 本発表の概要 1) 特化エンジンの概要 2) 本研究における: – – – – 部分的に静的な構造 エイリアシング 副作用と剰余コードの再利用 オブジェクトの動的な割り当て 3) 結論 特化エンジンの基本概念: 1.束縛時解析 プログラムの言語構成要素を – 静的な構成要素と – 動的な構成要素 に分類する 元のプログラム int 0 1 2 3 add (x, y) iload_1 iload_2 iadd ireturn 束縛時分割 x = S y = D 束縛時解析 注釈したプログラム int 0 1 2 3 add (x, y) iload_1 iload_2 iadd ireturn 特化エンジンの基本概念: 2.特化 注釈したプログラムに沿って – 静的な構成要素を評価して、 – 動的な構成要素をそのまま剰余コードに入れる 静的な引数の値 注釈したプログラム int 0 1 2 3 add (x, y) iload_1 iload_2 iadd ireturn x = 3 y = ? 特化 剰余コード int 0 1 2 3 add (y) const_3 iload_1 iadd ireturn 特化エンジンの基本概念: まとめ 束縛時分割 元の プログラム 型システムを用 いた束縛時解析 静的な引数の値 注釈した プログラム 特化 剰余コード BCS [増原01] 部分的に静的な構造と 別名 部分的に静的な構造: this operands = D Stack = S items = D 別名:エイリアス情報が無いと – 不安全,又は – 保守的な 特化しか出来ない sp = S 副作用と剰余コード再生利用 (1/2) 実行時に二つのデータスペースがある: – ヒープと静的なメモリ – 特化の記憶 安全性の問題: 一部の静的な副作用は剰余コードに書き込むべき 性能の問題: 全部の静的な副作用を書き込めば、性能が悪化 最適な剰余コードを生成したい 副作用を出来る限り遅らせ、まとめて行う 副作用と剰余コード再生利用 (2/2) this operands = S Stack = S items = D sp = 4 BCS void add (Stack st) { st.push (operands[0]); st.push (operands[1]); int t0 = st.pop (); int t1 = st.pop (); st.push (t0 + t1); } void add (Stack st) { st.items[4] = operands[0]; st.items[5] = operands[1]; int t0 = st.items[5]; int t1 = st.items[4]; st.items[4] = t0 + t1; st.sp = 5; } オブジェクトの動的な割り当て (1/2) JAVAの特質: – 動的割り当て – 内部変数エスケープ 剰余コード中のオブジェクトの割り当てを避ける: – 特化記憶の再利用 – スタック割り当て 束縛時解析で伝統的な – useと – エスケープ 解析を利用 オブジェクトの動的な割り当て (2/2) stat = S dyn = D BCS int[] function (int stat, int dyn) { int[] array = new int[3]; Integer cst = new Integer (11); for (int i = 0; i < 3; i++) { array[i] = cst.add (stat); cst.value = dyn; } return array; } int[] function’ (int dyn) { Integer cst = getRef (0); int[] array = getRef (1); cst.value = dyn; array[1] = cst.value + stat; cst.value = dyn; array[2] = cst.value + stat; cst.value = dyn; return array; } 関連研究 Imperativeな言語: – “The taming of C pointers” [Andersen93] – “Use, flow, context, and return” sensitivity [Hornof97] メソッドの動的結合を削除: – “C++ customization” [Lea91] – バーチャルメソッドの特化 [Dean94] オブジェクト特化: – 抽象解釈 [Steensgaard92] – 宣言的な特化 [Volanschi97] 結論 実行時オブジェクトバイトコード特化: – パフォーマンスとモジュラープログラミングを保存する – ソース言語とマシンに依存しない – 普通の翻訳とJITコンパイラーの間に適する 現状: – 束縛時解析の拡張 (オブジェクトの命令) 今後の課題: – コンテキストsensitivity – エイリアスと副作用と動的な割り当て 応用: – 自分で特化出来るモバイルコード
© Copyright 2024 ExpyDoc