バイトコードを単位とする Javaスライスシステムの試作 井上研究室 梅森 文彰 1 プログラムスライス • ある文のある変数(スライス基準)の値に影響を 与え得る文の集合 1: 2: 3: 4: 5: 6: 7: 8: a = 0; b = 1; if (a > b) { c = a; } else { c = b; } return c; スライス基準 <6,c> 1: 2: 3: 4: 5: 6: 7: 8: a = 0; b = 1; if (a > b) { c = a; } else { c = b; } return c; • デバッグ対象が限定され、フォールト位置の特定 を効率よく行うことができる 2 スライス - 計算手順 1. 依存関係解析 – 制御依存関係解析 – データ依存関係解析 2. プログラム依存グラフ(PDG)構築 – 節点: 各プログラム文 – 辺: 文間の依存関係 3. スライス計算 制御依存関係 if (i < 5) { i++; } データ依存関係 a = 1; b = a; a プログラム依存グラフ – スライス基準に対応するPDG節点か ら有向辺を逆向きにたどる – 到達可能な節点集合に対応する文 が求めるスライス 3 スライス - 分類 • 静的スライス – (プログラム実行を伴わない)静的依存関係解析に基づく 解析コストは小さいが、すべての実行経路を 考慮するため、解析精度は低い • 動的スライス – (プログラム実行を伴う)動的依存関係解析に基づく 解析精度は高いが、プログラムの実行系列を 保存しなければならず、解析コストは大きい • DCスライス – 動的データ依存関係解析、静的制御依存関係解析に基づく 動的スライスより低コストで、かつ静的スライス より高精度のスライス計算が可能 4 研究の目的 • オブジェクト指向言語 Java – 近年のソフトウェア開発環境で多く利用される – 多くの実行時決定要素の存在 • 配列の添字、オブジェクトへの参照、動的束縛 • 例外処理、並列処理 • Javaを対象とするスライスシステムの構築 – DCスライスを適用 – バイトコードを解析単位とし、解析結果をソースコード に反映 5 Javaスライスシステム - 解析手順 Phase 1: ソースコード・バイトコード対応表の出力 Phase 2: バイトコードに対する依存関係解析 (a): 静的制御依存関係解析 (b): 動的データ依存関係解析† Phase 3: PDGによるスライス計算 以降、スライス、スライス基準、PDGに対し、バイトコード、 ソースコードそれぞれに関するものを、(S)、(B)を用いて表す。 (例: スライス基準(S) 、スライス(B) ) †誉田謙二:“バイトコード間の動的依存情報を抽出するJavaバーチャルマシン”, 大阪大学大学院基礎工学研究科修士学位論文,2002 6 Phase 1: ソースコード・バイトコード対応表の出力 • ソースコードのトークン列とバイトコードとの対応を 抽出 int i = 0; if (i < 5) { i++; } iconst_0 0 istore_1 i= iconst_5 5 iload_1 i if_cmpge L8 < iinc 1 1 L8: nop return i++ < main 7 Phase 2(a): 静的制御依存関係解析† • バイトコード間の制御依存関係を静的に解析 • 手順 – 基本ブロックの分割 – 制御フローグラフの構築 – 制御依存関係の抽出 iconst_0 istore_1 iconst_5 iload_1 if_cmpge L8 iconst_0 istore_1 iconst_5 iload_1 iconst_0 istore_1 iconst_5 iload_1 if_cmpge L8 iinc 1 1 L8: if_cmpge L8 iinc 1 1 iinc 1 1 nop L8:nop return return †Andrew.W: Modern Compiler Implementation in C, 1998 L8: nop return 8 Phase 3: PDGによるスライス計算 • スライス基準に対応するPDG節点から有向辺を 逆向きにたどることで、スライスを抽出 • 手順 – 対応表による、スライス基準(S)からスライス基準(B)へ の変換 – PDG(B)の構築およびその探索 – 対応表による、スライス(B)からスライス(S)への変換 9 Javaスライスシステム - 適用例 スライス結果 ソースコード int i = 0; if (i < 5) { i++; } スライス基準 Javaコンパイラ 1: iconst_0 1: 0 2: isotre_1 2: i= 3: iconst_5 3: 5 4: iload_1 4: i 5: if_cmpge L8 5: < 6: iinc 1 1 6: i++ nop 7: < return 8: main 7: 8: L8: Java バーチャルマシン int i = 0; if (i < 5) { i++; } iconst_0 スライサ istore_1 iconst_5 iload_1 if_cmpge L8 制御依存関係 解析ツール iinc 1 1 L8: nop 静的制御依存関係 通常の実行結果 動的データ依存関係 return 10 Javaスライスシステム - 実装 Phase 1: ソースコード・バイトコード対応表の出力 – Javaコンパイラの機能拡張 – 言語:Java、行数:約3,000行(約42,000行) Phase 2(a): バイトコードに対する静的制御依存関 係解析 – バイトコードダンプツールの機能拡張 – 言語:C、行数:約1,600行(約4,000行) Phase 3: PDGによるスライス計算 – 言語:C、行数:約1,200行 ()内は機能拡張後のツールにおけるコード総行数を表す 11 Javaスライスシステム - 評価 • 解析精度(スライスサイズ) – 対象: 簡易データベースシステム(4クラス・262行) – 評価: 提案手法と動的スライス、静的スライスとの比較 スライスサイズ[行](全体に対するスライスの割合) 静的スライス 提案手法 動的スライス スライス基準1 60(22.9%) 30(11.4%) 24(10.3%) スライス基準2 19(7.3%) 15(5.7%) 14(5.4%) 静的スライスに比べ、十分に高い解析精度を満たすことを 確認 実験環境: Pentium4 1.5GHz, 512MB, FreeBSD 5.0-CURRENT, JDK1.2.2 12 まとめ • バイトコードを単位とする細粒度Javaスライスシ ステムの試作 – ソースコード・バイトコードの対応表の出力 – バイトコードに対する制御依存関係解析 – PDGによるスライス計算 高精度のスライスを低コストで抽出可能 • 今後の課題 – バイトコードの最適化に対応したバイトコード・ソース コード対応表の作成 – 実際のプログラム開発におけるシステムの適用 13 評価 - 解析コスト Phase 1: ソースコード・バイトコード対応表の出力 簡易データベースシステム(4クラス・262行)のコンパイル Phase 2(a): 係解析 Phase 3: 通常出力時[ms] 対応表出力時[ms] 1,114 2,405 バイトコードに対する静的制御依存関 JDK付属クラスライブラリの制御依存関係解析 総クラス数 解析時間(全体)[ms] 平均解析時間(一クラス)[ms] 4,807 48,060 9.99 PDGによるスライス計算 簡易データベースシステム(4クラス・262行)のスライス計算 PDG節点数 34,996 PDG構築時間[ms] スライス計算時間[ms] 346 179 実験環境: Pentium4 1.5GHz, 512MB, FreeBSD 5.0-CURRENT, JDK1.2.2 14
© Copyright 2024 ExpyDoc