データフロー情報を用いたコード ナビゲーションツールの実装と評価

Slides:



Advertisements
Similar presentations
シーケンス図の生成のための実行履歴圧縮手法
Advertisements

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

データフロー情報を用いたコード ナビゲーションツールの実装と評価 大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室 博士前期課程2年 悦田 翔悟

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

背景 開発者はプログラム理解作業時に,ソースコードの読解,移動に開発時間の多くを費やす プログラム理解では,データフロー調査が必要 データフローは複数のコード片を横断する void a(){ … x = b(p); … = d(x); } int b (int p){ … return c(q); } int c (int q){ … return r; } オブジェクト指向プログラミングでは,・・・,と言われています. これは,開発者はプログラム理解時に,注目するコード片に含まれる変数のデータフローを調査する必要があり, そして,データフローはフィールド参照,メソッド呼び出しの引数,戻り値を介して,複数のコード片・・・ 例えば,メソッドaの変数xのデータフローを調査しようとすると, xの値を計算したメソッドbの戻り値を調べ,さらに,そこから呼ばれているメソッドcの戻り値を調べる必要があります. また,xが引数に渡されたメソッドdについても,引数がどのように使われるか調べる必要があります. このように,開発者はソースコード上での移動を行いながら,プログラムを理解します. int d (int x){ … } データフロー 変数 x に関連したデータフロー調査

プログラム詳細理解時の問題 データフローを調査する作業では,頻繁にソースコード上を移動する必要がある データフロー調査を支援するツールが必要 複数のデータフローを同時に把握するために,グラフとして可視化する手法が有効 調査の難しさ データフローの特性 網羅的に探索することが難しい 優先順位をつけて探索することが難しい 推移的な関係 1対多の関係 先程の例のように,ある変数に注目して、データフロー・・・ これは,データフローには,代入が連続して起こるなど,推移的な関係をもつものや, 代入先,代入元が複数存在するなど,1対他の関係をもつものがあるからです. このような理由から,複数存在するデータフローパスに対して、網羅的に・・・ 難しいと言われています. よって,・・・必要となります. データフローの特性,それに起因する調査の難しさを考慮すると,複数の・・・

提案手法 目的:ソースコード上での移動を支援 データフロー情報を用いたコードナビゲーションツールを提案 エディタ上の識別子を選択して,変数間データフローグラフ[1]を可視化 変数間データフローグラフ 戻り値は? グラフ上で探索 そこで,本研究では、開発者の・・・を目的として ・・・提案します. 例を用いて,コードナビゲーションの手順を説明します. 開発者が,isEditable()メソッドの戻り値に注目したとすると,関連するグラフを提示することで 開発者はグラフ上で戻り値に関するデータフローを調査することができ,移動の手間が削減されます. 戻り値 グラフを使ったデータフロー調査 [1] 柳 慶吾, 石尾隆, 井上克郎, ソフトウェア部品利用例抽出のためのデータフロー解析手法の提案と評価. 情報処理学会研究報告 第167回ソフトウェア工学研究報告会,第29巻,2010.

変数間データフローグラフ 変数間のデータの流れに着目し,プログラム依存グラフを 簡略化したグラフ 変数,演算子,制御文につき頂点1つ > x return result = if y 呼び出し側の 実引数から データフロー 制御フロー 呼び出し側の 戻り値へ 変数,演算子,制御文につき頂点1つ 制御フローを考慮しないため,高速に構築できる int max ( int x, int y ) { int result = y ; if ( x > y ) result = x ; return result ; } 本研究で表示する,変数間データフローグラフについて説明します. これは,・・・ 特徴として、 例えば,このプログラム例では,こちらのグラフが構築されます. メソッドmaxでは,引数x,yをとり,大小比較の結果がIF文にはいることで,xからresultへの代入を制御します. また,yからresultへも代入が行われ,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; } このグラフを使って,開発者はグラフ上でデータフローを調査することができます. 例えば, このようなソースコードがあって,クラスCのメソッドmから,クラスDのメソッドsetDatが呼ばれているとします. 開発者がクラスcのローカル変数dataに注目していたとすると,グラフから,dataが引数dに代入され,フィールドdataに代入され, その後どのようなデータフローが続いているかといったことが,読み取れます. このように,開発者はグラフ上で・・・ setData( Data ) d D.data

