ソースコードの編集内容を入力とした ソフトウェア部品の自動検索 大阪大学の島田です. 本研究では,ソースコードの編集内容を入力として, ソフトウェア部品を自動的に検索・提示するシステムを開発していますので, そのことについて発表します. ○島田隆次, 市井誠, 早瀬康裕, 松下誠, 井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア部品の再利用 ソフトウェアの品質や生産性の向上のために, ソフトウェア部品の再利用が行われている ソフトウェア部品(部品) モジュールやクラスなど,ソフトウェアの構成要素 再利用 既存の部品の一部分または全体を別のシステムで利用すること 最初に,本研究の背景について説明します. 本研究の背景には「ソフトウェア部品の再利用」があります. モジュールやクラスなど,ソフトウェアの構成要素をソフトウェア部品,または単に部品と言います. ソフトウェア開発の際には,既存の部品を適切に再利用することで ソフトウェアの品質や生産性が向上すると言われています.
部品検索システム 大量の部品群から目的のものを探すのは大変 大量の部品を蓄積して管理・検索を行うシステム 我々の研究グループで開発しているSPARSなど 開発者はキーワード検索などで部品を検索する しかし,一般に部品は大量に存在するので,その中から目的のものを探すのは大変な作業となることがあります. そのため現在までに,大量の部品を蓄積して管理・検索を行うためのシステムとして部品検索システムがいくつか開発されています. 我々の研究グループでもSPARSという部品検索システムを開発しています. ソフトウェア開発の際には,開発者は部品検索システムを使い, 必要な部品をキーワード検索などで取得して再利用を行います.
部品検索システムを利用する際の問題点 必要な部品を見つけることが難しい 検索しないと部品を見つけることができない 部品についての知識が必要になる 適切な検索キーワードが思いつかない 検索しないと部品を見つけることができない 開発者が存在を期待していない部品は検索されない しかし,このシステムを利用してソフトウェア開発を行う際には次のような問題点があります. それは必要な部品を見つけることが難しいという点です. 適切な部品を得るためには,その部品についての知識が必要になることがあります. また適切な検索キーワードが思いつかない場合もあります. 皆さんの中にもWebなどでうまく検索ができなかった経験のある方がおられるかもしれません. また,検索を行わないと部品を見つけることができないという点も問題になります. 開発者が存在を期待していない部品は検索されないので, 検索しようとせずに同じものを自分で作ってしまうことは防げません. これらの問題が部品の再利用を難しくしています.
部品の自動検索 開発者がソースコードを編集している時に,明示的な指示なしに,システムが自動的に検索条件を生成して検索を行うこと 利点 開発者が検索しようとしなくても検索が行われる 開発者が検索対象について知っている必要がない 先の問題に対して自動検索が有効であると言われている* * Ye, Y. and Fischer, G.: Reuse-Conducive Development Environments, Automated Software Engineering, Vol. 12, No. 2, pp. 199–235 (2005). この問題に対して,Yeらによって部品の自動検索という手法が提案されています. 自動検索とは,開発者がソースコードを編集している時に, 明示的な指示なしに,システムが自動的に検索条件を生成して検索を行うことです. このため,開発者が検索しようとしなくても検索が行われる,であるとか, 開発者が検索対象について知っている必要がないといった利点があります. この自動検索が,さきほど述べたような問題に対して有効であると言われています.
従来研究 : CodeBroker メソッドを書き始めたときに再利用可能なメソッドを自動検索するシステム 利用する情報 問題点 メソッドのドキュメントコメント メソッドのシグネチャ 問題点 自動検索されることを意識してコーディングする必要がある 利用できる場面が限られる その自動検索を実装した従来研究として,CodeBrokerがあります. これはあるメソッドを書き始めたときに,そのメソッドのドキュメントコメントとシグネチャを元に, 再利用可能なメソッドを自動検索するシステムです. ドキュメントコメントとは,メソッドの機能などを説明するための特殊なコメントのことです. シグネチャとは,メソッドの引数や戻値の型の情報です. CodeBrokerの問題点は,自動検索されることを意識してコーディングする必要があるということです. CodeBrokerが自動検索を行えるようなコーディングスタイルを開発者に強制することになってしまい, 何もしなくても検索してくれるという自動検索の利点を損なうことになってしまっています. また,利用できる場面が限られるという問題もあります. ドキュメントコメントとメソッドのシグネチャを書いた後にしか検索が行えないので, メソッドの中身を書いている時には検索できない, といった制限があります.
本研究の概要 目的 方針 先の問題を改善した部品自動検索システムの開発 コーディングスタイルに依存しない より多くの場面で利用できる 方針 ソースコード編集中にソースコードから特徴的な情報(特徴情報)を抽出して自動検索を行う ドキュメントコメント 通常のコメント 利用しているメソッド 出現する識別子とその型 そこで本研究では,先ほど述べたようなCodeBrokerの問題を改善し, 普段どおりのコーディングスタイルで,より多くの場面で利用できる 部品自動検索システムを開発することを目指しています. そのために,編集中のソースコードから特徴的な情報(特徴情報)を抽出して検索を行います. 本研究では,CodeBrokerでも利用されているドキュメントコメントのほかに, 通常のコメントや,利用しているメソッド,出現する識別子やその型を特徴情報として利用します.
利用シナリオ クラスの一部を入力 システムが類似部品を検索・提示 必要ならプロジェクトに部品を取り込んで置き換え 大きな整数を扱うクラスが欲しいけど 誰も作ってないだろうから自作しよう class LargeInteger { private int[] data; public LargeInteger add(LargeInteger i) {} public LargeInteger sub(LargeInteger i) {} クラスの一部を入力 本システムの利用シナリオを説明します. たとえば,開発者がintやlong型では扱えない大きな整数を扱いたいと思っています. このとき開発者が既存部品の検索を行わなかった場合を考えます. 開発者がコードを書いていくと, システムがそれに従って特徴情報を自動的に抽出して検索を行い, 「LargeInteger」という名前,「内部にintの配列」を持つこと,「addやsubのメソッド」を持つことなどから 類似部品として既存のBigIntegerクラスを検索し提示します. 最後に,開発者はこのクラスをプロジェクトに取り込んで,書きかけのLargeIntegerクラスと置き換えることができます. 類似部品の提示 1 BigInteger arbitary-precision integer 開発者 開発環境
検索手法 編集を監視し,セミコロン入力等の編集の区切りを検出 編集中のソースコードから特徴情報を抽出 似た特徴情報を含む部品をLSIで検索 入力:編集中のソースコードに含まれる特徴情報とその重み 出力:似た特徴情報を含む部品 LargeInteger add sub AddOp eval getChild BigInteger add sub SubOp eval getChild 特徴情報 次に本システムの検索手法について説明します. まずシステムは,開発者によるソースコードの編集を監視します. セミコロンの入力などの編集の区切りを検出したら, システムは編集中のソースコード内にある特徴情報を抽出します. 抽出する際には編集中の位置に近い特徴情報ほど大きな重みをつけるようにします. これによって,編集中の位置に適した部品が検索できます. また,蓄積された部品群からも事前に特徴情報を抽出しておきます. 検索処理には,情報検索の分野で広く用いられているLSIという手法を用います. LSIは入力に類似したものを多数の文章集合から検索する手法です. LSIによる検索では,編集中のソースコードに含まれる特徴情報を入力として検索を行い, 出力として似た特徴情報を含む部品を得ます. LSIについての詳細はここでは省かせていただきます. 編集中の ソースコード 蓄積された部品群 (オープンソースソフトウェア集合など)
システムの構成 クライアント・サーバ型 クライアント サーバ 編集の監視,特徴情報の抽出,検索結果の提示 部品データベースに対する検索 索引 クライアント・サーバ型 クライアント 編集の監視,特徴情報の抽出,検索結果の提示 サーバ 部品データベースに対する検索 クライアント サーバ 統合開発環境 Eclipse 部品 データ ベース 編集 エディタ 開発者 編集 位置 ソース コード 本システムの構成について説明します. システムは図のようにクライアントとサーバから成っています. クライアントは開発者による編集を監視し,編集中のソースコードから特徴情報の抽出を行い,検索結果を提示します. サーバは部品データベースに対する検索を行います. このようにクライアントサーバ構成にすることで再利用する部品をサーバ側で一元的に管理できるようになっています. 検索クエリ 検索クエリ生成部 部品検索部 索引作成部 索引 事前に構築 部品の提示 部品提示部 部品一覧 赤色が本研究で実装した部分
システムの動作 事前に部品データベースから索引を作成 編集の区切りを検出して検索クエリを生成 索引を用いて部品検索 得られた部品を開発者に提示 クライアント サーバ 統合開発環境 Eclipse 部品 データ ベース 編集 エディタ 開発者 編集 位置 ソース コード 次に,このシステムがどのように動作するかを説明します. まず事前に,索引作成部が部品のソースコードを格納した部品データベースを解析し, 検索に用いる索引を作成しておきます. 開発者がソースコードを編集している間, 検索クエリ生成部は,ソースコードの編集を監視し, 編集の区切りを検出して検索クエリを生成します. 生成された検索クエリはサーバの部品検索部に送信されます. 部品検索部は索引を用いて部品検索を行い,検索結果の部品を部品データベースから取得します. 最後に部品提示部が見つかった部品の一覧を開発者に提示します. 検索クエリ 検索クエリ生成部 部品検索部 索引作成部 索引 事前に構築 部品の提示 部品提示部 部品一覧 赤色が本研究で実装した部分
java.math.BigInteger : : 利用シナリオでの動作例 開発者がソースコードを入力 編集の区切りを検出して特徴情報を抽出,検索クエリとして送信 索引を用いて部品検索 得られた部品を開発者に提示 カーソル 0.5 0.6 0.8 0.9 重み class LargeInteger { private int[] data; public LargeInteger add(LargeInteger i) {} public LargeInteger sub(LargeInteger i) {} クライアント サーバ 統合開発環境 Eclipse 部品 データ ベース 編集 java.math.BigInteger : : エディタ 開発者 編集 位置 ソース コード ではこの図を用いて,先ほどのシナリオでどのように検索が行われるかを説明します. まず,開発者がソースコードを入力します. システムは入力を監視して,セミコロンや中括弧などの入力を編集の区切りとして検出します. これらの区切りが検出されたら,そのソースコード内から識別子などの特徴情報を抽出します. ここでは,クラス名であるLargeIntegerや,フィールドであるintの配列のdata,メソッド名であるaddとsubが抽出されます. このとき,現在編集中の位置つまりカーソルのある位置に近い特徴情報ほど大きな重みをつけます. この例では,一番近いsubが一番大きな重み,一番遠いLargeIntegerが一番小さな重みになります. 次にそれらの特徴情報を検索クエリとしてサーバに送信します. サーバでは検索クエリを受け取り,索引を使ってLSIの手法に従って部品の検索を行います. そして,検索の結果このようにBigIntegerをはじめとした類似部品の一覧が得られ,開発者に提示されます. 検索クエリ 検索クエリ生成部 部品検索部 索引作成部 (LargeInteger, 0.5), (int[] data, 0.6), (add, 0.8), (sub, 0.9) 重み 特徴情報 索引 事前に構築 部品の提示 部品提示部 部品一覧 赤色が本研究で実装した部分
スクリーンショット(自動検索) エディタ 部品一覧 本システムの画面はこのようになっています. 本システムは統合開発環境であるEclipseのプラグインとして動作するので, 開発時には透過的に使うことができます. 先ほどのシナリオのように,エディタでソースコードを編集していくと, 下の画面に再利用可能な部品の一覧が表示されます. 部品一覧
スクリーンショット(ソース表示) 部品のソースコードが表示される 見たい部品をダブルクリックすると… 中身を見たい部品があった場合は,一覧から部品をダブルクリックすると, このように部品のソースコードを見ることができるようになっています. 見たい部品をダブルクリックすると…
スクリーンショット(インポート) 部品がプロジェクトにインポートされる 右クリックして「インポート」を選ぶと… この部品をプロジェクトで使いたい場合は,一覧で部品を右クリックしてインポートを選ぶと, このようにプロジェクトにインポートされます. 右クリックして「インポート」を選ぶと…
実装状況 部品検索部,部品提示部 検索クエリ生成部,索引作成部 実装済 ドキュメントコメントを利用する部分のみ実装済 他の特徴情報を利用する部分は現在実装中 システムの現在の実装状況としては,ドキュメントコメントを利用する部分の実装が完了しており, 特徴情報としてドキュメントコメントのみを用いた検索ができる状態になっています. 現在,他の特徴情報も利用できるように実装をすすめているところです.
まとめと今後の課題 ソフトウェア部品の自動検索システムを開発 今後の課題 コーディングスタイルに依存しない 多くの場面で利用できる メソッドの中身を書いているとき クラスの定義を書いているとき 今後の課題 未実装部分の実装 大量の部品群を対象とした適用実験 検索時間(応答性) 検索精度 では,まとめに入ります. 本研究では,従来研究であるCodeBrokerと比べて, コーディングスタイルに依存せず,より多くの場面で利用できる ソフトウェア部品の自動検索システムを開発しています. 今後の課題としては,未実装部分の実装を進めること, 大量の部品群を対象とした,応答性や検索精度を評価するための適用実験を考えています.
部品に関する知識 GUI部品の これを検索したい 検索するときに必要な知識 「これ」では検索できない 「GUI部品」では検索が困難 「ボタン」という名前が必要
より多くの情報を利用 同じパッケージ内の他のソースコード 統合開発環境によって得られる情報 プロジェクト内の他のソースコード 編集中のソースコードの直前に編集していたソースコード 関連がある可能性が高い 編集履歴
SPARSを用いる理由 本研究室で開発されている 自動検索のため頻繁にクエリを投げるので LAN内にサーバを置きたい
Component Rank 法 部品検索システムSPARSの手法 部品の重要度を評価する手法 重要な部品を優先的に提示することが可能 多くの部品から利用されている部品は重要 重要な部品から利用されている部品は重要 重要な部品を優先的に提示することが可能
編集の区切り ある程度の編集が完了したことを表す 種類 一文字編集するごとに検索すると効率が悪いため 入力による カーソル移動による セミコロン「;」の入力 中括弧「{」「}」の入力 コメント記号「/*」「*/」の入力 カーソル移動による ある文を編集後,カーソルが別の文に移動 コメントを編集後,カーソルがコメント外に移動