78
推薦論文● FOSE

変数のデータフローによる API 利用コード例の検索
竹之内 啓太

石尾 隆

井上 克郎

ソフトウェア開発の効率を向上させるため，ライブラリなどの API (Application Programming Interface) が利用されている．一方で，巨大化・複雑化した API の利用は必ずしも容易ではない．そこで本研究では，API の理解を支援するコード検索手法を提案する．提案手法の特徴として，(1)「変数のデータフロー」を (独自の検索クエリを用いて) 指定し，API の理解に有益なコード例を検索する点，(2) 検索対象となるソースコードを既存のコード検索エンジンから取得することで，さまざまな API の検索に対応している点，(3) 有限オートマトンを利用した軽量なアルゴリズムを用いることでウェブアプリケーションとしての実装を実現している点が挙げられる．評価実験では，提案手法が API の理解を有効に支援する場合があることや，検索クエリの記述が比較的容易であること，検索時間が実用的な範囲に収まることを確認した．

To improve software productivity, software reuse with API (Application Programming Interface) such as
library is common. However, APIs are not always easy to use because some of them are too large or complicated. Code example search is a common approach against it. In this paper, we propose a novel code
example search method to help developers to understand how APIs should be used. Our approach has threefeatures. (1) Variable data-flow can be specified with our original query to show helpful code examples.
(2) Searching for various APIs is realized by downloading search targets on demand from the existing code
search engine. (3) It is implemented as a web application with a low-cost algorithm using finite automaton.
A result of an experiment shows that the proposal method helps API comprehension eﬀectively in somecases, our original query is relatively easy to write, and the search time is practical.

ら， API が巨大化・複雑化している場合は，その利1 はじめに用が困難となることが知られている [3] [4]．そのため，ソフトウェア開発において，ライブラリなどの API

コード例検索により実際に API を利用しているコー(Application Programming Interface) の利用は欠か

ド例を見つけ出し，それを見て学習することが一般的せないものとなっている [8]．API を利用することで，である．コード検索エンジンはウェブサービスとして第三者が過去に作成したソフトウェアを再利用する利用できるため導入の手間がいらず，検索結果を即座ことができ，開発効率の向上につながる．しかしながに取得できるため，広く利用されている [6]．
しかしながら， API に対する検索の要望は常にSearching for API Usage Examples Focusing on Variable Data-flow
Keita Takenouchi, Katsuro Inoue, 大阪大学大学院情報科学研究科, Graduate School of Information Scienceand Technology, Osaka University.
Takashi Ishio, 奈良先端科学技術大学院大学情報科学研究科, Graduate School of Information Science, Nara
Institute of Science and Technology.
コンピュータソフトウェア, Vol.29, No.1 (2012), pp.78–84.
[研究論文 (レター)] 2017 年 2 月 15 日受付.
本論文は第 23 回ソフトウェア工学の基礎ワークショップ(FOSE2016) の発表論文を発展させたものである．

1 つであるとは限らない．そのため，一般的なコー
ド検索エンジンで利用されている単語単位の検索では，要望を上手く表現することが容易ではない場合がある．たとえば，Java の標準ライブラリに含まれる Statement インターフェースの executeQuery メ
ソッドはデータベースを操作する SQL 文を実行するためのメソッドである．このメソッドの戻り値である ResultSet 型の変数から SQL 文の実行結果を取り出したい場合を想定する．一般的なコード検索エVol. 29 No. 1 Feb. 201279

戻り値が変数 rs に「代入」され，next, getString,ɨś  ʰŜ ſƀŚɩśſŜſƀƀƇɪś ʰŜſɩƀŚɫś ʰŜſɪƀŚɬś ʰſ ř ƀŚɭśŜſ ƀŚɮśƈɯśŜ ſƀŚclose とった SQL の実行結果を取り出すための一連のメソッド呼び出しに「使用」されていることが分かる．このような変数の代入から使用までの流れのことを本研究では「変数のデータフロー」と呼ぶ．そして，変数のデータフローを考慮することにより複数の

図1

提案手法の検索結果の例

