Facebook "TransCoder AI"可在 Java、Python 和 C++ 之間轉換代碼

2020-12-11 開源中國

Facebook 研究人員表示,他們已經開發出了一種名為 TransCoder AI 的「神經編譯器」 ,該系統可以將代碼從一種高級程式語言(如 C ++、Java 和 Python)轉換為另一種。

將現有的代碼庫遷移到更現代或更高效的語言需要大量的資源,包括財務和人力。譬如,澳大利亞聯邦銀行在 5 年的時間裡花費了大約 7.5 億澳元,將其平臺從 COBOL 轉換為 Java。而從理論上講,轉編譯器可以則幫助消除從頭重寫代碼所需的費用。但是,由於源語言和目標語言都具有不同的語法、變量類型、標準庫函數和平臺API,因此這個在實踐中其實很難構建。

據介紹,Facebook 的 TransCoder AI 則採用了一種無監督的學習方法來應對這些挑戰。它可以在無人監督的情況下不受監督地運行,從而在沒有標籤的情況下在數據集中找到未檢測到的模式,比基於規則數據集的模型要高效得多。

無論使用哪種程式語言,神經編譯器都可以將代表相同指令的代碼段映射到相同代碼段。一位共同作者寫道:「 TransCoder 可以輕鬆地推廣到任何程式語言,不需要任何專業知識就可以將代碼從一種程式語言轉換為另一種程式語言,並且在很大程度上優於商業解決方案。我們的結果表明,通過向解碼器添加簡單的約束以確保生成的函數在語法上是正確的,或者通過使用專用架構,可以輕鬆解決該模型所犯的許多錯誤。」

TransCoder AI 的準確性

Facebook 研究人員在超過 280 萬個開源存儲庫中的公開代碼上對 TransCoder AI 進行了訓練,以專注於功能級別的代碼轉換。

為了評估 TransCoder AI 的性能,他們從 GeeksforGeeks 中選擇了 852 個 C ++、Java 和 Python 並行函數。GeeksforGeeks是一個 在線平臺,用於收集編寫代碼時的問題,並提供多種程式語言的解決方案。

利用以上兩個數據,他們開發了一個名為 "計算精度(computational accuracy)"的新指標,用於檢查翻譯後的函數在輸入相同的情況下是否會產生與源語言相同的輸出。

結果

這是 AI 從以下位置轉換代碼時獲得的結果的準確性水平:

  • C++ to Java: 74.8%
  • C++ to Python: 67.2%
  • Java to C++: 91.6%
  • Java to Python: 68.7%
  • Python to Java: 56.1%
  • Python to C++: 57.8%

研究人員表示,TransCoder AI 已經展示出對每種語言(Java、Python 和 C ++)的語法及其數據結構的理解。它甚至能夠正確地調整每種語言的庫,同時適應小的修改--例如,重命名輸入中的一個變量。儘管 Transcoder 並非十分完美,無法在代碼生成過程中考慮某些變量類型。 但是,它的性能確實優於已有的利用專家知識手動構建的框架。

完整論文地址:https://arxiv.org/pdf/2006.03511.pd

