情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

ソースコードコーパスを利用した
シームレスなソースコード再利用手法
山本 哲男1,a)

吉田 則裕2,b)

肥後 芳樹3,c)

受付日 2011年6月14日, 採録日 2011年11月7日

概要：効率的にソフトウェアを開発するための手段として再利用が注目されている．しかし，再利用に必要な作業（コピーアンドペーストを行う際にコピー元のファイルを探して開く，キーワードを用いてソースコードを検索する際にキーワードを考えるなど）自体にコストがかかってしまう．本稿では，そのような再利用にともなうコストを極力排除した，シームレスな再利用支援手法を提案する．提案手法では，再利用を行う際にユーザは再利用のトリガを入力するだけで，現在開発しているコンテキストで再利用可能
なソースコードの候補が提示される．また，本稿では，提案手法を Eclipse プラグインとして実装して行った適用実験についても述べる．
キーワード：ソースコード再利用，統合開発環境，コーパス

Seamless Souce Code Reuse Using Source Code Corpus
Tetsuo Yamamoto1,a)Norihiro Yoshida2,b)

Yoshiki Higo3,c)Received: June 14, 2011, Accepted: November 7, 2011

Abstract: Software reuse is attracting much attention as a key technique for eﬃcient software development.
However, reuse itself requires human resources: for example, searching and opening source ﬁles including codesnippets that users want to reuse, or considering keywords matching code snippets for reuse. The present
paper proposes a novel method that hardly requires such reuse cost. In the proposed method, all users have to
do for getting reusable code snippets is just inputting a trigger key on their development environments. Also,
this paper describes some applications on open source software with a prototype tool working on Eclipse.
Keywords: source code reuse, IDE, corpus

1. はじめに効率的なソフトウェア開発を実現するための方法として再利用が注目されており，これまでにさまざまな再利用支ストである．コピーアンドペーストを行うことによって実現したい機能を瞬時に実装することができる．しかし，開発者はコピー元のコードを探すための作業が必要となるな
ど，効率的に再利用が行われているとはいえない．

援手法やツールが開発されている．開発者が最も頻繁にこのような問題を解決するために，キーワードによるソー（手軽に）行う再利用は，既存コードのコピーアンドペー

スコード片検索システムが開発されている [1], [3], [4], [10]．
実装したい機能を表すキーワードを開発者がシステムに

1
2

3
a)
b)
c)

日本大学
Nihon University, Koriyama, Fukushima 963–8642, Japan
奈良先端科学技術大学院大学
Nara Institute of Science and Technology, Ikoma, Nara 630–
0192, Japan
大阪大学
Osaka University, Suita, Osaka 565–0871, Japantetsuo@cs.ce.nihon-u.ac.jp
yoshida@is.naist.jp
higo@ist.osaka-u.ac.jp

c 2012 Information Processing Society of Japan

入力すると，システムに登録されているソースコードのうち，入力されたキーワードと関連しているソースコードが表示される．このようなシステムを用いることにより，開発者は再利用元のソースコードを探す手間がなくなる．また，コピーアンドペーストにおいて再利用元のソースコー
ドは自分自身が過去に書いたソースコードであることが多いが，このようなシステムを用いることによって不特定多644

情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

数のソースコードを再利用対象とすることができる．

どに影響されることなく，再利用を行うことができる．

また，Ye らは CodeBroker というシステムを開発してい• 提案システムを Eclipse プラグインとして実装した．

る [11]．CodeBroker は Emacs エディタのプラグインとしEclipse は現在広く使われている無償の統合開発環境て実装されており，開発者が Javadoc コメントを記述する

であり，Eclipse と連携することにより，提案手法を多と，それと関連するソースコードを提示する．キーワード

くの人に利用してもらうことができる．

検索システムとは違い，開発者は開発作業を中断すること

以降本稿は，2 章で提案手法を紹介し，3 章では実装しなく，必要に応じて再利用を行うことができる．しかし，た Eclipse プラグインを用いて行った実験について述べる．

ソースコード中の単語をもとに関連するソースコードを特4 章では，関連研究について触れ，最後に 5 章で本稿をま定するため，コメントの質に検索結果が大きく影響を受け

とめる．

てしまい，再利用可能なソースコードが存在しているのにそれを正しく提示できない場合がある．

2. 提案手法

さらに，再利用するソースコードの質も重要な課題であ

本章では，ソースコードの再利用を支援するための手法

る．近年，Google サジェストや日本語入力のように，世について説明する．全体の概要を図 1 に示す．図に示すよの中の人が作成・利用した情報を集めて解析し，推薦する

うに，本手法は 2 つの仕組みから構成される．1 つは再利仕組みが多く存在する．これらは，人々の集合知を利用す