API メソッドの関係を表現し検索することが本研究の目的である．本手法は，検索対象となるソースコーンジンを利用する場合， “executeQuery” というメドを既存のコード検索エンジンから取得することで，ソッド名で検索し，その戻り値に対する操作に関する幅広い検索の要望に対応している．また，検索クエリコードを閲覧することになる．しかし，メソッド名のの設計と検索のマッチングアルゴリズムを工夫し，検コメント行への出現や同名のメソッドの定義など，メ索の計算コストを抑えることで，応答性のよいウェブ

ソッド名を含んではいるが API の理解には有益でなアプリケーションとしての実装を実現している．

いコードも検索結果として提示されてしまう．

以降，2 章では提案手法の概要について，3 章ではそこで本研究では，開発者にとって有益なコード例そのアルゴリズムについて述べる．4 章では評価実験を適切に提示する手法を考案した．具体的には，独について述べ，最後に 5 章ではまとめと今後の展望

自の検索クエリを利用することで「変数のデータフについて述べる．

ロー」を表現し検索するという方式を提案する．この検索クエリは基本的には検索対象のプログラミング

2 提案手法の概要

言語のトークンの列であるが，3 つの特殊な意味を持

本研究では， API の利用方法の理解を支援するたつワイルドカードを導入することで検索に柔軟性をめ，変数のデータフローを考慮したコード例検索手法持たせている．先に挙げた executeQuery メソッドを提案する．一部の先行研究（たとえば [7]）と同様の戻り値の使用方法を調査するという場合であれば，に，コード検索エンジンを利用することによるスケー

たとえば以下のような検索クエリによって要望を表現

ラビリティを最大限に活かすため，コードの収集をあできる．

らかじめ行うのではなく，検索クエリに応じてコード$a = _ . executeQuery ?? $a

検索エンジンから必要なコード片を収集し開発者に

ここで “$a” は $変数と呼ばれるワイルドカードでコード例を提示する．本研究ではコード検索エンジンあり，1 つの変数名にマッチする．また， “??” は改として searchcode.com [1] を用いた．

行含む任意のトークン列にマッチするワイルドカー

検索エンジンを使用すると，開発者が検索クエリをド，“_” は 1 つの文の内部におけるトークン列にマッ送信してから結果が返ってくるまでの応答時間が長くチするワイルドカードである．この検索の結果，図 1なる傾向にある．そこで本研究では，提示するコードのようなコード例が検出される．“$a” には 1 行目の例のマイニング等による選定を行わず，開発者の要望変数 “rs” がマッチしており，図ではそれを太字で表を検索クエリにより表現するという方式をとる．検現している．クエリ中の “_” には 1 行目の変数 stat

索クエリによりコード中に現れる「変数のデータフが，“??” には 1 行目の executeQuery に続く “(” かロー」を指定できるようにすることで，従来のコードら 7 行目の “}” までが，最後の “$a” には 8 行目の検索エンジンに比べ，より限定的な文脈を持つ検索を先頭に出現する変数 rs がそれぞれマッチする．それ実現した．3 つの特殊な意味を持つワイルドカードを以降のコードはマッチの範囲には含まれないが，行末用いたトークン列のマッチングにより，近似的なデーまでを検索結果としての表示に含めている．

タフローを指定する方式をとっている．正規表現を書

図 1 のコード例から，executeQuery メソッドのくように，特定のトークン列の並びを指定するだけでコンピュータソフトウェア

80

データフローを表現した検索クエリを記述することが可能である．
検索対象となるソースコードは，コメントや空白，検索クエリ

検索対象ɛʰ
ţţɛ

改行のようなレイアウト情報を取り除いたトークン列として扱う．また，プログラミング言語の構文についての情報として，出現順序に対応関係の制約を持つトークン（たとえば “{” と “}” ， “(” と “)”）と，変数への代入を意味するトークン (“=”)，文の区‫؞؞؞‬ঐॵॳघॊ෇೧

図2ſƀƇʳʴʰʳʴſƀŚ;ŝͿ ŜŜŜŜſƀŚʰʳʴſƀŚ;ŝŝͿ ŜŜŜŜſũŪƀŚƈſƀƇʳʴʰʳʴſƀŚ;ŝŝŝͿ ŜŜŜŜſũŪƀŚƈ“??” がマッチする範囲の例．

(i), (ii), (iii) の 3 つのコード片にマッチする．

