変数間データフローグラフを用いた ソースコード間の移動支援

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
情報伝播によるオブジェクト指向プログラム理解支援の提案
データフロー情報を用いたコード ナビゲーションツールの実装と評価
F11: Analysis III (このセッションは論文2本です)
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
静的情報と動的情報を用いた プログラムスライス計算法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ギャップを含むコードクローンの フィルタリング手法の提案
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
プログラム依存グラフを利用した 情報漏洩解析手法の提案と実現
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
Javaプログラムの変更を支援する 影響波及解析システム
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オブジェクト指向プログラムにおける エイリアス解析・視覚化ツールの試作
ソフトウェア制作論 平成30年9月26日.
コードクローンの動作を比較するためのコードクローン周辺コードの解析
プログラムで多用される 動詞と目的語の関係を利用した メソッド名提案ツール
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
エイリアス解析を用いた メソッドの入力データの 利用法可視化ツール
制御フローを考慮しない データ依存関係解析の実験的評価
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
アスペクト指向言語のための視点に応じた編集を可能にするツール
オープンソースソフトウェアに対する コーディングパターン分析の適用
分散処理を用いたコーディングパターン検出ツールの実装
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

変数間データフローグラフを用いた ソースコード間の移動支援 大阪大学大学院情報科学研究科 ○悦田翔悟 石尾隆 井上克郎

研究概要 ソースコード間の移動を支援することが目的 データフロー調査に特化した移動支援ツールを提案 移動とは,表示しているコード片を切り替える操作 例:ファイルを開いて,読解する行までカーソルを動かす データフロー調査に特化した移動支援ツールを提案 エディタ上で選択された識別子のデータフロー情報を可視化 実装したツールの有無による対照実験を行い,提案手法の有用性を確認

背景 開発者はプログラム理解作業時に,ソースコードの読解,移動に開発時間の多くを費やす プログラム理解では,データフロー調査が必要 データフローは複数のコード片を横断する void a(){ … x = b(p); … = d(x); } int b (int p){ … return c(q); } int c (int q){ … return r; } int d (int x){ … } データフロー 変数 x に関連したデータフロー調査

プログラム詳細理解時の問題 データフローを調査する作業では,頻繁にソースコード上を移動する必要がある データフロー調査を支援するツールが必要 複数のデータフローを同時に把握するために,グラフとして可視化する手法が有効 調査の難しさ データフローの特性 網羅的に探索することが難しい 優先順位をつけて探索することが難しい 推移的な関係 1対多の関係

提案手法 データフロー情報を用いたソースコード間の移動支援ツールを提案 エディタ上の識別子を選択して,変数間データフローグラフ[11]を可視化 変数間データフローグラフ 戻り値は? グラフ上で探索 戻り値 グラフを使ったデータフロー調査 [11] 柳 慶吾, 石尾隆, 井上克郎, ソフトウェア部品利用例抽出のためのデータフロー解析手法の提案と評価. 情報処理学会研究報告 第167回ソフトウェア工学研究報告会,第29巻,2010.

変数間データフローグラフ(1/2) 変数間のデータの流れに着目し,プログラム依存グラフを 簡略化したグラフ > x return result = if y 呼び出し側の 実引数から データフロー 制御フロー 呼び出し側の 戻り値へ 変数,演算子,制御文につきノードを1つ 制御フローを考慮しないため,高速に構築できる int max ( int x, int y ) { int result = y ; if ( x > y ) result = x ; return result ; }

変数間データフローグラフ(2/2) メソッド呼び出し,メソッド定義の間でデータフローを接続する x y max(x, y) result void m() { ・・・ int size = max(x, y); } <メソッド呼び出し> max(x, y) x y return int max ( int x, int y ) { ・・・ return result ; } <メソッド定義> max(x, y) x y result