用のもととなるソースコードを解析し，ソースコードコー

ることで，開発者の求めているものを推薦する仕組みであパスとよぶデータベースに保存する処理（コーパス作成）

る．この仕組みは，開発者と同じドメインを対象にして解である．もう 1 つは，ソースコードコーパスに保存された析することで，精度が向上する可能性がある．ソースコー

ソースコードを統合開発環境に提示するための処理（コードも同様な考えに基づいて推薦することで，推薦精度が上

パス利用）である．コーパス作成とコーパス利用はそれぞがるのではないかと考える．つまり，世の中の人に多く利れ別の処理として考えることができ，独立して実行できる．

用されているソースコードが再利用するのに適したソース

コーパス作成処理では，過去に作成したソフトウェアか

コードではないかと考える．ある開発者と同じドメインのら，ソースコードの用例を作成する．本手法の用例はソー

ソフトウェアを開発しているオープンソースの開発者が作

スコード中の名前の付けられた一塊のソースコード片を成したソースコードへ集合知の考えを適用することで，有対象にする．C 言語の関数，Java 言語でのメソッドなど能な開発者が作成した「知」を収集・利用でき，開発の生が対象となり，本研究では，それらを再利用コード片とよ

産性向上につながる．

ぶ．ソースコードのどの構文を再利用コード片にするかは

本稿では，上述した既存研究の問題点を解決し，大規模ソースコードに記述されたプログラミング言語の種類になソースコードの中から適切なコード片を推薦する再利用

よって変えられるものとする．再利用コード片内のソース

支援手法を提案する．具体的には，本研究の特徴は以下のコードを任意の場所で 2 分割し，前方に記述されたソース

とおりである．

コード片と後方に記述されたソースコード片のペアを作成• 再利用元コードを検索するキーとなるのは，現在開発

し，データベースへ保存しておく．多くのソフトウェアに者が書きかけのコードである．開発者は再利用のため

対してペアを作成することで，ペアの出現頻度を計算し，に検索を行うキーワードを考える必要がない．そのた

データベースへ保存しておく．このデータベースを本研究め，非常に単純な操作をするだけで，書きかけのソー

ではソースコードコーパスとよぶ（以降，単にコーパスとスコードの後に続くものとして最適なソースコードよぶ）．

を取得できる．特別な入力を必要としないため，キー

コーパス利用処理は，実際に開発者が開発する際に利用

ワード検索システムを利用する場合に比べてコーディする部分であり，開発者が統合開発環境からソースコード

ングを中断する時間が短くなる．

の再利用を要求するたびに利用される．統合開発環境で書• ソースコードの検索は，コードの構文に基づいて行わいている途中のソースコードをコーパスに問い合わせ，書れるため，実行に影響を与えないコメントや変数名な

きかけのソースコードの後に続くソースコードとしてどの

図 1 提案手法概要

Fig. 1 The outline of proposed method.

c 2012 Information Processing Society of Japan


645

情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

ようなものが過去のソフトウェアの中で確率が高かったかするなどの処理である．この変換後の文字列をトークを提示する．

ン文字列とよぶ．

以降，提案手法の詳細とその実装について記述する．

( 2 ) トークン文字列をソースコードの出現順に並べる．
( 3 ) ( 2 ) で並べたトークン文字列の並びを 2 分割する．2

2.1 コーパス作成手法

分割する箇所はすべてのトークン文字列とトークン文

コーパス作成手法は，ソースコード解析手法と頻度計算

字列の間とする．ただし，2 分割した文字列は 1 個以手法に分けることができる．ソースコード解析手法では上のトークン文字列を含むものとする．n 個のトーク

ソースコードを解析し，コーパスへ保存できる形式に変換

ン文字列の並びがあると，n − 1 個の分割箇所を持つ．

する方法であり，実際の登録作業は行わない．頻度計算手

分割した前半のトークン文字列の並びをキー文字列と法では，ソースコード解析結果を検索しやすいように並べ

よび，後半のトークン文字列の並びをバリュー文字列

替え，実際にコーパスへ保存するための方法である．

とよぶ．

ソースコード解析手法は，各ソースコードを以下の手順( 4 ) キー文字列とバリュー文字列のペアを生成する．n 個で解析する．手法の流れを図 2 に示す．

のトークン文字列の並びが存在する場合は，n − 1 個( 1 ) ソースコードを字句解析および構文解析し，再利用のペアが生成される．図 3 にその処理の流れを示す．

コード片を抽出する．

次に，生成したペアをコーパスに登録する必要がある．

( 2 ) 抽出した各再利用コード片に対してトークンの分割処

同じキー文字列に対して，複数のバリュー文字列が存在しうる．さらに，キー文字列とバリュー文字列が両方とも同理をする．
トークンの分割処理の手順は以下のとおりである．

