情報伝播によるオブジェクト指向プログラム理解支援の提案 大阪大学 ○田中昌弘,石尾隆,井上克郎 大阪大学の田中です. 情報伝播によるオブジェクト指向プログラム理解支援の提案というタイトルで発表を始めさせていただきます.
概要 オブジェクト指向プログラムにタグを付加する手法を提案 発表の流れ ソースコード中の変数やメソッドについて記した注釈 目的に従ってタグを伝播 ⇒処理の記述が断片化したソースコード理解を支援 発表の流れ 背景 関連研究 提案手法の説明 まず概要ですが,本発表ではオブジェクト指向プログラムにタグを付加する手法を提案します. 本手法でのタグとは,ソースコードの中の変数やメソッドについてしるした注釈のことで,このタグを目的に従って 効果的に伝播することで,処理の記述が断片化したソースコードの理解を支援します. 以下背景から本手法の説明について発表を行います.
背景 オブジェクト指向プログラミング [1] 問題点 情報隠蔽 再利用性が向上 情報隠蔽による処理の断片化 [2] カプセル化,継承,多相性,.. 再利用性が向上 問題点 情報隠蔽による処理の断片化 [2] デバッグ,インスペクションで実行の詳細を追う作業が困難 まず背景ですが,オブジェクト指向プログラムは,カプセル化や継承,多相性といった概念がありますが, これらによって情報隠蔽を行うことによってプログラムの再利用性が向上します. ですが,その情報隠蔽によって処理が断片化し,デバッグやインスペクションでの作業が困難となるという問題があります. 複数のファイルで階層的に記述されるのはよいことですが,情報隠蔽を行うことで,そのクラス間,ファイル間の関係が このように隠蔽されてしまうので,実行の詳細を追う作業が困難になります. [1] N. Wilde et al., Maintenance Support for Object-Oriented Programs. IEEE TSE, Vol.18, No.12, pp.1038-1044, 1992. [2] M. Desmond et al., Fluid Source Code Views for Just In-Time Comprehension. SPLAT 2006.
関連研究 ソースコード上の移動を支援 [3] 問題点 開発者が注釈を記入 タグとして一覧に登録 登録した箇所へ瞬時に移動 記入した情報が別の場所で活かされない メソッドについての注釈は呼び出されている場所でも参照したい このような問題を対処するために関連研究では,その断片化したソースコードの移動を支援するというツールがあります. 小さいですが,エディタ内でのテキストの選択位置で,開発者が,右クリックしてタグの作成を選択して, 注釈を記入すると,それが,この下のビューで一覧に追加されます. そして,この一覧の項目をダブルクリックなどで選択すると,タグとして登録したファイルと位置に瞬時に移動できます. これによってソースコード上の移動がスムーズになったのですが,問題として, タグとして登録したタグが,ソースコード上の別の場所で活かされないという問題があります. 例えばメソッドについて選択した注釈は,そのメソッドが呼び出されている場所でも表示できるようにしたいということなどです. [3] M.-A. Storey et al., How Programmers can Turn Comments into Waypoints for Code Navigation. ICSM 2007, pp.265-274.
提案手法の概要 開発者がソースコード中の識別子 (変数やメソッド) にタグを付加 タグを関連する箇所に伝播 ソースコード中の変数やメソッドについての注釈 タグを関連する箇所に伝播 同一の識別子といえる関係 データフローグラフ上の関係 ⇒参照中の箇所で関連情報を確認できる この関連研究と問題とを踏まえて本研究では,以下の手法を提案します, まず開発者がソースコード中の識別子にタグを付加します. このタグとは,ソースコード中の変数やメソッドについての注釈ですが, その識別子に対して付加したタグが,関連する箇所に伝播されます. 伝播には,同一の識別子といえる関係や,データフローグラフ上での関係というものを用います. このようにタグを付加し,関連する箇所に伝播することで, 現在参照しているソースコードに,以前に付加したタグが伝播されて関連情報がその場で確認しながら読んでいくことができるので, 理解がよりしやすくなると考えられます.
タグの種類 注釈の種類に応じてタグを分類 仕様情報タグ 一時情報タグ 識別子の仕様情報を扱う 実行過程を追っている際の一時的な情報を扱う メソッドの機能の説明,値の説明など 一時情報タグ 実行過程を追っている際の一時的な情報を扱う 変数が特定の値である場合の実行過程 多相性のある型で,特定の型の場合の実行過程 具体的に手法の説明をしていきますが,まず,注釈の種類に応じてタグを以下の2つに分類します. 1つ目は識別子の仕様情報を扱う仕様情報タグで,メソッドの機能の説明などを注釈に記します. 2つ目は一時情報タグで,例えば変数が特定の値である場合の実行状況を記すことで, 値の影響範囲を調べながら読み進めていくなどのことが可能となります. 同じように多相性のある型で,特定の型の場合にどのように実行されていくかという情報を記しながら 読み進めていくことができます. 以降それぞれについて具体的に説明します
仕様情報タグ 宣言位置が同じ識別子間でタグが共通 A.java 参照中のファイル内で開発者が仕様情報タグを付加 EditorUtil.java : String s = editorUtil.getSelectedWord(); : : public getSelectedWord() { : } B.java 別の場所を開発者が参照している際に以前付加したタグが伝播される まずこの仕様情報タグについてですが, これは宣言位置が同じ識別子同士でタグが共通となるように伝播を行います. 例えば開発者がこのメソッドに仕様情報タグを付加すると,この識別子が宣言されている位置の識別子に タグが伝播されます.でこの後で別のファイルを参照しているときに,同じ識別子が現れると, 宣言部のタグを自動的に伝播してこのファイルを参照している際にこのメソッドについての情報を確認 することができます.このようにして,同じ識別子間でタグが共通になるようにします. : = super.getSelectedWord(); : 付加したタグは宣言位置の識別子へと伝播
一時情報タグ 実行過程を追うための一時的な情報を扱う データフロー関係に基づいて伝播される private IRegion getWordRegion(String source, int offset) { String word = ""; int index = offset -1; while(index >= 0){ : } index = offset; offset = offset - word.length(); 次に一時情報タグについてですが,これは変数の値や型が特定の状況の場合にどうなるかということを 注釈に記述するためのタグで,この伝播はデータフロー関係に基づいて行われます. たとえばこのコードのこの位置に位置情報タグを付加すると, この変数の値が使われる識別子にこのように伝播されます.このデータフロー関係によって伝播された タグ間では値が必ず同じとなります. 値が同じになることが条件ですので,このように値が変わる変数や,変わりうる変数には伝播されません ここで用いているデータフロー関係について以降説明していきます. 伝播されたタグは全て同じ値となる 値が変化しうるので伝播されない
一時情報タグの伝播 伝播で用いるデータフロー関係は以下の4種類 変数の定義と参照の集合 演算のない代入 メソッド呼び出しの引数 メソッドの戻り値 一時情報タグの伝播では以下の4種類のデータフロー関係に従って伝播を行います. 資料の方と若干表現が異なっていますがご容赦ください. 以降それぞれについて説明していきます.
変数の定義(代入)と参照の集合 同一の代入結果を意味する識別子へ伝播 複数の定義が到達する識別子へは伝播しない 静的単一代入形式における同一の変数 複数の定義が到達する識別子へは伝播しない a = 0; if (x > 0) { b = a; } else { b = a + 1; } c = b + a; b = a または a + 1 条件分岐を抜けると値が不確定なので伝播しない
一時情報タグの伝播 伝播で用いるデータフロー関係は以下の4種類 変数の定義と参照の集合 演算のない代入 メソッド呼び出しの引数 メソッドの戻り値 一時情報タグの伝播では以下の4種類のデータフロー関係に従って伝播を行います. 資料の方と若干表現が異なっていますがご容赦ください. 以降それぞれについて説明していきます.
演算のない代入 右辺から左辺へ伝播 伝播先に同一のタグがある場合は伝播を停止 a = 0; b = a; c = a + 1; 1つの識別子に複数のタグを伝播できる a = 0; b = a; c = a + 1; d = b + a; 演算のある代入は伝播しない
一時情報タグの伝播 伝播で用いるデータフロー関係は以下の4種類 変数の定義と参照の集合 演算のない代入 メソッド呼び出しの引数 メソッドの戻り値 一時情報タグの伝播では以下の4種類のデータフロー関係に従って伝播を行います. 資料の方と若干表現が異なっていますがご容赦ください. 以降それぞれについて説明していきます.
IShapeは実行時はCircle,Triangle,Ellipseのいずれかの型 メソッド呼び出しの引数 実引数から仮引数へ伝播 多相性のあるメソッド呼び出しでは伝播先を指定 IShapeは実行時はCircle,Triangle,Ellipseのいずれかの型 IShape shape = getSelectedShape(); : shape.setBounds(bounds); ? Circle.setBounds(Rectangle r) Triangle.setBounds(Rectangle r) Ellipse.setBounds(Rectangle r) からどれが実行されるかは静的に解決できない public IShape setBounds (Rectangle r) { }
一時情報タグの伝播 伝播で用いるデータフロー関係は以下の4種類 変数の定義と参照の集合 演算のない代入 メソッド呼び出しの引数 メソッドの戻り値 一時情報タグの伝播では以下の4種類のデータフロー関係に従って伝播を行います. 資料の方と若干表現が異なっていますがご容赦ください. 以降それぞれについて説明していきます.
メソッドの戻り値 戻り値から呼び出し元のメソッドへ伝播 複数のメソッドに呼び出されている場合は伝播先を指定 ? ? region = getWordRegion(s,idx); : .......getWordRegion(s,idx); : ? ? private IRegion getWordRegion(String s, int offset) { : return region; }
一時情報タグの伝播 伝播で用いるデータフロー関係は以下の4種類 変数の定義と参照の集合 演算のない代入 メソッド呼び出しの引数 メソッドの戻り値 一時情報タグの伝播では以下の4種類のデータフロー関係に従って伝播を行います. 資料の方と若干表現が異なっていますがご容赦ください. 以降それぞれについて説明していきます.
まとめと今後の課題 オブジェクト指向プログラムによるソースコードの断片化の問題 ソースコードのタグを付加する手法を提案 仕様情報タグ 同一な識別子間で伝播 一時情報タグ データフロー関係を用いて伝播 ツール実装と適応実験が今後の課題 最後にまとめを行います. 本発表では,ソースコードの断片化の問題に対して,2種類のタグ伝播法を提案し, ソースコード理科を図ることを目的としました. 以上で発表を終わります.ありがとうございました.
参照中のファイル中の識別子のタグ一覧を表示 タグをパッケージ階層で管理するビュー 参照中のファイル中の識別子のタグ一覧を表示 エディタ内にタグを明示するかは検討中