有沒有可能運用人工神經網路將一種編程語言的代碼翻譯成任意的另一種編程語言,而不經過人工設計的編譯過程?

編譯到其他語言需要專門設計的編譯器,而且得到的結果只是原始代碼的可執行版本,而不包含原始代碼的設計;如果需要仿照原來的演算法用另一種語言重新實現,現在必須要人工進行。

如果說自然語言可以運用神經網路大大加強翻譯的準確性的話,相同的技術是否也能運用到編程語言上呢?

訓練材料可以考慮使用OJ網站上同一個題目的不同編程語言的提交代碼之類。


純粹只用神經網路做一個 end-to-end 的編譯器的話,可行性未知(至少訓練材料不會缺,有參考實現的編譯器即可,社區還有很多 fuzzer 可以生成各種千奇百怪的 corner-case),意義有限(語法和語義都很容易用規則填出來,為什麼要調參)。

如果只是在傳統編譯器框架裡面搞編譯優化,那些需要各種 heuristics 的場合,才是神經網路真正應該發揮作用的地方。

rust 社區相關討論:Machine learning primitives in rustc -- An Opportunity


非常有意思的問題。實際上已經有不少前沿工作了:

  • 給定名稱,簡單函數的自動實現(Berkeley,如果沒有記錯)
    • 如函數名str_to_int,可以正確的生成這個函數的代碼
  • 代碼塊的自動組合(AI Programmer(Intel)),不過是啟發式演算法

AI Programmer

  • 測試代碼的自動補全、生成(Diffblue)
  • 各類無約束的翻譯(NMT/Image to image translation)
  • 爐石的卡牌描述自動理解與函數生成(DeepMind)

但是編譯器很複雜,不僅是詞法語法的解析,還有各類標準的約束,不能用模糊推理來做,約束是非常嚴格的。要做理解,可能要準確的理解幾百頁甚至幾千頁的標準文檔(或者它的一部分子集),並能夠搞明白編譯器和標準的區別,理解各類未定義行為。可想而知:

  • 幾年之內,基於NN的理解+推斷恐怕並不容易達到精確、可用的標準。
  • 十幾年內,樂觀估計,是可以看到這個工作的完成的。

並且,既然能夠理解代碼,並進行推斷,那麼離正確的構造出可用程序也已經不遠,AI就有極大的可能可以進行真正的自我強化,意味著:強AI的時代馬上就會到來了。


主要問題是直接寫個source to source的編譯器就能達到100%的準確率了,而你訓練NN不知道什麼時候才能達到非0的準確率呢……

這個跟自然語言處理有不同之處。自然語言在有NN前的解決方案更糟,所以NN進來可以有改進。代碼翻譯本來就是切實可行的工程問題,現實中代碼翻譯的項目不多只是這種工程並不總有性價比。

不信你看javascript世界,首先有各種各樣的專門設計成編譯到javascript的語言,然後有各種各樣的把別的語言編譯到javascript的編譯器,然後有各種各樣的just in time的編譯器去在運行時把javascript編譯成機器碼來跑……這並不是因為javascript這個語言本身的特性有什麼過人之處,而是它作為web前端世界的唯一通用語言而使得它特別重要。重要的事情就有價值。

我覺得AI更適合去做一些還沒有完全被解決的問題。比方說現有的解決方案也只是heuristic,那麼很可能你有很大的樣本去訓練一個新的heuristic,我會覺得靠譜很多。

比方說你來做一個AI,它「看」一遍程序就給出一些分支概率的預測,我覺得我是能相信它可以比編譯器里的那些手寫的規則要好的,雖然還是比不過真的profiling。

EDIT

還有一個問題是自然語言的翻譯天生是局部的。歸根到底都是人。不太存在說一種自然語言的散文翻譯到另一種自然語言里變成了詩歌,或者一種自然語言的小說到了另一種自然語言里,敘述順序發生了變化。

但是比方說你要把shared-memory通信改寫成message-passing,還要保持語言的style不變化。嘿嘿嘿。


理論上可以,因為RNN can arbitrarily appoximate a Turing machine,所以如果存在這樣的編譯器,就存在近乎等價的RNN。

實際操作則得不償失。機器學習只適合容錯高的task,畢竟是以概率為基礎的方法。一段文本經過機器翻譯後,即使有一兩句話有語法甚至語義問題基本上也不影響整個文章的理解。而代碼作為形式語言,容錯則非常低,失之毫釐,謬以千里。

深度學習就更不適合了,出了bug都不好調試。生成的代碼難以保證可讀性和可維護性。

另外,題目提到的還有一個訓練數據的問題,怎麼判定OJ上面的兩個不同語言的提交是同一種演算法?不能用自動方法判定的話,就需要大量的程序員手動label。有這麼大的投入就不如直接寫個編譯器了。