相關焦點

  • 7.5億美元做代碼轉換?一個Facebook TransCoder AI就夠了!
    代碼的遷移和語言轉換是一件很困難且昂貴的事情,澳大利亞聯邦銀行就曾花費5年時間,耗費7.5億美元將其平臺從COBOL轉換為Java。而Facebook最近宣稱,他們開發的一種神經轉換編譯器(neural transcompiler),可以將一種高級程式語言(如C ++,Java和Python)轉換為另一種,效率飛起!從 COBOL 到 Java,TransCoder能幫你省下7.5億美元不同的程式語言之間也可以自動轉換了!
  • ai本身涉及到的東西有哪些?核心是什麼
    人工智慧的大多數技術都可以寫出像網頁一樣的代碼,可以使用類似python的庫。也有相應的專用語言支持ai,主要是一些工具語言(比如python的pypcgl,perl的scip)。部分ai庫內置了機器學習的算法,這些算法實際上大多都是在離散數學中的概率論中的數學模型。
  • 為什麼入門大數據選擇Python而不是Java?
    Python具有豐富和強大的庫。它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。7月20日,IEEE發布2017年程式語言排行榜:Python高居首位。java和python,都可以運行於linux作業系統,但很多linux可以原生支持python,java需要自行安裝。
  • C++、java 和 C 的區別
    一、基礎類型c++:** java:** C#:1.以java為準,c++裡面的int short long 像這樣的整型 一般都有unsigned 和signed的區分 ,這個跟java和c# 的區別比較大,但c#裡面有unit ulong ushort 這三種就相當於c++的修飾詞unsigned,當c++李明的變量類型定義unsigned,就默認是整數。
  • python+C、C++混合編程的應用
    我看到的一個很好的Python與c/c++混合編程的應用是NS3(Network Simulator3)一款網絡模擬軟體,它的內部計算引擎需要用高性能,但在用戶建模部分需要靈活易用。NS3的選擇是使用C/C++來模擬核心部件和協議,用python來建模和擴展。這篇文章介紹python和c/c++三種混合編程的方法,並對性能加以分析。
  • java大數據和python大數據的全面對比,哪個更主流?
    java大數據與python大數據說到java編程,java工程師一直都是同行的高薪崗位,而python是從最初的2016人工智慧開始爆發,從而在短短兩年之內能趕超java。隨著python的發展,最大贏家無疑是python。
  • Python, C++和Java代碼互翻,Facebook開發首個自監督神經編譯器
    譯者 | 劉暢將早期的程式語言(例如COBOL)的代碼庫遷移到現在的程式語言(例如Java或C++)是一項艱巨的任務,它需要源語言和目標語言方面的專業知識。COBOL如今仍在全球大型的系統中廣泛使用,因此公司,政府和其他組織通常必須選擇是手動翻譯其代碼庫還是盡力維護使用這個可追溯到1950年代的程序代碼。
  • 5個最優秀的Java和C#代碼轉換工具
    和 Java 類似,C#也是一門擁有很多現代化特性的程式語言,很多開發者處於其安全性和穩定性,會選擇 C# 這個平臺。本文介紹了幾個最優秀的 Java 和 C# 代碼轉換工具,希望對開發者有所幫助。
  • 零基礎學習 Python 之 for 循環語句
    同時寫這個教程也算是對自己之前所學知識的一個鞏固和提高,喜歡的朋友們可以點個關注,有問題歡迎隨時和我交流。本文所有的代碼編寫均是Python3 版本。循環( loop )是生活中常見的現象,如每天的日升日落,鬥轉星移,都是循環,程式語言的出現就是為了解決現實中的問題,所以也少不了要循環。
  • 軟體測試再也不糾結選java還是python了
    python、Java都是強調數據類型的強類型語言。雖然python變量使用前無需聲明,但python的變量並不能進行隱式轉換。
  • Python和Java語言,新手應該先學哪個
    我先表明下自己的觀點,java和python這兩門語言,都要學習,但是,要有先後順序。強烈推薦先學習java。java是個嚴謹、高效的程式語言,出道20餘年,在編程兵器排行榜上,常年佔據前三。有不少企業的大佬一開始拍腦袋決定使用腳本語言開發項目,到後來要麼是死掉了,要麼是變強大了,強大之後,就意味著人員不足,項目失控,腳本語言真心不適合後期的維護和擴展,人一多,項目就會變得失控和不可維護,坑自然就很多,整個項目就會拖死。不得已,很多項目都會遷移,從python遷到java,ruby項目遷移到java,這樣的例子每天都在上演,何必呢!
  • 在C++中將string轉換為char數組
    輸入 : string s = "linuxmi" ;輸出 : char s[] = { 'l', 'i', 'n', 'u', 'x', 'm', 'i' } ;輸入 : string s = "python" ;輸出 : char s[] = { 'p', 'y', 't', 'h', 'o', 'n' } ;一種方法是將string
  • python,語法簡單,容易上手,基本上教程看一遍就能用
    而且ai語言一般都還是學習成本很大,因為這個領域比較新,代碼也比較複雜,如果沒有對該領域很深入的把握,可能學著學著就累了,基本功不紮實,寫出來很多都是從mlinference角度去搞。其實在中國這種ai人才緊缺的情況下,學ai語言是個不錯的決定。
  • 【收藏乾貨】基於Appium、Python的自動化測試環境部署和實踐
    解析這些command,把這些command轉成行動裝置可以理解的形式發送給行動裝置,然後行動裝置執行完這些command後把執行結果返回給server, server再把執行結果返回給client。client就是發起command的設備,一般來說就是我們代碼執行的機器,執行appium測試代碼的機器。
  • Python與C/C++之間還可以這樣玩?
    抽象到讓使用模塊的代碼無法了解到模塊的具體實現細節。Python的可擴展性具有的優點:方便為語言增加新功能、具有可定製性、代碼可以實現復用等。為 Python 創建擴展需要三個主要的步驟:創建應用程式代碼、利用樣板來包裝代碼和編譯與測試。
  • 小白數據分析——Python職位數據分析全鏈路
    import jiebajob_req = '熟悉面向對象編程,掌握java/c++/python/php中的至少一門語言;'# 全模式seg_list = jieba.cut(job_req, cut_all=True)# 精確模式seg_list = jieba.cut(job_req,
  • 那些容易犯錯的c++保留字
    while 和for 以及 do,這三者也就是循環的化身,用於循環語句。this 、goto、break、continue、switch、case、default,這些用於跳轉或者分支,從英文意思可以非常容易理解。至於數據類型,c++一共7個基本的,bool、char、int、float、double、void、wchar_t。
  • 讓Python代碼更快運行的 5 種方法
    下面是五個方法可以在某些方面提高Python代碼的性能和執行效率。PyPy在選擇CPython的簡易替代語言時,PyPy無疑是最佳之選(如Quora就是由它編寫而成)。由於與現有Python代碼保持高度兼容性,PyPy也是默認程序運行時的一個很好選擇。
  • Facebook AI 用深度學習實現程式語言轉換,代碼庫遷移不再困難!
    從舊式程式語言(例如COBOL)到現代語言(例如Java或C ++)的代碼庫遷移是一項艱巨的任務,需要源語言和目標語言方面的專業知識。例如,COBOL至今仍在全球大型機系統中廣泛使用,因此公司,政府和其他組織通常必須選擇,是手動翻譯其代碼庫,還是致力於維護使用可追溯到1950年代的語言編寫的代碼。