切り文字 (“;”) についての情報は与えられるものとする．トークン列への変換は字句解析器，あらかじめ“= _.get” という検索クエリは “= foo.get” や与えるトークンの情報は文法定義にのみ依存するた“= getFoo().get” のようなトークン列にマッチめ，本研究で構築した実装は Java, C/C++, C#, Ruby,する．一方で，“= 0 ; a = foo.get” のようなJavaScript の 5 つのプログラミング言語の検索に対複数の文にまたがる (“;” を含む) トークン列に応している．本論文では Java を例として説明する．

はマッチしない．このトークンにより，文の中に本手法では，検索クエリを指定することにより，検おけるトークン列の差を吸収する検索クエリを索対象から特定のパターンを持つトークン列を検出記述することが可能である．

する．以下に述べる 3 つの特殊トークン以外は，トー「 ?? 」 長さ 0 以上の任意のトークン列にマッチクンの種類や識別子名が完全に一致した場合にのみ，するワイルドカードである．“??” は $変数のス

2 つのトークンが等しいと判定する．たとえば，検索コープが有効である範囲において最長マッチすクエリ中で “foo” という識別子を持つトークンが指る．すなわち，検索結果として得られるコード定されると，そのクエリは “bar” や “FOO” という識

片は “{” より多くの “}” を含まず，$変数への別子を持つトークンにはマッチしない．したがって，再代入が行われないようなものとする．これに検索クエリとして特殊トークンを使用せずに検索をより，複数の箇所に出現する同じ名前を持つ変数行った場合，コードクローンの中でもタイプ 1 [5] のが，異なるスコープを持つようなコード片を出力

クローン検出と同等の検索となる．

から排除することが可能である．たとえば，図 2

以下に特殊トークンについて述べる．これらはマッ

では，(i), (ii), (iii) の 3 つのコード片にマッチすチする対象が互いに異なるワイルドカードである．

る．(i), (ii) と (iii) のコード片はそれぞれ異なる「 $変数 」 “$” の後に識別子名が続くようなトーメソッドのスコープを持つため，別のコード片とクンであり，任意の 1 つの識別子名にマッチすしてマッチする．また， (i) と (ii) が別のコードるワイルドカードである．たとえば，“$a” や片としてマッチするのは，(ii) の最初の行におい“$list” のようなトークンは $変数であり，それて $a にマッチした変数 list への代入が行われぞれ 1 つの識別子名にマッチする．検索クエリている ( list の後に “=” が続く) ため，$変数において，同一の $変数が複数箇所に出現する場にマッチした変数の生存区間がひと続きでないと合，すべての出現箇所に対し同じ識別子名がマッみなすからである．このようなマッチングの仕様チしなければならない．このトークンはデータフによって，検索クエリに $変数と “??” を記述すローを追いかけたい変数を指定するのに用いる．

るだけで自然に変数の生存区間を考慮した検索「 （アンダースコア）」 長さ 0 以上の開き括弧とが可能となる．すなわち，変数のデータフローに閉じ括弧の対応関係が取れたトークン列にマッ注目した検索が可能となる．

チ す る ワ イ ル ド カ ー ド で あ る ．た だ し ，マッ開発者にとって理解が容易であると考えられるコー

チする範囲は 1 つの文の中に限る．たとえば，ド例を提示するため，本手法では別名を考慮した変数

Vol. 29 No. 1 Feb. 2012のデータフローを含むコード例は検出の対象外である．たとえば， $v が実際の変数 x にマッチしている状態で，y = x という代入があったとしても， $vに変数 y がマッチするということにはならない．こ81䝖䞊䜽䞁ิ᳨⣴䜽䜶䝸ɛɛʰ ɏŜ ţţɛʰɏɏɛϬʰϭ ţţɛţţE&のようなコード例は変数の代入関係が自明ではなく，ŜŜϮɛϯϰϱ

開発者にとって API の利用方法を学習する目的には適当ではない．

図3

検索クエリからの非決定性有限オートマトンの構築

なお，本手法では検索結果のランキングとコード例の整形を行っている．検索クエリに含まれる $変数がの入力トークン t に対する遷移先として sn を追加す

