代碼機器學習(MLonCode)不只能夠幫助公司簡化其代碼庫和軟件交付流程,並且還能夠幫助組織更好地理解和管理其工程人才。算法
——Vadim Markovtsev編程
隨着IT組織的發展,其代碼庫的大小以及開發人員工具鏈的複雜性也在不斷增加。工程負責人對其代碼庫,軟件開發過程和團隊狀態瞭解的很是有限。經過將現代數據科學和機器學習技術應用於軟件開發,大型企業有機會顯著提升其軟件交付性能和工程效率。網絡
在過去的幾年中,許多大型公司,例如Google,Microsoft,Facebook以及相似Jetbrains等較小的公司已經與學術研究人員合做,爲基於代碼的機器學習奠基了基礎。架構
代碼機器學習(MLonCode)是一個新的跨學科研究領域,涉及天然語言處理,編程語言結構以及社會和歷史分析,例如貢獻圖形和提交時間序列。MLonCode旨在從大規模的源代碼數據集中學習,從而能自動執行軟件工程任務,例如輔助代碼審查,代碼重複數據刪除,軟件專業知識評估等。框架
某些MLonCode問題要求零錯誤率,例如與代碼生成有關的錯誤率。自動程序修復是一個特定的示例。一個微小的單一錯誤預測可能會致使整個程序的編譯失敗。機器學習
在其餘一些狀況下,錯誤率必須足夠低。理想的模型應犯的錯誤應儘量少,因此用戶(軟件開發人員)的信噪比還是可承受且值得信賴的。所以,可使用與傳統靜態代碼分析工具相同的方式來使用該模型。最佳實踐挖掘就是一個很好的例子。編程語言
最後,絕大多數MLonCode問題是無監督的,或至可能是弱監督的。手動標記數據集可能會很是昂貴,所以研究人員一般必須開發相關的啓發式方法。例如,有許多類似性分組任務,例如向類似的開發人員展現或根據專業領域幫助團隊。咱們在本主題中的經驗在於挖掘代碼格式化規則,並將其應用於修復錯誤,這與短絨同樣,但徹底不受監督。有一個相關的學術競賽來預測格式問題,稱爲CodRep。分佈式
MLonCode問題包括各類數據挖掘任務,這些任務從理論上講多是微不足道的,但因爲規模或對細節的關注,在技術上仍然具備挑戰性。示例包括代碼克隆檢測和相似的開發人員聚類。此類問題的解決方案在年度學術會議「 採礦軟件存儲庫」中進行了介紹。函數
採礦軟件存儲庫會議徽標。工具
解決MLonCode問題時,一般用如下方式之一表示源代碼:
頻率字典(加權詞袋,BOW)。示例:函數內的標識符;文件中的graphlet;存儲庫的依賴性;能夠經過TF-IDF加權頻率等。這些表示是最簡單,可伸縮性最高的。
順序令牌流(TS),對應於源代碼解析序列。該流一般經過指向相應抽象語法樹節點的連接來加強。此表示形式對常規天然語言處理算法(包括序列到序列深度學習模型)很友好。
一棵樹,它天然地來自抽象語法樹。在進行不可逆的簡化或標識符後,咱們執行各類轉換。這是最強大的表示形式,也是最難使用的表示形式。如下是相關的ML模型包括各類圖嵌入和門控圖神經網絡。
解決MLonCode問題的許多方法都基於所謂的天然假說(Hindle等):
「從理論上講,編程語言是複雜,靈活且功能強大的,但不少人實際上編寫的程序大可能是簡單且至關重複的,所以它們具備有用的可預測統計屬性,能夠在統計語言模型中捕獲並用於軟件工程、任務。」
該聲明證實了大代碼的有用性:分析的源代碼越多,強調的統計屬性越強,而且訓練有素的機器學習模型所得到的指標越好。底層關係與當前最新的天然語言處理模型相同:如XLNet,ULMFiT等。相似地,通用MLonCode模型能夠在下游任務中進行訓練和利用。
有這麼大的代碼數據集。當前的最終資源是GitHub上的開源資源庫。若是克隆成千上萬個Git存儲庫可能存在技術問題,所以須要存在下游數據集,例如
Public Git Archive,GHTorrent和Software Heritage Graph。
隨着軟件繼續吞噬世界,咱們正在積累數十億行代碼,由多種編程語言,框架和基礎架構構建的數百萬個應用程序。MLonCode不只能夠幫助公司簡化其代碼庫和軟件交付流程,並且還能夠幫助組織更好地理解和管理其工程人才。經過將軟件工件視爲數據並將現代數據科學和機器學習技術應用於軟件工程,組織將得到競爭優點。
簡歷:Vadim Markovtsev是Google機器學習開發專家和來源方面的首席機器學習工程師。他使用「大」和「天然」代碼工做。他的學術背景是編譯器技術和系統編程。他是一名開源狂熱者和一名開放數據騎士。在三星工做時,Vadim是歷史悠久的分佈式深度學習平臺Veles的建立者之一。以後,Vadim負責在俄羅斯最大的電子郵件服務Ma il .Ru上進行反垃圾郵件的機器學習工做。過去,Vadim仍是莫斯科物理與技術學院的客座副教授,教授新技術並開展相似於ACM的內部編碼競賽。
獲取更多優質內容,可前往:疫情當下,宅家也能好好提高本身,爲將來蓄能——蓄勢待發!