天天看點

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

還記得美國前一陣要招聘60歲的老程式員嗎?都怪程式設計語言發展太快!

因為新冠疫情的緣故,美國一些地區的失業救濟系統不堪重負,而這些系統都是上古語言COBOL寫的。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

然而,現在早已經是C/C++、Java、Python的天下了,把COBOL程式換成Python,何其難也。

遠的不說,Python 2剛剛淘汰,過去的老程式手工轉成Python 3也是個很大的工程。

既然AI能翻譯自然語言,那也應該能翻譯程式設計語言。

Facebook也是這麼想的,是以他們最近提出了TransCoder,一個翻譯程式設計語言的AI,現在可以在C++、Java、Python語言之間互譯。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

經翻譯後的程式,成功運作的通過率最高可以達到80.9%。

而且TransCoder是一種無監督學習算法,意味着不需要大量成對的、标記的程式設計代碼資料集進行訓練。

如果這項技術達到實用化程度,對廣大程式員來說真是巨大福音啊!

難怪論文作者之一Guillaume Lample在Twitter上宣布了這篇論文後很快引起了熱議。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

翻譯程式設計語言,什麼原理?

TransCoder充分利用了程式設計語言的特點,比如像for、while、if這些關鍵詞以及通用的數學運算符。

下圖展示了C++、Java和Python關鍵字的嵌入。在相似的上下文中使用的不同程式設計語言的關鍵字在嵌入空間中非常接近。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

例如,Python中的except和Java、C++中的catch都用于擷取異常,它們被映射到非常相似的嵌入空間位置。

對于映射的實作(map和dict)、用于将字元串轉換為字元數組(c_str和toCharArray)以及類似的變量類型(例如long、int和Integer),也可以觀察到相同的現象。

那麼以上這些關鍵詞的嵌入是如何獲得的?

Facebook提出了實作無監督程式設計語言機器翻譯的三個原則。

首先,通過跨語言掩碼語言模型(MLM)預處理來初始化模型,這有些類似于自然語言的填空題。結果是表達相同指令的代碼片段被映射到與程式設計語言無關的相同表示。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

其次是去噪自動編碼,它能訓練解碼器始終生成有效序列,即使在輸入有噪聲的資料時也是如此,提高了編碼器對輸入噪聲的魯棒性。

最後是反向翻譯,它允許模型生成可用于訓練的并行資料。每當Python轉C++模型變得更好時,它就會為C++轉Python模型生成更精确的資料,反之亦然。

通過以上步驟,TransCoder在訓練後獲得了之前提到的跨語言嵌入。

我們觀察到,TransCoder成功地了解了每種語言特有的文法、資料結構、函數庫和方法。

在上面的圖中,展示了Java和C++獨有的三元運算符X ? A : B,翻譯到Python中就變成了if X then A else B。

以下是一個從Python翻譯到C++的執行個體。TransCoder推斷變量和函數傳回值的類型,将Python的deque()容器映射到C++中類似的實作deque<>,并使用C++的front、back、pop_back和push_back方法來檢索和插入deque中的元素,而不是使用Python方括号、pop和append方法。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

實驗結果

為了訓練TransCoder,Facebook在GitHub上尋找了280萬個開源代碼庫進行訓練,其中包含數百億個token。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

然後去GeeksforGeeks平台去驗證翻譯成果,該平台是收集各類編碼問題,并以多種程式設計語言提供解決方案。

和自然語言不同的是,代碼翻譯并不太要求逐字逐句的對照,是以翻譯後的代碼和參考代碼的重合度其實很低,比如C++轉Java的代碼和Ground Truth僅有3.1%比對。

另外NLP翻譯中的BLEU也不宜作為代碼翻譯的衡量标準,因為這隻能表示實際代碼和參考代碼之間的文法差異。

是以需要一個新的度量标準——計算正确率,它表示翻譯後的代碼測試後是否能與參考代碼有相同的輸出。

用AI實作C++、Java、Python代碼互譯,運作成功率最高達80.9%

以此為标準,C++轉Java的代碼的計算正确率為60.9%,而Java轉C++的計算正确率為80.9

%。

Facebook不是唯一開發AI代碼生成系統的公司。前不久微軟Build大會上,OpenAI就示範了一個在GitHub資料上訓練的模型,僅根據注釋内容即可生成對應功能的代碼。

TransCoder沒那麼智能,但是在計算機技術飛速發展的今天,誰知道下一個流行的語音是什麼,有了TransCoder,至少讓我們在移植代碼的時候沒那麼難了。

也許美國社保系統的COBOL就靠它解決了。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-06-09

本文作者:曉查

本文來自:“

量子位公衆号

”,了解相關資訊可以關注“公衆号QbitAI”