這問題是我提的,真是沒有意思,我回答上千個編程類的問題,一共就提過兩次問,心血來潮討論一個可能的方向,被嘲諷不知道什麼是編譯器,不懂編譯原理,不知道什麼是轉碼器?我開發好幾個上萬行代碼項目,還是不同語言的人,一種編程語言都不會?

我科班畢業工作4年的人沒用過gcc是怎麼的?寫十幾年C++不知道什麼是編譯?

提這個問題是因為看到了另一個討論Google的機器翻譯中應用人工神經網路的問題,說實話實際看到的效果大大出乎我的意料,許多我以前認為機器翻譯無法達到的效果都已經實現了,比如說中文和英文中同一個語義有不同的習慣性的語序,都可以自動調整過來,甚至可以將修飾內容從一個從句移到另一個從句中。所以我在考慮,相似的技術是否也可以用於編程語言?

在我看來,編程語言是有兩面的,它的一面是面向人的介面,另一面是面向機器的介面。編譯(以及解釋執行)是面向機器的一面,通過程序,它可以將一段高級語言轉化為可執行的機器碼(或者中間碼,還可以是中間語言比如說Javascript)。

但是,轉化為可執行代碼的過程,只保留了程序如何執行這一信息,而丟失了:

  1. 這些程序基於怎樣的業務場景被設計出來?
  2. 這些程序採取了什麼樣的架構設計?
  3. 這些設計中體現了作者什麼樣的思想?

所以說,編譯器將一段程序編譯成了可執行代碼,這和程序員閱讀一段程序之後,將它改寫成另一種語言,是一種完全不同的操作。編譯器保證編譯的過程絕對正確,但是在這個過程中,最開始編寫程序的人的思維方式丟失了;而由程序員改寫,則可以將原來的設計在一定程度上作為保留。這也正像是自然語言翻譯中發生的事情:翻譯的人需要理解原作者想要表達的含義,然後用另一種語言將這個含義表示出來,而不是堆砌原來文字中每個字詞的字典解釋。

我希望達到的所謂「翻譯」而非「編譯」的效果,正是希望在這個過程中,原始的架構設計、業務命名乃至於設計思想、設計風格能夠在一定程度上被保留,以至於生成的是可維護的代碼,類似於找一個程序員來照著重寫的效果。

既然機器在不可能完全理解自然語言中的含義的情況下也可以做出相對準確的翻譯,那麼編程語言為什麼不可能呢?

請不要忽視編程語言也是一種為人使用而設計的語言這一事實。既然它為人使用而設計,計算機直接生成起來就是有困難的、複雜的,所以用神經網路進行擬合併沒有什麼值得奇怪的地方。

至於應用,可以說這個問題本來就是探討可能性,也和很多人討論過錯誤率的問題,但畢竟可能與否可能是0到1的關鍵。如果說從一種編程語言翻譯到另一種編程語言是可能的,那麼從自然語言翻譯到編程語言呢?從業務需求描述到UML呢?

世界很大。


麻煩做NN的都注意一點,為什麼要出現ML這種東西?是因為要處理的對象太過複雜,影響結果的變數可能有成千上萬個,難以用單純的規則來限定,這個時候才要藉助ML的辦法來「擬合」好嗎?

編譯是一門嚴謹的科學,有明確的定義和規範的。煉丹的就別想著指導化學的進展了。

kripken/emscriptengithub.com圖標

自己看emscriptem,LLVM到javascript,不是做得好好的?

paulcuth/starlightgithub.com圖標

lua to javascript。

cincheo/jsweetgithub.com圖標

java to javascript。


當然是有可能的,你找一隻猴子來,他也有可能在鍵盤上打出莎士比亞

所以很多人不喜歡現在的人工智慧吹……就是這個原因


當然可能啦,在知乎上,對於一個問題的解決,一般遵循這個選擇尋找答案:

這個問題涉及金錢嗎?

涉及:區塊鏈可以解決

不涉及,這個問題有實際物理世界的交互嗎?

沒有,只用電腦就能解決,好,機器學習可以解決

有交互,這個問題可以用電嗎?

可以用電,人工智慧機器人可以解決

不可以用電,工匠精可以解決

所以,可以解決一切問題的終極解決器是

使用機器學習學會區塊鏈技術的工匠精神人工智慧機器人

啥?設計不出?有機器學習設計不出的東西?

啥?沒錢?有區塊鏈賺不到的錢?

啥?造不出?有工匠精神玩不出的玩意?


這真不是編譯器乾的事嗎

---分割線---

