用AI實(shí)現(xiàn)C++、Java、Python代碼互譯,運(yùn)行成功率最高達(dá)80.9%
不用再精通多門編程語(yǔ)言了
曉查 發(fā)自 凹非寺
量子位 報(bào)道 | 公眾號(hào) QbitAI
還記得美國(guó)前一陣要招聘60歲的老程序員嗎?都怪編程語(yǔ)言發(fā)展太快!
因?yàn)樾鹿谝咔榈木壒?,美?guó)一些地區(qū)的失業(yè)救濟(jì)系統(tǒng)不堪重負(fù),而這些系統(tǒng)都是上古語(yǔ)言COBOL寫的。
然而,現(xiàn)在早已經(jīng)是C/C++、Java、Python的天下了,把COBOL程序換成Python,何其難也。
遠(yuǎn)的不說(shuō),Python 2剛剛淘汰,過(guò)去的老程序手工轉(zhuǎn)成Python 3也是個(gè)很大的工程。
既然AI能翻譯自然語(yǔ)言,那也應(yīng)該能翻譯編程語(yǔ)言。
Facebook也是這么想的,所以他們最近提出了TransCoder,一個(gè)翻譯編程語(yǔ)言的AI,現(xiàn)在可以在C++、Java、Python語(yǔ)言之間互譯。
經(jīng)翻譯后的程序,成功運(yùn)行的通過(guò)率最高可以達(dá)到80.9%。
而且TransCoder是一種無(wú)監(jiān)督學(xué)習(xí)算法,意味著不需要大量成對(duì)的、標(biāo)記的編程代碼數(shù)據(jù)集進(jìn)行訓(xùn)練。
如果這項(xiàng)技術(shù)達(dá)到實(shí)用化程度,對(duì)廣大程序員來(lái)說(shuō)真是巨大福音??!
難怪論文作者之一Guillaume Lample在Twitter上宣布了這篇論文后很快引起了熱議。
翻譯編程語(yǔ)言,什么原理?
TransCoder充分利用了編程語(yǔ)言的特點(diǎn),比如像for、while、if這些關(guān)鍵詞以及通用的數(shù)學(xué)運(yùn)算符。
下圖展示了C++、Java和Python關(guān)鍵字的嵌入。在相似的上下文中使用的不同編程語(yǔ)言的關(guān)鍵字在嵌入空間中非常接近。
例如,Python中的except和Java、C++中的catch都用于獲取異常,它們被映射到非常相似的嵌入空間位置。
對(duì)于映射的實(shí)現(xiàn)(map和dict)、用于將字符串轉(zhuǎn)換為字符數(shù)組(c_str和toCharArray)以及類似的變量類型(例如long、int和Integer),也可以觀察到相同的現(xiàn)象。
那么以上這些關(guān)鍵詞的嵌入是如何獲得的?
Facebook提出了實(shí)現(xiàn)無(wú)監(jiān)督編程語(yǔ)言機(jī)器翻譯的三個(gè)原則。
首先,通過(guò)跨語(yǔ)言掩碼語(yǔ)言模型(MLM)預(yù)處理來(lái)初始化模型,這有些類似于自然語(yǔ)言的填空題。結(jié)果是表達(dá)相同指令的代碼片段被映射到與編程語(yǔ)言無(wú)關(guān)的相同表示。
其次是去噪自動(dòng)編碼,它能訓(xùn)練解碼器始終生成有效序列,即使在輸入有噪聲的數(shù)據(jù)時(shí)也是如此,提高了編碼器對(duì)輸入噪聲的魯棒性。
最后是反向翻譯,它允許模型生成可用于訓(xùn)練的并行數(shù)據(jù)。每當(dāng)Python轉(zhuǎn)C++模型變得更好時(shí),它就會(huì)為C++轉(zhuǎn)Python模型生成更精確的數(shù)據(jù),反之亦然。
通過(guò)以上步驟,TransCoder在訓(xùn)練后獲得了之前提到的跨語(yǔ)言嵌入。
我們觀察到,TransCoder成功地理解了每種語(yǔ)言特有的語(yǔ)法、數(shù)據(jù)結(jié)構(gòu)、函數(shù)庫(kù)和方法。
在上面的圖中,展示了Java和C++獨(dú)有的三元運(yùn)算符X ? A : B,翻譯到Python中就變成了if X then A else B。
以下是一個(gè)從Python翻譯到C++的實(shí)例。TransCoder推斷變量和函數(shù)返回值的類型,將Python的deque()容器映射到C++中類似的實(shí)現(xiàn)deque<>,并使用C++的front、back、pop_back和push_back方法來(lái)檢索和插入deque中的元素,而不是使用Python方括號(hào)、pop和append方法。
實(shí)驗(yàn)結(jié)果
為了訓(xùn)練TransCoder,F(xiàn)acebook在GitHub上尋找了280萬(wàn)個(gè)開(kāi)源代碼庫(kù)進(jìn)行訓(xùn)練,其中包含數(shù)百億個(gè)token。
然后去GeeksforGeeks平臺(tái)去驗(yàn)證翻譯成果,該平臺(tái)是收集各類編碼問(wèn)題,并以多種編程語(yǔ)言提供解決方案。
和自然語(yǔ)言不同的是,代碼翻譯并不太要求逐字逐句的對(duì)照,因此翻譯后的代碼和參考代碼的重合度其實(shí)很低,比如C++轉(zhuǎn)Java的代碼和Ground Truth僅有3.1%匹配。
另外NLP翻譯中的BLEU也不宜作為代碼翻譯的衡量標(biāo)準(zhǔn),因?yàn)檫@只能表示實(shí)際代碼和參考代碼之間的語(yǔ)法差異。
因此需要一個(gè)新的度量標(biāo)準(zhǔn)——計(jì)算正確率,它表示翻譯后的代碼測(cè)試后是否能與參考代碼有相同的輸出。
以此為標(biāo)準(zhǔn),C++轉(zhuǎn)Java的代碼的計(jì)算正確率為60.9%,而Java轉(zhuǎn)C++的計(jì)算正確率為80.9%。
Facebook不是唯一開(kāi)發(fā)AI代碼生成系統(tǒng)的公司。前不久微軟Build大會(huì)上,OpenAI就演示了一個(gè)在GitHub數(shù)據(jù)上訓(xùn)練的模型,僅根據(jù)注釋內(nèi)容即可生成對(duì)應(yīng)功能的代碼。
TransCoder沒(méi)那么智能,但是在計(jì)算機(jī)技術(shù)飛速發(fā)展的今天,誰(shuí)知道下一個(gè)流行的語(yǔ)音是什么,有了TransCoder,至少讓我們?cè)谝浦泊a的時(shí)候沒(méi)那么難了。
也許美國(guó)社保系統(tǒng)的COBOL就靠它解決了。
論文地址:
https://arxiv.org/abs/2006.03511
- 腦機(jī)接口走向現(xiàn)實(shí),11張PPT看懂中國(guó)腦機(jī)接口產(chǎn)業(yè)現(xiàn)狀|量子位智庫(kù)2021-08-10
- 張朝陽(yáng)開(kāi)課手推E=mc2,李永樂(lè)現(xiàn)場(chǎng)狂做筆記2022-03-11
- 阿里數(shù)學(xué)競(jìng)賽可以報(bào)名了!獎(jiǎng)金增加到400萬(wàn)元,題目面向大眾公開(kāi)征集2022-03-14
- 英偉達(dá)遭黑客最后通牒:今天必須開(kāi)源GPU驅(qū)動(dòng),否則公布1TB機(jī)密數(shù)據(jù)2022-03-05