じペアがすでにコーパスに保存されている可能性もある．

( 1 ) 再利用コード片開始から終わりまでに含まれるすべて

そのため，キー文字列とバリュー文字列と頻度という三つのトークンに対して，それを表す文字列に変換する．

組にしてコーパスへ登録する．頻度として，これまでに解

通常は，ソースコード中に現れる文字列をそのまま析したソースコードの中で同じキー文字列とバリュー文字利用する．ただし，言語に依存する処理として，変換列のペアが出現した数を保存する．

ルールを別途定義して別の文字列へ変換することを可そこで，キー文字列とバリュー文字列のペアを登録する能にする．たとえば，変数名を表すトークンをそのま際には，以下の頻度計算手法に従い登録する．

ま変数名として用いるのではなく，その変数の型を表( 1 ) すでにデータベースに，そのペアが存在しているか確

す文字列に変換する，よく用いる定型的な構文を消去

図 2

認する．

ソースコード解析手法概要

Fig. 2 The outline of source code analysis.

図 3 キー文字列・バリュー文字列分割手法

Fig. 3 Key strings and value strings separation method.

c 2012 Information Processing Society of Japan

646

情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

表 1( 2 ) なければ，頻度を 1 にした三つ組を生成し，( 4 ) へ．

Table 1 Transformation rule.

( 3 ) すでに存在していれば，コーパス中の三つ組頻度の値
を 1 つ増やす．

( 4 ) 頻度の多い順に取得できるように，同じキー文字列の三つ組をまとめておき，頻度順に並べ替えをして保存しておく．
コーパス検索時に，短時間で検索を終了させるたに，登録時には頻度の値を変更するたびに，並べ替えをしておく．

トークンの変換ルール

トークンの種類

変換処理

型名

クラス名に変換

変数名

クラス名に変換

リテラル

クラス名に変換

コメント

トークンを生成しない“.”（メソッド呼び出し式で利用） トークンを生成しない
上記以外のトークン

そのまま

また，キー文字列とバリュー文字列をソースコードに復元するために，ソースコード解析手法の ( 1 ) が終了した直る “.” はトークン文字列に含めない．さらに，ブロッ後のトークン列をソースコードのトークン列として保存しクを表す “{” と “}” を省略している箇所においては自ておく．

動的に挿入する．

• if (expression == null) {statements} 文を削除
2.2 コーパス利用手法
統合開発環境で書きかけのソースコード片を入力として，そのソースコード片に対応した残りソースコード片を頻度の多い順に出力する方法について説明する．
統合開発環境中で入力されたソースコードを監視し，書する．ただし，expression は任意の式とし，statements
は 1 文以上の任意の文とする．

• if (expression1) {return expression2;} 文を削除する．ただし，expression1 と expression2 は任意の式とする．

きかけのソースコードをつねにキー文字列に変換する．変

• if (expression1) {throw expression2;} 文 を 削

換手法はソースコード解析手法と同様に，字句解析・構文除する．ただし，expression1 と expression2 は任意

解析・変換ルールを適用することで取得する．

の式とする．

取得したキー文字列をコーパスに問い合わせ，キー文字• メソッドの先頭から始まる連続する変数宣言文をまと列を含む三つ組を取得する．複数存在する場合は，頻度順

める．トークン変換ルール適用後，型名と変数名はクに並べ替えられたものが取得できる．取得した三つ組からラス名に置き換わる．変数初期化部分が存在すると右バリュー文字列を取得し，ソースコードに逆変換する．逆辺に式が並ぶが，この右辺をすべて削除する．さらに，変換するためにコーパス作成時に保存したソースコードの

それらの宣言文の並びをトークンの出現順ではなく，トークン列を利用する．逆変換したソースコードを頻度順

アルファベット順に並べ替える．

に開発者に提示する．

実際の Java のソースコードを例としてソースコード解
析手法を説明する．図 4 (a) の Java ソースコードを取得し2.3 実装たとする．このメソッド printFile 内のトークンをソー

本手法の対象ソースコードを Java 言語としてソースコー

スコード解析手法に従って変換したトークン文字列の並び

ド解析手法，頻度計算手法，コーパス利用手法を実装しを図 4 (b) に示す．トークン文字列は紙面の都合上改行でた．実装にあたり，以下の変換ルールを採用した．オープ

区切っているが，一続きの並びである．

ンソースのソースコードを調査した結果，メソッド冒頭に

型名はその型のクラス名に変換する．型名が完全限定

エラー処理や例外処理の記述があるソースコードが多く存

名で記述されていてもクラス名のみに変換する．たとえ在することが分かった．そのため，検索精度を向上させる