所以說,編譯器將一段程序編譯成了可執行代碼,這和程序員閱讀一段程序之後,將它改寫成另一種語言,是一種完全不同的操作。編譯器保證編譯的過程絕對正確,但是在這個過程中,最開始編寫程序的人的思維方式丟失了;而由程序員改寫,則可以將原來的設計在一定程度上作為保留。這也正像是自然語言翻譯中發生的事情:翻譯的人需要理解原作者想要表達的含義,然後用另一種語言將這個含義表示出來,而不是堆砌原來文字中每個字詞的字典解釋。

作者:靈劍

鏈接:https://www.zhihu.com/question/264743978/answer/285324941

來源:知乎

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

題主的補充和原來的描述完全是兩個問題,難道大v來提問就不用先學《提問的智慧》嗎

不懂nn,但是如果保持原意的source-source轉義,或者source-uml-source轉義達成了,還要碼農幹什麼,所以不可能實現的(


(調整順序)

個人認為如果是用神經網路,可能需要在 抽象語法樹 域做處理 使用非歐幾里得空間的卷積神經網路做,當然輸出的也應該是抽象語法樹。用 RNN 加上 特殊域的樹CNN 或者 圖 CNN。

(發現題目有修改)

。。自然語言翻譯,還無法達到翻譯到任意語言,現在應該最多是遷移學習。機器的話,估計就懸了。

(還有評(chao)論(feng)一些某些回答)

我只舉個例子諷刺一下谷歌,一群人真是閑的,開車有司機就夠了,還要讓訓練一堆模型。。/

還要考慮一個問題,是自然語言複雜,還是編程語言複雜。

現在 有在做 NLP 能翻譯自然語言,但是似乎編程語言和計算機語言還是有區別的。

首先計算機語言需要精準翻譯,自然語言翻譯有些偏差的話,還是能被人理解的,人會自動補充上下文。單純的 ANN 做可能會導致缺失一些至關重要的內容。(但是經過後期的處理是應該能修復的)。此外 編程語言在某些程度上可以理解為為一中抽象的代數。

題外話,為何不直接實現 烏托邦84,(名字應該沒記錯),直接自然語言轉換成程序就好了。。


「孔子說過,不要拿蚊子打大炮」


沒有什麼問題是「機器學習」解決不了的,如果有,那就用「區塊鏈」解決。

所以我猜要用「區塊鏈」才能解決這個問題!

===

呵呵,牛鬼蛇神。拿無知當盾牌?


從map到for, 需要強人工智慧, 至少要學會推導.

因為不存在漸進的編程打分系統, 只有work和不work.


可能會有些效果,但是這就像自動駕駛一樣,百分之一的缺陷就很致命了……


私以為:

無論是之前傳統基於規則的翻譯,還是現在用神經網路做翻譯。都無法保證100%的翻譯準確。

而對於代碼來說,你少了個符號,多了個修飾符,要麼不work,要麼就會跑出很玄學的效果


為什麼要用神經網路?!

如果目標是編程語言間的轉換,而且有這種必要,那也不一定非得用機器學習的方法呀。如果真的要做類似翻譯的工作,編程語言的規則性更強,是和自然語言的複雜不可同日而語,所以有可能工程的方法更合適。


有個很嚴重的問題,翻譯的質量很多時候只是比較主觀的優劣之分,而具體到代碼的話,正確與否就很關鍵了吧……

畢竟編程語言的約束比文字語言要嚴格些吧,而且更看重上下文匹配。文本里你直接替換一個同義詞可能沒什麼,但代碼里替換一個函數或者一個步驟可能就需要前後匹配,大改了……

拿OJ數據訓練?可是一道題也能有很多種演算法啊,就算同一種演算法,寫法也五花八門,到AST層面也可能有多種匹配,這大概不能算是很好的訓練材料吧……


就我個人所知道的範圍來說,有一篇DeepMind的論文Nerual Program Interpreter: https://arxiv.org/pdf/1511.06279.pdf 能實現一半的功能。此論文的內容是將程序編碼成狀態序列,然後輸入LSTM中,用對應的操作序列去訓練。最後得到的端到端的系統是能夠讀入程序的原始輸入,得到程序所需要的輸出的。

我個人的想法是,程序既然能夠通過神經網路解釋執行,那麼肯定也能夠翻譯成別的語言。理解成翻譯過程是完全合理的。具體的相關工作不太了解,僅供參考。


我感覺可以 甚至可以更進一步 輸入需求就能輸出代碼

這才應該是吾等努力的方向啊


如何處理javascript的==和===


推薦閱讀:

怎麼選取訓練神經網路時的Batch size?
模式識別、機器學習、神經網路、(泛函分析?)的學習順序
機器學習中梯度下降演算法公式是不是有問題?
梯度下降or擬牛頓法?
CNN卷積神經網路當前最主要的應用除了圖像處理還有其他的應用方面嗎?

TAG:編程語言 | 編程 | 神經網路 | 深度學習DeepLearning |