從舊式編程語言(例如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的合作基礎上繼續前進,并為新的翻譯任務推進自我監督學習,

如果你想成為一名優秀的程式員——程式員編程俱樂部【點擊進入】!
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

程式員編程入門資料:

程式員?推薦學習書籍:

一個活躍、高逼格、高層次的程式員編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196046.html
標籤:其他