データフローを追いかけたい（すなわち開発者の関心る．トークン列を末尾まで処理した後，最後に作成しのある）変数であることから，変数を多く含むものをた状態を受理状態とすれば NFA の構築が完了する．

上位に表示するといった低コストなランキングと整形を用いる．詳細は [9] に記載している．

手順 2. コードの取得と NFA へのマッチング
本手順ではまず初めに，コード検索結果エンジンか3 アルゴリズム

らソースコードを取得する．本研究で用いるコード検提案手法は，検索クエリを非決定性有限オートマト

索エンジン searchcode.com では，一般的なメソッドンで表現し，変数名や括弧の対応関係を確認するた名やクラス名などの単語単位での検索を行うためのめのスタックを用いた状態遷移を用いてクエリのマッWeb API が存在している．まず，検索クエリに含まチを行う．以下，その手順を説明する．

れる識別子名をトークン化の段階で認識しておき，その識別子名すべてが含まれるような複数のソースコー

手順 1. NFA の構築

ドを API 経由で取得する． そして，取得したソースまずはじめに検索クエリのトークン化を行う．トークン化には構文解析ツール ANTLR v4†1 を使用した．

コードを ANTLR v4 を用いてトークン化し，NFA に特殊トークンを認識するため，検索対象のプログラミと同様，入力に応じてアクティブな状態が遷移するモ

ング言語の構文規則に 3 つの特殊トークンに対応すデルである．検索対象ファイルのトークン列を先頭かる規則を追加し，検索クエリに対する字句解析器を生ら NFA へ入力していくが，トークンを入力するたび成した．に NFA の初期状態にアクティブな状態を 1 つ追加す入力する．本手法で使用する NFA は一般的な NFA

つぎに，図 3 のように検索クエリから NFA (非決る．そして，すべてのトークン列を読み終えるまで定性有限オートマトン) を構築する．この手順は正に，NFA の受理状態に到達するアクティブな状態の規表現検索の一般的なアルゴリズムに類似している．

集合を求めると，それが出力候補となるコード片の集NFA の入力記号は検索対象言語のトークン集合で合に対応する．ただし「アクティブな状態」は，そのある．NFA の初期状態を生成した後，検索クエリの時点までに入力された括弧の対応関係を保持するたトークン列を先頭から読み込み，読み込んだトークめのスタックや，$変数への束縛関係などの情報を保ン t に応じて新たな状態と遷移を追加する．直前に持し，その状況に応じて消滅するルールを持つ．この作成した状態を sp とする．トークン t が “??” また

情報の詳細と遷移の例，計算量等については [9] に記は “_” であるとき， sp の任意の入力に対する遷移先載されている．

として状態 sp 自身を設定する．トークン t が “??”,“_” 以外であるとき，新たな状態 sn を作成し， sp

手順 3. 検索結果の選択
まず，出力候補から $変数への再代入が行われて†1 http://www.antlr.org/

いるコード例を除外する．束縛情報から $変数へマッコンピュータソフトウェア

82

チした識別子名（仮に “id” とする）を取得し，出力20 40 60

候補のトークン列を先頭から見ていったとき “id”，“=” というトークンの並びが二度出現した時点で出力0候補から除外する．この処理は手順 2 において NFAへのマッチング中にも行うことができるが，アクティS

P

T1S

T1P

T2S

T2P

ブな状態が保持する情報と消滅する条件が複雑化す

図4るのを避けるため，出力候補のフィルタリングというタスク 1, 2 の合計である．また，黒点は平均を示している．

各タスクの得点率 (%) の箱ひげ図．左端の S, P は形をとっている．
つぎに， $変数の生存区間がより長いものを検索結考えられる．実験に使用するタスクは API の理解を果として表示するため，コードの行数が重複している伴う必要がある．恣意的なタスク設定を避けるため，出力候補同士の中でもっとも大きいもののみを出力す

実験に使用するタスクは Moreno ら [2] の実験に用る．そのため，受理状態に到達した 2 つのアクティブ

いられた 2 つのプログラミングタスクをほぼそのまな状態 a1 , a2 の包含関係として，以下の半順序関係ま使用した．被験者のタスクの達成度を，完全な達成⊆ を定義する．ただし， a.start はアクティブな状態を 100 とする得点率 (%) として評価する．なお，タa の開始行番号， a.end は a の終了行番号とする．