グラフを使ったデータフロー調査 グラフ上で複数のコード片を横断してデータフローを調査することが可能 data setData( ) call class C { void m() { Data data = …. d.setData(data); } data setData( ) call arg class D { void setData (Data d) { this.data = d; } setData( Data ) d D.data

グラフの抽出(1/2) グラフ表示のクエリ メソッド定義,メソッド呼び出し,フィールド 開発者が閲覧中のコード片からは,読み取れないデータフロー情報を抽出 クエリの例:メソッド定義 引数,参照するフィールド  Backward探索 戻り値,代入するフィールド  Forward探索 どこから 来た? void setData( Data ) d f1 void setData(Data d){ this.f1 = d; } Data getData(){ Data r = this.f1; return r; どこへ 行く? どこから 来た? Data getData( ) r f1 どこへ 行く? return

グラフの抽出(2/2) 開発者が閲覧中のコード片からは,読み取れないデータフロー情報を抽出 表示するノード数の削減 クエリ例:メソッド呼び出し 引数  Forward探索 戻り値  Backward探索 クエリ例:フィールド フィールド  Backward探索,Forward探索 表示するノード数の削減 演算子はエッジ上に表記 抽出するノード数に閾値としてFractal Value[6]を設定 [6] Koike, H.: Fractal views: a fractal-based method for controlling information display, ACM Trans. Inf. Syst., Vol.13, pp.305–323 (1995).

実装 Eclipse pluginとして提案手法を実装 注目するノードを選択 エディタ グラフビュー 実装したEclipse plugin

実験概要 実装したツールの有効性を検証 実験内容 ツールによって移動が支援されているか評価 学生12名,企業の開発者4名を対象に,ツールの有無による対照実験 ツールあり: Eclipse + 実装したツール ツールなし: Eclipse のみ jEditを調査対象とするタスクA,Bを用意 課題に対する習熟度を考慮し,課題とツールの有無の順番を入れ替えて実験 実験の流れ ツール,タスクの説明30分,タスクA,B共に30分間調査

どのような条件の時に警告音を鳴らすかデータフローを逆上って調査する 実験タスク jEditを調査対象とするタスクA,Bを用意 EditAbbervDialog.java(153行目) JEditBuffer.java(2038行目) どのような条件の時に警告音が鳴るかデータフローを調査し,原因箇所と調査中に探索したコード片を解答用紙に記述 どのような条件の時に警告音を鳴らすかデータフローを逆上って調査する 警告音を鳴らすメソッド

実験の評価基準 正解集合の決定 時間内に調査できた正解パスの範囲を評価 原因箇所:ユーザ操作,外部データの状態に関する条件 正解パス:原因箇所から探索の起点までのデータフローパス 時間内に調査できた正解パスの範囲を評価 0.5 m v1 v2 weight(v):vの重み付け A:被験者探索したパスの集合 V:原因箇所の集合 m:探索の起点 path(v,m):vからmまでのパスの集合 探索済みのパス 探索方向 未探索のパス 調査範囲を評価

実験結果 スコアの平均値 ウィルコクソンの符号順位和検定 ツールを使用した方が,同一時間でより広範囲を調査できる ツール有り:0.79 ツールなし:0.71 ウィルコクソンの符号順位和検定 有意水準 0.05として,片側検定で有意差あり ツールを使用した方が,同一時間でより広範囲を調査できる 実験のスコアの分布

実験の考察(1/3) ツールが有効利用された例 推移的なデータフローを調査する時 網羅的にデータフローを調査する時 グラフを使ってパスの末端を確認することで,優先して調査すべきパスを決定できた 網羅的にデータフローを調査する時 分岐が現れたグラフを調査の起点に利用することで,漏れなく調査できた 以前に調査したパスをグラフ上で容易に再確認できた

実験の考察(2/3) 被験者間でのスキルの差について 被験者間で,合計スコアの差が最大で1.8 倍 Eclipse操作の熟練度,GUIツールの知識の有無が大きく影響 熟練者はツールなしの状態でも高速にデータフローを調査していた ツール操作の練習を十分行った後,比較実験を行うとより大きな差が生じると予想できる

実験の考察(3/3) グラフ上に実際には起こりえないデータフローが1件出現 対策案 使用しているグラフが制御フローを考慮していないものであるため 該当タスクをツール有りで行った被験者は8名,うち7名は該当箇所の制御フローをソースコード上で確認していたため,問題なかった 対策案 グラフの辺に代入文の行番号を表記する グラフ上でソースコードをポップアップ表示する ソースコード上での制御フローの確認を促すことができる

アンケート結果 良かった点 改良点 ツールが効果的に使用できるケース 操作性 他人が書いたソースコードを調査したいとき 変数の影響範囲を調査するとき 操作性 エディタとグラフが連動している点 改良点 ノードの移動 エッジの強調表示

まとめ 変数間データフローグラフを用いたソースコード間の移動支援ツールを提案 複数のコード片を横断してデータフローを調査することが可能 対照実験の結果,実装したツールを使用した方が,同一時間でより広範囲を調査できる 推移的な調査,網羅的な調査で有効性を発揮 今後の課題 グラフの操作性の向上 長期の試用実験を行い,ツールの有効性を調査

以下,補足資料

タスク割り当て 被験者 1,2,3 被験者 4,5,6 被験者 7,8,9 被験者 10,11,12 タスクA ツール有り タスクB ツールなし タスクA

データフローの特性 1対多の関係 推移的な関係 1 if (x > y) 1 b = a; 2 max = x; 2 c = b; 3 else 4 max = y; 1 b = a; 2 c = b; 3 d = c; (a) (b)

推移的なデータフロー 推移的なデータフロー有り 推移的なデータフローなし x y z 1 y = z ; 2 x = y ;

実験の考察(2/2) 制御フローを考慮していない

グラフの構築速度 Windows Vista SP2, Intel® Core2 Duo 1.80 GHz, 2GB RAM 対象ソフトウェア 行数 ソースコード 解析時間(秒) データフロー 合計時間(秒) ANTLR 3.0.1 71,845 39 11 50 JEdit 4.3pre11 168,872 108 17 125 Apache Batik 1.6 297,320 155 33 188 Apache Cocoon 2.1.11 505,715 490 71 561 Azureus 3.0.3.4 552,295 353 115 468 Jboss 4.2.3GA 696,761 703 348 1,051 JDK 1.5 885,887 1,054 1,001 2,055 Windows Vista SP2, Intel® Core2 Duo 1.80 GHz, 2GB RAM

スキルとスコア 最大で1.8倍の差 開発経験で二分 熟練者 初級者 ツール有り 0.84 0.83 ツールなし 0.81 0.63 差文 0.03 0.20

以下,ボツスライド

グラフの探索 変数間データフローグラフ(IVDFG)を構築、以下のルールに基づいて探索し、グラフを描画する 入力:メソッド定義 引数、参照するフィールド  Backward探索 戻り値、代入するフィールド  Forward探索 どこから 来たの? どこへ 行くの? void setData( Data ) d f1 void setData(Data d){ this.f1 = d; } Data getData(){ Data r = this.f2; return r; どこから 来たの? Data getData( ) r f2 どこへ 行くの? return

グラフの探索 変数間データフローグラフ(IVDFG)を構築、以下のルールに基づいて探索し、グラフを描画する 入力:メソッド呼び出し 引数  Forward探索 戻り値   Backward探索 どこから 来たの? void fuga( ) d Data getData() void setData( Data) void fuga(){ Data d = o1.getData(); o2.setData(d); } どこへ 行くの?

Eclipse plugin として実装(1/2) 注目するノードをエディタで開く

グラフを使った調査 開発者が閲覧中のコード片からは,読み取れないデータフロー情報を抽出 クエリの例:メソッド定義 引数,参照するフィールド  Backward探索 戻り値,代入するフィールド  Forward探索 どこから 来たの? some code どこへ 行くの? void setData( Data ) void setData(Data d){ this.f1 = d; } Data getData(){ Data r = this.f1; return r; f1 d どこから 来たの? Data getData( ) f1 r f1 どこへ 行くの? some code return

実装 Eclipse pluginとして提案手法を実装 注目するノードをエディタで開く クエリを起点とした グラフを表示する 複数のコード片を横断したデータフローの効果的な調査が可能 識別子を選択して クエリを作成する グラフビュー 変数間データフローグラフを可視 演算子条件の省略,探索打ち切りを行う