Facebook AI 用深度學習實現編程語言轉換,代碼庫遷移不再困難!
從舊式編程語言(例如COBOL)到現代替代語言(例如Java或C ++)的代碼庫遷移是一項艱巨的任務,Facebook AI開發了Transcoder,這是一個完全自監督的神經轉編譯器系統,可以使代碼遷移變得更加輕松和高效。
從舊式編程語言(例如COBOL)到現代語言(例如Java或C ++)的代碼庫遷移是一項艱巨的任務,需要源語言和目標語言方面的專業知識。
例如,COBOL至今仍在全球大型機系統中廣泛使用,因此公司,政府和其他組織通常必須選擇,是手動翻譯其代碼庫,還是致力于維護使用可追溯到1950年代的語言編寫的代碼。
Facebook AI開發了Transcoder,可以使代碼遷移變得更加輕松和高效。Facebook AI的方法能夠將代碼從一種編程語言轉換為另一種編程語言,而無需數據進行訓練的AI系統。
Facebook AI已經證明TransCoder可以成功地在C ++,Java和Python之間完成語言轉換。TransCoder的性能優于開放源代碼的且基于商業規則的翻譯程序。在Facebook AI的評估中,該模型正確地將90%以上的Java函數轉換為C ++,將74.8%的C ++函數轉換為Java,并將68.7%的函數從Java轉換為Python。
相比之下,市售工具只能正確地將61.0%的功能從C ++轉換為Java,而開源翻譯器僅準確地轉換了38.3%的Java函數轉換為C ++。
自我監督的培訓對于在編程語言轉換中特別重要。傳統的監督學習方法依賴于大規模并行數據集的訓練,但是對于從COBOL到C ++或從C ++到Python來說,并不適用。
TransCoder完全依賴僅用一種編程語言編寫的源代碼。它不需要編程語言方面的專業知識,并且很容易推廣到其他編程語言。
TransCoder對于將遺留代碼庫更新為現代編程語言很有用,現代編程語言通常更高效且易于維護。它還顯示了如何將神經機器翻譯技術應用于新領域。
seq2seq模型發揮了大作用
在自然語言中,即使在越來越依賴自動化機器翻譯系統的專業翻譯人員中,神經機器翻譯的最新進展也被廣泛接受。但是,由于該領域中并行數據的稀缺性,它們在代碼轉換中的應用受到了限制。程序員仍然依賴基于規則的代碼轉換器,這需要專家審查和調試輸出,或者他們只是手動翻譯代碼。TransCoder通過利用無監督機器翻譯到編程語言方面的最新進展來克服這些挑戰。
Facebook AI特別注意構建了一個seq2seq模型,該模型由具有變壓器架構的編碼器和解碼器組成。TransCoder使用單個共享模型,部分基于Facebook AI在XLM上的先前工作,適用于所有編程語言。Facebook AI按照無監督機器翻譯的三個原則:初始化,語言建模和反向翻譯。
此圖顯示了TransCoder如何利用無監督機器翻譯的三個原理
Facebook AI首先利用開源GitHub項目中的源代碼,使用MLM目標對Facebook AI的模型進行了預訓練。就像在自然語言處理的上下文中一樣,這種預訓練會創建跨語言的嵌入:在相似上下文中使用的來自不同編程語言的關鍵字在嵌入空間中非常接近(例如catch和except)。
這些嵌入的跨語言性質來自存在于多種語言中的大量通用令牌。令牌的示例包括C ++,Java和Python通用的關鍵字(例如,for,while,if,try),以及源代碼中出現的數學運算符,數字和英文字符串。
使用MLM進行預訓練使TransCoder可以生成輸入序列的高質量表示。然而,解碼器缺乏翻譯能力,因為從未訓練過解碼器,基于源表示對序列進行解碼。為了解決此問題,Facebook AI訓練了該模型以使用降噪自動編碼(DAE)目標對序列進行編碼和解碼。
DAE的工作方式類似于監督機器翻譯算法,其中訓練模型以在給定序列的損壞版本的情況下預測令牌序列。在測試時,該模型可以對Python序列進行編碼,并使用C ++起始符號對其進行解碼以生成C ++轉換。
視頻顯示了具有相似功能的關鍵字如何組合在一起。
僅跨語言模型預訓練和自動降噪就足以生成翻譯。但是,這些翻譯的質量往往很低,因為從未訓練過該模型以使其在測試時可以完成預期的工作,即將功能從一種語言翻譯為另一種語言。
為了解決此問題,Facebook AI使用反向翻譯,這是在弱監督的情況下利用單語數據的最有效方法之一。對于每種目標語言,Facebook AI使用一個模型和一個不同的開始標記。它經過訓練可以從源到目標以及從目標到源并行轉換。
然后可以以弱監督的方式訓練模型,以從嘈雜的源序列中重建目標序列,并學習從源到目標的轉換。并行訓練目標到源版本和源到目標版本,直到收斂為止。
為了評估他們的模型,以前的大多數源代碼翻譯研究都依賴于自然語言中使用的度量標準,例如BLEU分數或其他基于標記之間相對重疊的方法。但是,這些類型的指標不太適合編程語言。語法差異小的兩個程序在執行代碼時可能會獲得很高的BLEU分數,同時仍然產生非常不同的結果。相反,具有不同實現方式的語義等效程序,將具有較低的BLEU分數。
另一種度量標準是參考匹配,或與實地參考完全匹配的翻譯百分比,但這通常會低估翻譯質量,因為它無法識別語義上等效的代碼。
為了更好地衡量TransCoder和其他代碼轉換技術的性能,Facebook AI創建了一個稱為計算精度的新指標,該指標評估假設函數在給定相同輸入時是否生成與參考相同的輸出。Facebook AI還將發布測試集以及用于計算該指標的腳本和單元測試。
下面的示例顯示了TransCoder如何將示例代碼從Python轉換為C ++。Facebook AI使用以下代碼作為模型輸入:
TransCoder成功將Python輸入函數SumOfKsubArray轉換為C ++。它還可以推斷參數的類型,返回類型和函數的參數。該模型將Python dequeue()容器附加到C ++實現dequeue <>。這是C ++中模型的輸出:
編程語言轉換讓實際應用受益
自動代碼翻譯有可能使程序員在公司或開源項目中工作的程序員更加高效,因為他們可以更輕松地集成公司內其他團隊或其他開源項目的各種代碼。它還可以大大減少更新用古老語言編寫的舊代碼庫的工作量和開銷。
反編譯的進步可能會促使公司和其他機構更新到最新的語言并促進未來的創新,這可能讓使用服務的人們以及機構本身受益。編程語言機器翻譯的進步也可以幫助那些沒有時間或負擔不起學習多種語言編程的人。
更廣泛地說,人工智能有潛力幫助其他編程任務。例如,Facebook AI以前共享了神經代碼搜索的工具,這些工具可學習自動為編碼錯誤提供建議修復。雖然TransCoder并非旨在幫助調試或提高代碼質量,但它有潛力幫助工程師遷移舊代碼庫或使用以其他語言編寫的外部代碼。
為了促進有關使用深度學習進行代碼翻譯的未來研究,Facebook AI還發布了一個測試集,該測試集使其他研究人員可以使用計算精度而不是語義盲模型來評估代碼翻譯模型。
Facebook AI期待看到其他人在和TransCoder的合作基礎上繼續前進,并為新的翻譯任務推進自我監督學習。