スクの設計や 2 つのタスク詳細は [9] に記載している．

a1 ⊆ a2⇔

a1 .start ≥ a2 .start∧a1 .end ≤ a2 .end

4. 2 実験結果と考察

この半順序関係 ⊆ により，受理状態に到達したすべ実験結果として，各プログラミングタスクの得点てのアクティブな状態集合は半順序集合となる．この率を図 4 の箱ひげ図として示す．この図は，横軸がタ半順序集合における極大元にあたるアクティブな状態

スクと使用したコード検索手法の組み合わせ (T1/T2が，検索結果として表示するコード例となる．この処がタスク，S が既存手法，P が提案手法を意味する)，理により，より長い $変数の生存区間を持つ，すなわ縦軸がその得点率 (%) である．この結果より，タスち開発者にとってより有益なコード例を検索結果とし

ク 1 において，平均値・中央値ともに提案手法の方がて提示することを実現している．

よい傾向が見られる．一方で，タスク 2 ではその傾向は見られず，むしろ既存手法の方がよいという傾向

4 評価実験が得られた．2 つのタスクを合わせた結果では，平均本研究では，API の理解をともなうタスクを設定

値は提案手法の方がよく，中央値は既存手法の方がよし，被験者実験を行うことで手法の評価を行った．

いという結果になった．以下に，これらの実験結果についての考察を述べる．

4. 1 実験の設計

タ ス ク 1 は「 HttpClient イ ン タ ー フェー ス の被験者は，第一著者と同一の研究室に所属する博士execute メソッドを用いて，指定された URL から前期課程の学生 8 人であり，M1 が 4 人, M2 が 4 人

PDF ファイルをダウンロードせよ．
」というサブタスから成る．被験者は主に研究に利用するツール等のクから始まる．そのため，被験者はまず HttpClient開発のため Java によるプログラミング作業を日常的インターフェースの実装クラスや，そのインスタンスに行っている．そのため，実験のタスクに使用するプの生成方法を特定しなければならない．既存手法を用

ログラミング言語は Java とした．比較対象となる既

いて HttpClient インターフェースの実装クラスを存手法として，コード検索エンジン serachcode.com探す場合，API のドキュメントに記載されている複[1] を選択した．これは提案手法のソースコードの取数の実装クラスを順番に見ていくか，コード検索エン得元であるため，検索対象となるソースコード集合

ジンで「 HttpClient 」というキーワードで検索し，に差がなく，対照実験の比較対象として適切であると周辺のコードを見るかの選択肢に限られる．一方で，Vol. 29 No. 1 Feb. 2012

たが使っているうちに理解してきた」という意見や， Ŝɨś   ʰ ſƀŚɩś    ʰ  ſ ʫƀŚɪśŜ ſɑ ɑřɑ ŵɑƀŚɫś  ʰŜ ſƀŚ Ŝɨś   ʰ ſƀŚɩś  ʰŜ ſƀŚ

図583

タスク 1 における検索結果の例「検索に慣れてくると欲しいコード例を検索できて便利だと感じた」という意見が見られた．また，タスク中に送信された検索クエリは，中央値で 4.3 秒，平均値で 5.0 秒の検索時間を要することが分かった．これは一般的な開発において十分実用的な範囲であると考えている．

提案手法において記述された検索クエリの中には以下のようなものが見られた．

HttpClient $a = ?? $a.execute

5 まとめと今後の展望
本研究では API 理解を支援するための技術として，この検索クエリは， HttpClient インターフェー

独自の検索クエリを用いて変数のデータフローを指ス の execute メ ソッド の 呼 び 出 し が あ る 箇 所 を定することによるコード例検索手法を提案した．

“$a.execute” と表現し，そのレシーバとなるオブ

今後の課題としては，実装したウェブアプリケー

ジェクトの生成を “HttpClient $a =” と表現したもションを外部に公開し，実際の開発者からのフィードのであると推測される．どちらも共通の $変数 “$a”バックを受け取ることが挙げられる．

を指定することで，これにマッチする変数のデータフ

