Facebook開源Aroma: 通過機器學習向程式設計師推薦程式碼模板

banq發表於2019-04-09

為了簡化和加快編寫會對許多系統產生影響的程式碼的過程,工程師經常需要一種方法來查詢其他人如何編寫程式碼來處理類似的任務。我們建立了Aroma,一種程式碼到程式碼的搜尋和推薦工具,它使用機器學習(ML)使得從大型程式碼庫獲得洞察力的過程變得更加容易。

在Aroma之前,現有的工具都沒有完全解決這個問題。文件工具並不總是可用且可能過時,程式碼搜尋工具通常會返回無數匹配結果,並且很難立即找到慣用的使用模式。通過Aroma,工程師可以輕鬆找到常見的編碼模式,而無需手動瀏覽數十個程式碼段,從而節省了日常開發工作流程的時間和精力。

讓我們看看Android工程師想要了解其他人如何編寫類似程式碼的情況。假設工程師編寫以下內容來解碼Android手機上的點陣圖:

Bitmap bitmap = BitmapFactory.decodeStream(input);
bitmap = BitmapFactory.decodeStream(input);

    

這是可行的,但工程師想知道其他人如何在相關專案中實現此功能,尤其是設定了哪些常用選項,或處理了哪些常見錯誤,以避免應用程式在生產中崩潰。

Aroma使工程師能夠使用程式碼片段本身進行搜尋查詢。結果作為程式碼建議返回。每個程式碼建議都是從儲存庫中找到的類似程式碼片段的叢集中建立的,並表示常見的使用模式。以下是Aroma為此示例返回的第一條建議:

程式碼示例1

final BitmapFactory.Options options = new BitmapFactory.Options();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;.inSampleSize = 2;
// ...// ...
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);

這段程式碼建議是從儲存庫中找到的五個類似方法的集合中合成的。此處僅顯示了方法叢集中的公共程式碼,並在間隙(省略號...部分)中刪除了各個方法的具體細節。

這段程式碼建議試圖說明什麼?嗯,它說在五種不同的情況下,工程師在解碼點陣圖時設定了額外的選項。設定樣本大小有助於減少解碼大點陣圖時的記憶體消耗,實際上,Stack Overflow上的一個熱門帖子暗示了相同的模式。Aroma通過發現包含此模式的程式碼片段集自動建立此建議。

讓我們看看另一個建議。

程式碼示例2

try { {
  InputStream is = am.open(fileName);InputStream is = am.open(fileName);
  image = BitmapFactory.decodeStream(is);= BitmapFactory.decodeStream(is);
  is.close();is.close();
} catch (IOException e) {} catch (IOException e) {
  // ...// ...
}}

此程式碼段是從另外四種方法聚類而來的。它顯示了InputStream在解碼點陣圖中的慣用用法。此外,此建議演示了在開啟InputStream時捕獲潛在IOException的良好做法。如果此異常在執行時發生且未捕獲,則應用程式將立即崩潰。負責任的工程​​師應使用此建議擴充套件程式碼並正確處理此異常。

與傳統的程式碼搜尋工具相比,Aroma的程式碼推薦功能有以下幾個優點:

  • Aroma在語法樹上執行搜尋。Aroma不是尋找字串級別或令牌級別的匹配,而是可以找到語法上與查詢程式碼類似的例項,並通過修剪不相關的語法結構來突出顯示匹配的程式碼。
  • Aroma自動將類似的搜尋結果聚集在一起以生成程式碼建議。這些建議代表慣用的編碼模式,比非聚集搜尋匹配更容易使用。
  • Aroma足夠快,可以實時使用。在實踐中,即使對於非常大的程式碼庫,它也會在幾秒鐘內建立建議,並且不需要提前進行模式挖掘。
  • Aroma的核心演算法與語言無關。我們在Hack,JavaScript,Python和Java的內部程式碼庫中部署了Aroma。

相關文章