ば，java.io.File とソースコード中に記述されていてもために，例外処理やエラー処理を事前に削除することとしFile と変換する．変数名に関しても同様に，その変数名た．メソッド開始直後に引数の値をチェックするコードがが宣言された型のクラス名に変換する．それぞれ，完全限存在すると，キー文字列にも同様のコードを含める必要が定名を特定し変換することも考えられるが，クラス名が特生じるためである．さらに，エラー処理のあるソースコー

定できれば十分であると判断し，解析コストとのトレードとないソースコードを同様のソースコードと見なすことドオフを考え，クラス名だけにした．また，while 文の後で，それらのソースコードから作成された三つ組の頻度がの System.out.println の前後に自動的に “{}” を補う．

増すため，検索結果が向上することが期待できる．

“{}” のあり・なしを，ありに統一させることで，キー文字• ソースコード解析手法で抽出する再利用コード片をクラスのメソッドとした．

• トークンを変換するルールを表 1 のとおりにした．型
名および変数名を表すトークンをクラス名に変換す
る．コメントは無視し，メソッド呼び出し文で利用す

c 2012 Information Processing Society of Japan

列の一致精度を上げる．
本手法を実装したツールについて説明する．シームレスに利用するために，統合開発環境から利用する際の待ち時間を減らす工夫や使い勝手を高める工夫をしている．
統合開発環境には Eclipse を用いており，ソースコー

647

Vol.53 No.2 644–652 (Feb. 2012)

情報処理学会論文誌

表 2public class Sample1 {
private int x;
private int y;

対象ソフトウェア

Table 2 Target software.

/*** ファイルの内容を標準出力へ書き出す*/
public void printFile(String filename) {if (filename == null) { return; }File file = new File(filename);try {FileInputStream is = new
FileInputStream(file);
InputStreamReader sr = new
InputStreamReader(is);BufferedReader br = new BufferedReader(sr);
String str;// ファイルの終わりまで読み取る
while ((msg = br.readLine()) != null)
System.out.println(str);
br.close();sr.close();is.close();} catch(Exception e) {e.printStackTrace();}}}

ソフトウェア

ファイル数

行数

829

212,401

JDK 1.6.0

7,154

2,071,178

Apache Project

51,777

9,669,445

Ant 1.8.1

ることで，キー文字列によるバリュー文字列の取得時間を短くするする工夫をしている．
コーパス利用時にキー文字列やバリュー文字列からソースコードを復元する必要がある．そのため，コーパス登録
時にソースコードのトークン列もデータベースに保存しておく．変換ルールを適用する前のトークン列であるため，

Java のメソッド内のすべてのトークン列となる．さらに，バリュー文字列のハッシュ値から実際のソースコードへ復元できるように，トークン列を保存しているデータベース
への参照もあわせて記録しておく．

(a) Java ソースコード
File

File

try

{

コーパス利用手法を Eclipse プラグインとして実装した．
開発者が Eclipse のエディタ上でソースコードを記述中に，

FileInputStream

FileInputStream

FileInputStream

(

File

)

=

InputStreamReader=

InputStreamReader()

FileInputStream

BuﬀeredReader

BuﬀeredReader

BuﬀeredReader

(

while

StringreadLine()

System

out

)

=

)

!=

null

;

の候補がふさわしいか選択してもらい，確定したソース

String

close

(

)

InputStreamReader

close

close

Exception

(

)

;

}

;
(

)

)

;

