【論文メモ】<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はコード推奨の目的で開発されましたが、効率的で正確なコード対コードの構造検索にも使用できます。

私たちは、Hack [Verlaguet and Menghrajani 2014]、Java、JavaScript、Pythonの4つのプログラミング言語向けにAromaをC++で実装しました。また、これらの4つの言語に対するIDEプラグインも実装しました。Javaプログラミング言語向けのAromaの実験評価を報告します。私たちは、内部開発者のニーズに基づいて最初にAndroid向けにAromaを開発したため、Android Javaの実験を実施しました。Aromaを使用して、5,417のGitHub Java Androidプロジェクトをインデックス化しました。Stack Overflowから取得したコードスニペットを使用してAromaを評価しました。推奨を手動で分析し、いくつかの代表的なカテゴリに分類しました。また、50の部分的なコードスニペットでAromaの推奨を評価しました。その結果、Aromaは37のクエリに対して正確なコードスニペットを推奨し、残りの13件では依然として有用な代替の推奨を行いました。平均して、Aromaは24コアCPUでのクエリコードスニペットに対する推奨を作成するのに1.6秒かかります。大規模な自動評価では、Aromaのさまざまな設計選択の効果を評価するために、人工的に作成されたクエリスニペットを含むマイクロベンチマークスイートを使用しました。最後に、12人のHackプログラマーが4つの短いプログラミングタスクでIDEとやり取りすることを観察することで、Aromaのユーザースタディを実施し、Aromaが既存のコーディング支援ツールに有益な追加となることがわかりました。

論文の残りの部分は以下のように構成されています。セクション2では、Aromaのようなコード推奨ツールの可能性を明らかにするケーススタディを提供します。セクション3では、Aromaがコード推奨を作成するために使用するアルゴリズムを説明します。セクション4では、Aromaのコード推奨の有用性を手動で評価します。コード検索が推奨を作成するための重要な要素であるため、セクション5では、Aromaの検索リコールを測定し、他の手法と比較します。セクション6では、Aromaの実世界での展開を紹介します。セクション7では、Aromaツールの初期の開発者体験について報告します。セクション8では関連する研究を紹介します。最後に、セクション9で論文を結論します。


Conclusion

私たちは、構造化されたコード検索を介したコード推奨のための新しいツールであるAromaを紹介しました。Aromaは、まず大規模なコードコーパスをインデックス化します。それはコードスニペットを入力として受け取り、コーパスからスニペットを含むメソッド本体のリストを組み立て、それらのメソッド本体をクラスタリングおよび交差させて、いくつかの簡潔なコード推奨を提供します。

Aromaの評価のために、2百万以上のJavaメソッドを持つコードコーパスをインデックス化し、Androidタグを持つStack Overflowの上位500の質問から選ばれたコードスニペットを使用してAroma検索を実行しました。これらのスニペットの大部分に対して、Aromaが有用な推奨を提供したことが観察されました。さらに、クエリの半分を使用してAroma検索を実行した場合、50件中37件でAromaがコードスニペットの後半を正確に推奨しました。

さらに、Aroma検索結果の正確性をテストするために大規模な自動評価を実施しました。コーパス内の既存のメソッド本体から部分的なコードスニペットを抽出し、それらのスニペットをクエリとしてAroma検索を実行しました。連続するクエリの99.1%と非連続するクエリの98.3%について、Aromaが元のメソッドを最上位の結果として取得しました。また、Aromaの検索および刈り込みアルゴリズムが、従来のコード検索技術よりもコードスニペットを含むメソッドを見つけるのに明らかに優れていることを示しました。

最後に、プログラマーがAromaとのやり取りにどのように関わるかを調査するケーススタディを実施しました。参加者はAromaを使用して2つの短いプログラミングタスクを完了し、Aromaを使用しない状態と比較しました。多くの参加者が、Aromaを使用して、自分が馴染みのないライブラリの共通のパターンを特定するのに成功しました。フォローアップの調査では、多数の参加者がタスクの完了にAromaが役立ったと述べました。

私たちの進行中の研究は、Aromaが強力な開発者ツールとなる可能性を示しています。リポジトリ内の新しいコードはしばしば既存のコードに類似していますが、現在利用可能なコード検索ツールは、プログラマーがコードを追加または改善するのを支援するためにこの類似するコードを活用していません。Aromaは、入力コードスニペットの共通の追加または変更を特定し、プログラマーにわかりやすく便利な方法で提示することで、この問題に対処しています。



どういう論文?


先行研究と比べて何がすごい?


提案している技術や手法のポイントはどこ?



有効性の検証は?



関連研究は?





コメント

このブログの人気の投稿

【論文メモ】A systematic literature review on source code similarity measurement and clone detection: techniques, applications, and challenges

【論文メモ】<2022>コードクローン検索手法の調査

【論文】A Survey on Causal Inference<2021>