謝 辞 本 研 究 は JSPS 科 研 費 JP25220003,ローを考慮した検索が可能となっている．この検索クJP26280021, JP15H02683 の助成を受けたものです．

エリを用いて検索すると，検索クエリを送信してから約 5 秒程度で検索結果が返され，上から 2 つ目と参 考 文 献3 つ目のファイルのコード例として図 5 が見られた．

[1] searchcode.com. https://searchcode.com.
[2] L. Moreno, G. Bavota, M. Di Penta, R. Oliveto,and A. Marcus. How can i use this method? In
Proceedings of ICSE, pages 880–890, 2015.
[3] M. P. Robillard. What makes APIs hard to learn?
answers from developers. IEEE Software, 26(6):27–34, 2009.
[4] M. P. Robillard and R. Deline. A field study ofAPI learning obstacles. Empirical Software Eng,
16(6):703–732, 2011.
[5] C. K. Roy, J. R. Cordy, and R. Koschke. Comparison and evaluation of code clone detection techniques and tools: A qualitative approach. Scienceof Computer Programming, 74:470–495, 2009.
[6] S. E. Sim, M. Umarji, S. Ratanotayanon, andC. V. Lopes. How well do search engines support code retrieval on the web? ACM TOSEM,21(1):4:1–4:25, 2011.
[7] S. Thummalapenta and T. Xie. Parseweb: A programmer assistant for reusing open source code onthe web. In Proceedings of ASE, pages 204–213,
2007.
[8] H. Zhong, T. Xie, L. Zhang, J. Pei, and H. Mei.
MAPO: Mining and recommending API usage patterns. In Proceedings of ECOOP, pages 318–343,
2009.
[9] 竹 之 内 啓 太. 変 数 の デ ー タ フ ロ ー を 考 慮 した API 利 用 コ ー ド 例 の 検 索 手 法.
大阪大学
修士論文, http://sel.ist.osaka-u.ac.jp/lab-db/Mthesis/archive/128/128.pdf, 2017.

太字の変数が $変数にマッチした変数である．これらのコード例の 1 行目はともに同じであり，実装クラスDefaultHttpClient のインスタンスを生成している．
実際，このコード例に倣って実装すれば，タスクを完了することが可能である．このような形で API の理解支援を行うことができたため，タスク 1 では提案手法を利用した方が得点率が高くなったと考えている．
タスク 2 において提案手法の有用性が見られなかったのは，タスク 2 は主にユーティリティメソッドを使用するサブタスクから構成されるが原因であると考えている．メソッドの多くが static メソッドである
ため，オブジェクトの状態等を考える必要がなく，使い方はあまり難しくない．そのため，コード例によるAPI の理解支援を必要とせず，提案手法と既存手法の差がほとんど生まれなかったと考えられる．
タスク終了後，アンケートにより提案手法の検索クエリの記述の容易さを 4 段階で評価してもらった
ところ，被験者 8 人のうち 7 人が「どちらかというと容易である」と回答した．提案手法の検索クエリに対し「最初は検索クエリの記述の仕方が分からなかっコンピュータソフトウェア

84
竹之内啓太

2015 年大阪大学基礎工学部情報科学科卒業．2017 年同大学大学院情報科学研究科博士前期課程修了．同年株
式会社エヌ・ティ・ティ・データ入社．
在学中，ソースコードの静的解析に関する研究に従事．
石 尾隆

2003 年大阪大学大学院基礎工学研究科博士前期課程修了．2006 年同大学大学院情報科学研究科博士後期課程修了．同年日本学術振興会特別研究員（PD）．2007 年大阪大学大学院情報科学研究科助教．2017 年奈良先端科学技術大学院大学情報科学研究科准教授．博士（情報科学）．プログラム解析，プログラム理解に関する研究に従事．
井上 克郎

1979 年大阪大学基礎工学部情報工学科卒業．1984 年同大学大学院博士課程修了．同年同大学基礎工学部助手．

1984〜1986 年ハワイ大学マノア校情報工学科助教授．1989 年大阪大学基礎工学部講師．

1991 年同助教授．1995 年同教授．2002 年大阪大学
大学院情報科学研究科教授．工学博士．ソフトウェア
工学，特に，ソフトウェア開発手法，プログラム解析，再利用技術の研究に従事．