(

トークン列をデータベースから取得し，整形ツールを利用して貼り付ける．頻度が複数の場合，どのソースコードのトークン列を復元するかを，あらかじめ決めておく．本稿;の実装では，変換ルールにおいて削除された文が最も多い

Exception

printStackTrace

スコードを復元するために，ハッシュ値に対応づけている

{

)

(

FileInputStream

るのみであるので，高速に処理が終わる．
検索結果を Eclipse のエディタ上へ表示し，開発者にどnewBuﬀerdReader

printlnBuﬀerdReader

Exception;ているレコードからキーに完全一致したレコードを検索す

コードをエディタ上へ貼り付ける．貼り付け処理時にソーString

(

new

;

(

catch

=

InputStreamReader(}

してコーパスへ候補を問い合わせる．コーパスに保存され;InputStreamReader

String開発者のトリガによって書きかけのソースコードをキーと

new

)

)

{

;

}

ソースコードを復元することとした．これは，エラー処理
や例外処理などが付与されたソースコードを復元することを意図している．

(b) トークン文字列
図 4 ソースコードからトークン文字列への変換

Fig. 4 Conversion source code into token strings.

ド解析ツールに MASU [9] *1 を用いている．コーパスにはBerkleyDB *2 を用いている．コーパス登録時にはトークン

3. 評価
提案手法を評価するために実験を行った．本章では，実用的な速度で実現可能かを検証するためのパフォーマンス
評価について記述し，その後，本手法の有効性の評価について述べる．

文字列をそのまま登録するのではなく，MD5 などのハッシュ関数を利用して，文字列をハッシュ値に変換して登録する．Eclipse からの検索時には，書きかけのソースコー
ド片を解析し，トークン文字列に変換後，さらにハッシュ関数によりハッシュ値にした値をキーにしてコーパスを検索している．データベースにキーバリューストアを採用す*1*2

http://sourceforge.net/project/masu/
http://www.oracle.com/technetwork/database/berkleydb/
overview/index.html

c 2012 Information Processing Society of Japan

3.1 データベースのパフォーマンス評価
本節では，データベースに構築や利用に要した時間や構築したデータベースのサイズについて調査した．この調査
では，規模の異なる 3 つのソフトウェア（群）に対してデー
タベースを構築した．各ソフトウェアの規模を表 2 に示す．なお，Apache Project とは，http://www.apache.org/
で公開されているソフトウェア群を表す．

648

情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

表 3 データベース構築時間とサイズ

Table 3 Time of building database and database size.
ソフトウェア

構築時間

サイズ

Ant 1.8.1

3分7秒

493 MB

53 分 41 秒

4.13 GB

12 時間 50 分 21 秒

28.2 GBJDK 1.6.0
Apache Project

表 3 は，各ソフトウェアについて，データベース構築に要した時間と構築したデータベースのサイズを表している．構築時間はソフトウェアの規模に比例して長くなっていることが分かる．特に，Apache Project では，約 13 時間と非常に長い時間を必要とした．しかし，すべてのソー
スコードの登録処理は，利用開始時の 1 度だけ行えばよく，利用開始後は更新されたファイルについてのみ，デー
タベースも更新をすればよい．このため，利用に関して特に問題とはならないと著者らは考えている．

/*** find a file in a directory in case unsensitiveway* @param parentPath where we are* @param soughtPathElement what is being sought* @return the first file found or null if not
found*/private String findPathElementCaseUnsensitive(
String parentPath,
String soughtPathElement) {// we are already in the right path, so thesecond parameter// is false
FTPFile[] theFiles = listFiles(parentPath,false);
if (theFiles == null) {return null;}for (int icounter = 0; icounter < theFiles.
length; icounter++){if (theFiles[icounter] != null &&theFiles[icounter].getName().
equalsIgnoreCase(soughtPathElement)){
return theFiles[icounter].getName();}}return null;}

また，データベースサイズもソフトウェアのサイズに比例して大きくなっていることが分かる．しかし Apache

Project からデータベースを構築した場合でも，たかだか

図 5

FTP を介してファイル検索を行うソースコード（Ant 1.8.1）

Fig. 5 Source code for file retrieval via FTP (Ant 1.8.1).

28 GB であり，この程度の大きさであれば，現在の PC であれば問題なく収容することができる．

手順 B

Eclipse の Java 開発環境のソースコードエディ

JDK 1.6.0 のデータベースを用いて，データベース利用

タ に お い て ，図 5 で あ げ た メ ソ ッ ド 本 体 の 冒 頭時に要した時間を測定した．ランダムに選んだキー文字列（FTPFile[] theFiles = listFiles(parentPath,を用いて検索結果の上位 10 件を取得するのに必要な時間

false);）を入力．

は，すべて 500 ミリ秒以下となった．注意すべきことは，

手順 C 上述のソースコードエディタ上からコンテンツア

キー文字列はハッシュ値に変換されるため，キー文字列のシスト機能を呼び出すことで，補完候補を要求．

トークン数は取得時間に影響しないことである．測定時間

手順 C までを行うと，提案する Eclipse プラグインは入には Eclipse 上に候補の表示をする時間は含まれておらず，力したメソッドの冒頭を取得し，それをキー文字列としてキー文字列からバリュー文字列を取得するまでの時間でデータベースに渡す．次にデータベースは渡されたキー文ある．

字列に対応するバリュー文字列を返し，最後に提案する

本稿での実装ではデータベースのキー文字列をあらかじ
め並べ替えして保存しているため，利用時の時間に関して

Eclipse プラグインはそのバリュー文字列を補完候補として開発者に提示する．

は，データベースのサイズに比例して時間がかかる処理で

上 述 の 手 順 で ，メ ソ ッ ド 本 体 の 冒 頭（FTPFile[]

はない．データベースを利用する際，単純な問合せのみで

theFiles = listFiles(parentPath, false);）を入力

すませることでキーバリューストア型データベースの利点

し補完候補を要求したところ，メソッド本体の全体が補完をいかすことができ，データのサイズが大きくなったとし候補として提示された．

ても，現在の PC であれば問題なく利用できると考える．

この結果から，図 5 にあげたメソッドを知らない開発者からみて，提案手法が行う補完候補の推薦は有効であると

3.2 適用例考えられる．

提案手法を Ant 1.8.1 *3 に適用した例について説明する．Ant の FTP クラスと FTPTaskMirrorImpl クラスには，

3.3 有効性の評価

FTP を介してファイル検索を行うメソッドが含まれてい提案手法の有効性を評価する実験を行った．トークン数

る（図 5）．これらメソッドは，コメントも含め完全に一致が少ない場合は大量の候補が表示され，開発者が想定してしていた．

いるソースコードと無関係なものまで表示される可能性が以下の手順で，提案手法の適用を行った．
手順 A

2 章で述べたソースコード解析と頻度計算を Ant

1.8.1 のソースコードへ適用．
*3

http://ant.apache.org/

c 2012 Information Processing Society of Japan

ある．そのため，開発者がどの程度のトークンを入力した段階で適切なソースコードが表示されるか評価する．
利用場面は，開発者もしくは同一組織内で過去に記述されたソースコードを対象として，再利用する場合を想定

649

情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

表 4 再利用事例数

表 5

Table 4 The number of reuse instances.
クローン率

再利用事例数90%以上

32

80%以上 90%未満

90

70%以上 80%未満

211

適合率と再現率

Table 5 Precision and recall.
適合率

XXX

閾値
XX
90%以上
XXX
XX
X

トークン数

80%–90%70%–80%

30

0.888

0.274

0.203

40

0.842

0.128

0.038

50

0.856

0.085

0.026

している．そこで，ソースコードが公開されているソフト

60

0.8

0.092

0.025

ウェアの中から異なるバージョンで似ているメソッド（再

70

0.867

0.133

0.02

利用の事例とよぶ）を探しだし，バージョンの新しいメ

80

1

0.267

0.08

90

1

0

0.182

100

1

0

0

80%–90%70%–80%

ソッドを本手法を実装した Eclipse 上に入力していき候補が表示されるか実験した．具体的には，オープンソースソ
フトウェア Ant からメソッドのソースコードが再利用された事例を収集した．Ant 1.1 から 1.8.2 までの 23 リリース
バージョンの中で，直前のリリースバージョンに含まれる

再現率

XXX

閾値
XX
90%以上
XXX
XX
X

トークン数

30

0.781

0.589

0.464

メソッドとクローン率が閾値以上のメソッドを抽出し，再

40

0.781

0.211

0.052

利用の事例とした．

50

0.781

0.111

0.024

3.3.1 再利用事例の抽出方法

60

0.5

0.033

0.005

リリースバージョン Vn に含まれるメソッド ma と直前

70

0.313

0.022

0.005

のリリースバージョン Vn−1 に含まれるメソッド mb のク

80

0.094

0.022

0.005

90

0.063

0

0.005

100

0.063

0

0

ローン率が閾値以上であった場合，Vn−1 に含まれるメソッ
ド mb を再利用して，Vn に含まれるメソッド ma が作成されたとする．また，このとき ma と mb は再利用関係を持つとする．この ma と mb のペアを再利用事例とよぶ．

した値．

再利用事例クローン率は，(メソッド ma とメソッド

再現率 1 つの事例集に含まれる各再利用事例から検索ク

mb 間でクローンになっているトークン数の和)/(メソッエリを作成・入力し，正答メソッド（検索クエリを含

ド ma とメソッド mb のトークン数の和) で計算される．

むメソッドと再利用関係を持つメソッド）の中の，提CCFinder [8] を最小一致トークン数 30 に設定し検出した．

示メソッド（提示された補完候補）の割合を求め，平

ただし，ma もしくは mb が 100 トークン未満の再利用事

均した値．

例は取り除いた．
表 4 にクローン率と再利用事例の検出数を示す．クロー

結果を表 5 に示す．トークン数とはエディタ上に入力した先頭のトークンの数を表し，閾値は再利用事例のどの種ン率によって 3 種類の分類に分け，事例数を調査した．そ類かを表している．

の結果，クローン率が 90%以上一致する再利用事例は 32

3.3.3 考察個存在した．以下，80%以上 90%未満の場合は 90 存在し，適合率，再現率ともにクローン率が 90%以上の事例集を70%以上 80%未満は 211 と最も多くの再利用事例が存在し入力とした場合が最も高く，70%以上 80%未満のクローン

た．各分類のそれぞれを事例集とよぶ．

率の場合が最も低かったため，メソッド間クローン率が高3.3.2 検出結果

い事例に対して本手法は有効である．メソッド間クローン

検出した再利用事例の ma の冒頭を検索クエリとして率が低い事例に対する適合率・再現率を向上させるために

Eclipse の Java エディタ上に入力した．そして，直前のリトークン列ではなく構文木やプログラム依存グラフなど抽

リースバージョン Vn−1 に含まれるメソッド mb を効率的

象度の高いプログラム表現に基づいて補完候補を検出するに提示できるかを適合率および再現率で評価した．検索ク方法が考えられる．しかし，これらの手法を用いるとソー

エリは，先頭から 30，40，50，60，70，80，90，100 トー

スコードを解析する際の空間コストや解析結果を利用する

クンの 8 通りを作成し入力した．適合率および再現率の定際の時間コストが本手法に比べ大きくなる．本研究では，

義は以下のとおりである．

低コストで，かつ開発者に特別な入力を必要としない手法

適合率 1 つの事例集に含まれる各再利用事例から検索クで有効な再利用を目指している．

エリを作成・入力し，提示メソッド（提示された補完

検索クエリのトークン数を増加させると適合率が上昇

候補）の中の正答メソッド（検索クエリを含むメソッ

し，再現率および F 値が低下したため，適合率と再現率のドと再利用関係を持つメソッド）の割合を求め，平均バランスを重視する場合は，先頭から 30 トークンを入力

c 2012 Information Processing Society of Japan

650

情報処理学会論文誌

Vol.53 No.2 644–652 (Feb. 2012)

後，補完候補を求めるべきと考える．今回の実験は高いク

研究では，入力されたコード片の補完することを目的としローン率に基づく実験のため，同一人物や同一組織が過去ているため，入力されたコード片をトークン列に変換し，に作成したソースコードをもとに再利用する場面を想定しそのトークン列をクエリとして検索を行う．

ている．同じようなロジックのソースコードを開発者が記

このほかにも，ソースコードを収集し，その中から開発述する際に，先頭から 30 トークン入力すれば残りのソー者からの要求に応じたものを提示するシステムの研究はスコードが補完できることを示している．

数多く行われている [2], [4], [7], [10]．公開されているもの

適合率を向上させるためには，検索クエリ中と補完候補としては，Google ソースコード検索 [4] や SPARS-J [10]，間で呼び出しているメソッドが一致しているかどうかな

Koders [1] などのソースコード検索エンジンがあげられる．

ど，意味解析の結果の類似性を補完候補の検出に用いる方

これらは，開発者が考案したキーワードをクエリとして検法があげられる．また，複雑度などのメトリクス値の類似索を行うシステムであり，本研究のようにシームレスに補性を用いる方法も併用することで向上すると考える．

完候補を検索するためのシステムとは異なる．また，API

本実験では，メソッド単位の補完を行う実験のみを行っの使用方法の理解支援を目的として，API の使用を含む

たため，より小さいブロック単位の補完を行った場合は，コード片を検索する手法 [6] が提案されている．この手法

性能が異なる可能性がある．しかし，メソッド単位でなけは，クエリとして与えられた API の使用例を示すコード片

れば抽出できない情報は用いていないため，同規模のブを提示することを目的としており，提案手法とはクエリのロックや再利用事例が対象である場合，大きな性能差はな

内容や提示する内容が異なる．

いと考える．
本実験では，コードクローン検出ツール CCFinder を利

5. おわりに用して計測したメソッド間クローン率に基づいて，7 割以

本稿では，開発者が開発作業を中断することなく，必要上のトークンを再利用した事例を収集した．そのため，他に応じてソースコードの再利用を行うことができる手法をのコードクローン検出ツールを用いる，もしくはコピーア提案した．再利用元コードを検索するキーとなるのは，現ンドペーストの履歴を用いて再利用事例を収集した場合，在開発者が書きかけのソースコードである．さらに，提案異なる実験結果になる可能性がある．

手法を Eclipse プラグインとして実装したツールを用いて

4. 関連研究

実現可能性を考察した．その結果，現在の PC であれば問題なく利用可能であることを示した．

本研究と同様にメソッドの補完を行う手法として，Hill

今後は，トークン文字列の変換ルールやキー文字列とバらの手法 [5] があげられる．この手法は，メソッドを行数

リュー文字列の区切り方に関する実験，キー文字列の完全や複雑度などを要素とする特徴ベクトルで表現し，入力さ一致以外の方法について考える．さらに，コーパス利用時

れたメソッドの近傍に存在し，かつ入力されたメソッドよに表示するバリュー文字列のランキングは出現回数順だ

り行数の大きいメソッドを補完候補として提示する．Hill

が，そのほかの要素を加えるべきかについて考える予定でらの手法は，入力されたメソッドと類似し，かつ少し行数ある．

の大きいメソッドを補完候補として提示することが目的で謝辞

本研究は一部，日本学術振興会科学研究費補助ある．そのため，提案手法が目的としているメソッドの冒

金研究活動スタート支援（課題番号：22800040）の助成を頭を入力としたメソッド全体の補完には適していない．提得た．

案手法は，メソッドの冒頭のコード片をキーとし，冒頭以後の部分をコード片を値とするデータベースを構築するこ

参考文献とによって，メソッドの冒頭を入力としたメソッド全体の[1]補完を実現している．また，提案手法は入力されたコード
片のトークン列をクエリ（検索質問）として検索を行うた[2]

め，入力されたコード片のロジックの補完に適している．

Hill らの手法は，入力されたメソッドを特徴ベクトルに変[3]換し，その特徴ベクトルをクエリとして検索を行う．その[4]

ため，クエリから構文の順序に関する情報が欠落しており，ロジックの補完には適していない．
本研究と同様に，シームレスなソースコード再利用を支援する手法として，CodeBroker [11] や A-SCORE [12] があげられる．これらは，開発者の入力から自動的に抽出した

[5]
[6]

Black Duck Software, Inc.: Koders, available fromhttp://www.koders.com/.
Chatterjee, S., Juvekar, S. and Sen, K.: SNIFF: A SearchEngine for Java Using Free-Form Queries, Proc. FASE
2009, pp.385–400 (2009).
Codase Inc.: Codase, available fromhttp://www.codase.com/.
Google: Google Code Search, available fromhttp://www.google.com/codesearch.
Hill, R. and Rideout, J.: Automatic Method Completion,
Proc. ASE 2004, pp.228–235 (2004).
Holmes, R., Walker, R.J. and Murphy, G.C.: Approximate Structural Context Matching: An Approach to
Recommend Relevant Examples, IEEE Trans. Softw.
Eng., Vol.32, No.12, pp.952–970 (2006).

キーワードをクエリとしてソースコードの検索を行う．本

c 2012 Information Processing Society of Japan


651

情報処理学会論文誌

[7]

[8]

[9]

[10]
[11]

[12]

Vol.53 No.2 644–652 (Feb. 2012)

Inoue, K., Yokomori, R., Yamamoto, T., Matsushita,
M. and Kusumoto, S.: Ranking Signiﬁcance of Software Components Based on Use Relations, IEEE Trans.
Softw. Eng., Vol.31, No.3, pp.213–225 (2005).
Kamiya, T., Kusumoto, S. and Inoue, K.: CCFinder: A
multilinguistic token-based code clone detection system
for large scale source code, IEEE Trans. Softw. Eng.,
Vol.28, No.7, pp.654–670 (2002).
三宅達也，肥後芳樹，楠本真二，井上克郎：多言語対応メ
トリックス計測プラグイン開発基盤 MASU の開発，電子情報通信学会論文誌 D，Vol.J92-D, No.9, pp.1518–1531(2009).
The SPARS Project: SPARS-J, available fromhttp://demo.spars.info/.
Ye, Y., Fischer, G. and Reeves, B.: Integrating Active Information Delivery and Reuse Repository Systems, Proc.
SIGSOFT 2000/FSE-8, pp.60–68 (2000).
島田隆次，市井 誠，早瀬康裕，松下 誠，井上克郎：
開発中のソースコードに基づくソフトウェア部品の自動推薦システム A-SCORE，情報処理学会論文誌，Vol.50,
No.12, pp.3095–3107 (2009).

肥後 芳樹 （正会員）
平成 14 年大阪大学基礎工学部情報科学科中退．平成 18 年同大学大学院博士後期課程修了．平成 19 年同大学院
情報科学研究科コンピュータサイエン
ス専攻助教．博士（情報科学）．ソー
スコード分析，特にコードクローン分
析やリファクタリング支援に関する研究に従事．電子情報通信学会，日本ソフトウェア科学会，IEEE 各会員．

山本 哲男 （正会員）
平成 9 年大阪大学基礎工学部情報工学科卒業．平成 14 年同大学大学院博士後期課程修了．同年科学技術振興事業
団計算科学技術研究員．平成 16 年立命館大学情報理工学部情報システム学科講師．平成 20 年同学科准教授．平成 23 年日本大学工学部情報工学科准教授．博士（工学）．
ソフトウェア開発支援環境の研究に従事．電子情報通信学会，IEEE-CS 各会員．

吉田 則裕 （正会員）
平成 16 年九州工業大学情報工学部知能情報工学科卒業．平成 21 年大阪大学大学院情報科学研究科博士後期課
程修了．平成 22 年奈良先端科学技術
大学院大学情報科学研究科助教．博士（情報科学）．コードクローン分析手法
やリファクタリング支援手法に関する研究に従事．ソフト
ウェア科学会，電子情報通信学会，人工知能学会，IEEE，

ACM 各会員．

c 2012 Information Processing Society of Japan

652