新聞中心
還記得美國前一陣要招聘 60 歲的老程序員嗎?都怪編程語言發(fā)展太快!

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、饒平網(wǎng)絡(luò)推廣、微信小程序、饒平網(wǎng)絡(luò)營銷、饒平企業(yè)策劃、饒平品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供饒平建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
因?yàn)樾鹿谝咔榈木壒?,美國一些地區(qū)的失業(yè)救濟(jì)系統(tǒng)不堪重負(fù),而這些系統(tǒng)都是上古語言 COBOL 寫的。
然而,現(xiàn)在早已經(jīng)是 C/C++、Java、Python 的天下了,把 COBOL 程序換成 Python,何其難也。
遠(yuǎn)的不說,Python 2 剛剛淘汰,過去的老程序手工轉(zhuǎn)成 Python 3 也是個很大的工程。
既然 AI 能翻譯自然語言,那也應(yīng)該能翻譯編程語言。
Facebook 也是這么想的,所以他們最近提出了 TransCoder,一個翻譯編程語言的 AI,現(xiàn)在可以在 C++、Java、Python 語言之間互譯。
經(jīng)翻譯后的程序,成功運(yùn)行的通過率最高可以達(dá)到 80.9%。
而且 TransCoder 是一種無監(jiān)督學(xué)習(xí)算法,意味著不需要大量成對的、標(biāo)記的編程代碼數(shù)據(jù)集進(jìn)行訓(xùn)練。
如果這項(xiàng)技術(shù)達(dá)到實(shí)用化程度,對廣大程序員來說真是巨大福音啊!
難怪論文作者之一 Guillaume Lample 在 Twitter 上宣布了這篇論文后很快引起了熱議。
翻譯編程語言,什么原理?
TransCoder 充分利用了編程語言的特點(diǎn),比如像 for、while、if 這些關(guān)鍵詞以及通用的數(shù)學(xué)運(yùn)算符。
下圖展示了 C++、Java 和 Python 關(guān)鍵字的嵌入。在相似的上下文中使用的不同編程語言的關(guān)鍵字在嵌入空間中非常接近。
例如,Python 中的 except 和 Java、C++ 中的 catch 都用于獲取異常,它們被映射到非常相似的嵌入空間位置。
對于映射的實(shí)現(xiàn)(map 和 dict)、用于將字符串轉(zhuǎn)換為字符數(shù)組(c_str 和 toCharArray)以及類似的變量類型 (例如 long、int 和 Integer),也可以觀察到相同的現(xiàn)象。
那么以上這些關(guān)鍵詞的嵌入是如何獲得的?
Facebook 提出了實(shí)現(xiàn)無監(jiān)督編程語言機(jī)器翻譯的三個原則。
首先,通過跨語言掩碼語言模型(MLM)預(yù)處理來初始化模型,這有些類似于自然語言的填空題。結(jié)果是表達(dá)相同指令的代碼片段被映射到與編程語言無關(guān)的相同表示。
其次是去噪自動編碼,它能訓(xùn)練解碼器始終生成有效序列,即使在輸入有噪聲的數(shù)據(jù)時也是如此,提高了編碼器對輸入噪聲的魯棒性。
最后是反向翻譯,它允許模型生成可用于訓(xùn)練的并行數(shù)據(jù)。每當(dāng) Python 轉(zhuǎn) C++ 模型變得更好時,它就會為 C++ 轉(zhuǎn) Python 模型生成更精確的數(shù)據(jù),反之亦然。
通過以上步驟,TransCoder 在訓(xùn)練后獲得了之前提到的跨語言嵌入。
我們觀察到,TransCoder 成功地理解了每種語言特有的語法、數(shù)據(jù)結(jié)構(gòu)、函數(shù)庫和方法。
在上面的圖中,展示了 Java 和 C++ 獨(dú)有的三元運(yùn)算符 X ? A : B,翻譯到 Python 中就變成了 if X then A else B。
以下是一個從 Python 翻譯到 C++ 的實(shí)例。TransCoder 推斷變量和函數(shù)返回值的類型,將 Python 的 deque() 容器映射到 C++ 中類似的實(shí)現(xiàn) deque<>,并使用 C++ 的 front、back、pop_back 和 push_back 方法來檢索和插入 deque 中的元素,而不是使用 Python 方括號、pop 和 append 方法。
實(shí)驗(yàn)結(jié)果
為了訓(xùn)練 TransCoder,F(xiàn)acebook 在 GitHub 上尋找了 280 萬個開源代碼庫進(jìn)行訓(xùn)練,其中包含數(shù)百億個 token。
然后去 GeeksforGeeks 平臺去驗(yàn)證翻譯成果,該平臺是收集各類編碼問題,并以多種編程語言提供解決方案。
和自然語言不同的是,代碼翻譯并不太要求逐字逐句的對照,因此翻譯后的代碼和參考代碼的重合度其實(shí)很低,比如 C++ 轉(zhuǎn) Java 的代碼和 Ground Truth 僅有 3.1% 匹配。
另外 NLP 翻譯中的 BLEU 也不宜作為代碼翻譯的衡量標(biāo)準(zhǔn),因?yàn)檫@只能表示實(shí)際代碼和參考代碼之間的語法差異。
因此需要一個新的度量標(biāo)準(zhǔn) —— 計(jì)算正確率,它表示翻譯后的代碼測試后是否能與參考代碼有相同的輸出。
以此為標(biāo)準(zhǔn),C++ 轉(zhuǎn) Java 的代碼的計(jì)算正確率為 60.9%,而 Java 轉(zhuǎn) C++ 的計(jì)算正確率為 80.9
%。
Facebook 不是唯一開發(fā) AI 代碼生成系統(tǒng)的公司。前不久微軟 Build 大會上,OpenAI 就演示了一個在 GitHub 數(shù)據(jù)上訓(xùn)練的模型,僅根據(jù)注釋內(nèi)容即可生成對應(yīng)功能的代碼。
TransCoder 沒那么智能,但是在計(jì)算機(jī)技術(shù)飛速發(fā)展的今天,誰知道下一個流行的語音是什么,有了 TransCoder,至少讓我們在移植代碼的時候沒那么難了。
也許美國社保系統(tǒng)的 COBOL 就靠它解決了。
本文名稱:用AI實(shí)現(xiàn)C++、Java、Python代碼互譯!
URL鏈接:http://fisionsoft.com.cn/article/cdchjjd.html


咨詢
建站咨詢
