【論文メモ】<2019>Aroma: code recommendation via structural code search
原論文
Aroma: code recommendation via structural code search (acm.org)
Abstract
構造化されたコード検索を介したコード推奨のためのツールと技術であるAromaを提案します。Aromaは、数千のオープンソースプロジェクトを含む巨大なコードコーパスをインデックス化し、部分的なコードスニペットを入力として受け取り、コーパス内の部分的なコードスニペットを含むメソッド本体を検索し、検索結果をクラスタリングして重なり合わせ、クエリスニペットを含み、コーパス内の複数のメソッドの一部として表示される簡潔なコードスニペットの小さなセットを推奨します。私たちは、コーパスから作成された2000のランダムに選択されたクエリと、コードスニペットから派生した64のクエリを使用して、Aromaを評価しました。これらのコードスニペットは、コードの議論が行われる人気のあるウェブサイトであるStack Overflowから取得されました。私たちは4つの異なる言語向けにAromaを実装し、AromaのためのIDEプラグインを開発しました。さらに、12人のプログラマーにAromaを使用してプログラミングタスクを完了するように求め、彼らのフィードバックを収集する研究を行いました。結果は、Aromaが効率的に関連するコードスニペットを取得して推奨できることを示しています。
Introduction
Androidプログラマーがビットマップをデコードするコードを書きたいとします。プログラマーは、コードを書くために必要なライブラリに精通していますが、エラーハンドリングと適切な設定を完全に行う方法がわかりません。最初の試みとして、リスト1に示すコードスニペットを書きます。プログラマーは、他の人が関連するプロジェクトでこの機能を完全かつ正確にどのように実装したかを知りたいと思っています。具体的には、適切な設定が行われ、一般的なエラーが処理され、適切なライブラリメソッドが呼び出されるようにコードを拡張する慣習的な方法を知りたいと考えています。ツールが、デコーダーを使用してメモリを少なく使用する方法や、潜在的なランタイム例外を処理する方法などを示す、リスト2、3に示すいくつかのコードスニペットを返すと便利です。これをコード推奨の問題と呼びます。
既存のいくつかの技術が、コードの推奨を取得するために潜在的に使用される可能性があります。たとえば、コード対コード検索ツール(Kimら、2018年; Krugler、2013年)は、部分的なコードスニペットをクエリとして使用して、コーパスから関連するコードスニペットを取得することができます。しかし、そのようなコード対コード検索ツールは、似たような見た目のコードスニペットを削除または集約せずに、多くの関連するコードスニペットを返します。さらに、そのようなツールは、似たような取得されたコードスニペットから一般的で簡潔なコードスニペットを切り出す努力を行いません。パターンベースのコード補完ツール(Moverら、2018年; Nguyenら、2012年、2009年)は、大規模なコーパスから共通のAPI使用パターンを抽出し、部分的に書かれたプログラムのコード補完を推奨します。部分プログラムが抽出されたパターンのプレフィックスに一致する限りです。そのようなツールは、抽出されたパターンに対してはうまく機能しますが、抽出されたパターンの数は通常、数百に限られています。Aromaにおける「コード推奨」というフレーズの意味は、Nguyenらによる用語「APIコード推奨」とは異なります。後者は、コード変更が与えられた場合に次のAPIメソッドを呼び出すための推奨エンジンですが、Aromaはプログラマーが一般的な使用法を学び、それらの使用法を自分のコードに統合するために、リスト2、3に示されるようなコードスニペットを推奨します。Aromaの推奨には、APIの使用法だけでなく、より構文的なバラエティが含まれています。たとえば、リスト3の推奨されるコードスニペットには、try-catchブロックが含まれており、表1の例Bでは、変数を変更するifステートメントの追加が推奨されています。コードクローン検出器(CordyとRoy、2011年; Jiangら、2007年; Kamiyaら、2002年; Sajnaniら、2016年)は、推奨されるコードスニペットを取得するために潜在的に使用される別の技術のセットです。ただし、コードクローン検出ツールは、クエリスニペットとほぼ同一のコードスニペットを通常取得します。そのような取得されたコードスニペットには、クエリスニペットを拡張するために使用できる追加のコードが常に含まれているとは限りません。
私たちは、コード推奨エンジンであるAromaを提案します。入力クエリとしてコードスニペットと、数百万のメソッドを含む大規模なコードコーパスが与えられると、Aromaは次のような推奨されるコードスニペットのセットを返します:
・クエリスニペットをおおよそ含みます。
・コーパス内の一連のメソッド本体におおよそ含まれます。
さらに、Aromaは、推奨された任意の2つのコードスニペットが互いにかなり似ていないことを保証します。
Aromaは、まず与えられたコードコーパスをインデックス化します。次に、Aromaは、クエリコードスニペットをおおよそ含む少数のメソッド本体(たとえば、1000個)を検索します。この検索ステップを設計する際の課題は、クエリスニペットが自然言語クエリと異なり、構造を持っていることであり、コードを検索する際に考慮する必要があります。Aromaがクエリスニペットをおおよそ含む少数のコードスニペットを取得したら、Aromaは取得したスニペットを刈り込み、結果の刈り込まれたスニペットがクエリスニペットと似てくるようにします。それから、取得したコードスニペットを、刈り込まれたスニペットとクエリスニペットの類似性に基づいてランク付けします。このステップは、取得したスニペットがクエリスニペットをどれだけ含んでいるかに基づいてスニペットをランク付けするのに役立ちます。このステップは正確ですが、比較的高コストです。しかし、このステップは一連のコードスニペットに対してのみ実行されるため、実践的には効率的です。取得したコードスニペットをランク付けした後、Aromaはスニペットをクラスタリングし、類似したスニペットが同じクラスターに含まれるようにします。Aromaは、それぞれのクラスター内のスニペットを交差させ、クラスター内のすべてのスニペットに共通する最大のコードスニペットを切り出し、そのコードスニペットにクエリスニペットが含まれるようにします。交差したコードスニペットのセットが、推奨されるコードスニペットとして返されます。図3はアルゴリズムの概要を示しています。リスト1に示されているクエリに対して、Aromaはリスト2、3に示されているコードスニペットを推奨します。表1の右列には、表の左列に表示されているコードクエリに対してAromaが推奨したコードスニペットのさらなる例が示されています。
私たちの知る限り、Aromaは、クエリコードスニペットが与えられた場合に関連するコードスニペットを推奨できる最初のツールです。Aromaの利点は次のとおりです。
・Aromaによって推奨されるコードスニペットは、単に単一のメソッド本体から取得されるのではなく、複数の似たようなコードスニペットが交差することによって生成されます。これにより、Aromaの推奨が一時的なものではなく、習慣的なものである可能性が高まります。
・Aromaは、事前に共通のコーディングパターンやイディオムを採掘する必要がありません。したがって、Aromaは採掘されたパターンのセットに制限されません。Aromaは、新しい興味深いコードスニペットをリアルタイムで取得できます。
・Aromaはリアルタイムで使用するのに十分高速です。Aromaの主要なイノベーションの1つは、まずおおよその検索に基づいて小さなスニペットのセットを取得し、その後、重い刈り込みやクラスタリング操作をこのセットで実行することです。これにより、Aromaは、複数のメソッドを含む大規模なコーパスからのクエリに基づいて推奨されるコードスニペットを、マルチコアのサーバーマシン上で数秒で作成できます。
・Aromaのコアアルゴリズムは汎用の構文解析木で動作するため、さまざまなプログラミング言語に簡単に展開できます。私たちは、Hack、Java、JavaScript、Python向けにAromaを実装しました。
・Aromaはコード推奨の目的で開発されましたが、効率的で正確なコード対コードの構造検索にも使用できます。
Conclusion
どういう論文?
先行研究と比べて何がすごい?
提案している技術や手法のポイントはどこ?
有効性の検証は?
関連研究は?
コメント
コメントを投稿