実装 Eclipse pluginとして提案手法を実装 エディタ グラフビュー 実装したEclipse plugin 図はツールのスクリーンショットで, 開発者はエディタ上で、注目している識別子を選択することで,グラフビューで選択した識別子を基点とするデータフローグラフを表示することができます. このように開発者はエディタとグラフを連動させてデータフローを調査していきます. エディタ グラフビュー 実装したEclipse plugin

どのような条件の時に警告音を鳴らすかデータフローを逆上って調査する 実験概要 実装したツールの有効性を検証 ツールによって移動が支援されているか評価 実験内容 学生12人を対象に,ツールの有無による対照実験 jEditを調査対象とするタスクA,Bを用意 どのような条件の時に警告音が鳴るかデータフローを調査し,原因箇所と調査中に探索したコード片を解答用紙に記述 実験の流れ ツールの説明30分,タスクA,B共に30分間調査 どのような条件の時に警告音を鳴らすかデータフローを逆上って調査する 実験の目的は,...つまり, ツールによって 課題として,jEditを・・・ 具体的には,被験者には・・・ 警告音を鳴らすメソッド

実験の評価基準 正解集合の決定 時間内に調査できた正解パスの範囲を評価 原因箇所:ユーザ操作,外部データの状態に関する条件 正解パス:原因箇所から探索の起点までのデータフローパス 時間内に調査できた正解パスの範囲を評価 0.5 m v1 v2 weight(v):vの重み付け A:被験者探索したパスの集合 V:原因箇所の集合 m:探索の起点 path(v,m):vからmまでのパスの集合 課題によっては,原因箇所は複数ある場合もあります. 0~1の実数値で評価 例えば,この図は 探索の起点をm,原因箇所をv1,v2,赤い辺が探索できたパス,黒い辺が探索できなかったパスとしたもので, この場合のスコアの算出すると,まずv1,v2をそれぞれ重み付け, v1からmは半分探索できているので,0.25・・・ 探索済みのパス 探索方向 未探索のパス 調査範囲を評価

実験結果 スコアの平均値 ウィルコクソンの符号順位和検定 ツールを使用した方が,同一時間でより広範囲を調査できる ツール有り:0.84 ツールなし:0.72 ウィルコクソンの符号順位和検定 有意水準 0.05として,片側検定で有意差あり ツールを使用した方が,同一時間でより広範囲を調査できる ウィルコクソンの符号順位検定を用いて, *** 帰無仮説ツールの有り,なしによるスコアに差はない 対立仮説ツール有りの場合の方が,なしの場合よりもスコアが高い ツールにより,移動支援が行われた 実験のスコアの分布

実験の考察(1/2) ツールが有効利用された例 推移的なデータフローを調査する時 網羅的にデータフローを調査する時 グラフを使ってパスの末端を確認することで,優先して調査すべきパスを決定できた 網羅的にデータフローを調査する時 分岐が現れたグラフを調査の起点に利用することで,漏れなく調査できた 以前に調査したパスをグラフ上で容易に再確認できた 実験の考察として,ツールが有効利用された例について述べます. グラフ上でパスの末端を読み取ることで、 ・・・漏れ無く探索ができていました. また,被験者は以前に調査したパスを確認することが多く,その際グラフを使って,容易に再確認できていた.

実験の考察(2/2) グラフ上に実際には起こりえないデータフローが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); } Side Effectはオプションで どこへ 行くの?

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 そして,次にクエリに・・・ このとき,開発者が閲覧中のコード片からは,読み取れないデータフロー情報を抽出します 例えば,開発者がメソッド定義をクエリとした場合,・・・探索を行って,データフロー情報を抽出します. setDataでは,・・・ getDataでは,・・・といった情報はソースコード上で読み取れないため,グラフとして可視化します. どこから 来たの? Data getData( ) f1 r f1 どこへ 行くの? some code return

実装 Eclipse pluginとして提案手法を実装 注目するノードをエディタで開く クエリを起点とした グラフを表示する 複数のコード片を横断したデータフローの効果的な調査が可能 下図は、Eclipse pluginとして実装したツールのスクリーンショットです。 開発者はエディタ上で、識別子を選択することでクエリを作成します。そして、本ツールでは、こちらのグラフビューでクエリを起点としたデータフローグラフを表示します。 開発者は、グラフ上でデータフローを調査することができ、(クリック!)グラフ上での注目するノードについては、エディタで開き、プログラムを読解することができます。 エディタとグラフを連動させることで,複数のコード片を横断したデータフローの調査を容易に行うことが可能 識別子を選択して クエリを作成する グラフビュー 変数間データフローグラフを可視 演算子条件の省略,探索打ち切りを行う