標籤:

能否寫出一個程序,按照需求,自動生成實現的代碼?

突發奇想,又是個開腦洞的題目!問題從大體上看好像是需求應該有類似編程語言的格式,程序按需求輸出的是實現它的代碼。打個比方,需求是「輸入」,然後輸出「scanf(「%s」,temp)」。但是我們實際在編程時好像是用程序實現一個一個小需求(輸入、輸出、讀寫文件、判斷、循環),最後拼成一個大需求,兩者似乎有共通之處。這又牽出了一些問題,又如這樣的小需求最大有多大,能不能到項目級別,可以根據這些需求直接反著推出代碼? 類似的,想聽聽大家的想法。 6月29日更新:陸陸續續有了一些回答了,謝謝大家!追加難(nao)度(dong):這個程序能不能生成實現自己的代碼?(估計這個都能咱們程序員就真的失業了,哈哈)


有人研究這個的,比較難,現在大概只能編一些非常簡單的,用一些比較暴力的做法。

用形式化語言準確描述需求就已經很難了。大部分應用程序的spec都其實非常複雜,而且經常變。

其次,寫程序(演算法和架構)基本還是一個dark art。一個靠譜的程序員在寫程序的時候會考慮的因素非常多,性能、模塊化、風格,各種考慮都糾纏在一起,很難形式描述其思考和創作過程。

能讓程序自己寫程序一直是計算機科學的夢想,但現在人連自己是怎麼把程序寫出來的還沒有完全搞明白,所以這個夢想離現實還有一段距離。不過科學的行進速度誰都說不準,說不定哪一天程序就能寫程序了,然後大部分現在看著挺風光的碼工就都集體失業了。


關於自動生成代碼的問題總是周期性的出現,說明人們還是對程序和語言的本質缺乏認識。

對這個問題的最簡單的回答是:能!而且已經被廣泛使用了。而且問題最後一句中所謂的程序員失業的事情已經發生過很多次了。當然這樣的回答肯定會讓人非常疑惑。

我們需要回到計算機歷史的曙光時代,看看那時候的編程是什麼樣的。首先,顛覆一下大家的固有印象,在很多人的直覺中程序員就等於足不出戶,交際能力很差的宅男,可是在最開始,所謂的程序員幾乎都是女的,而她們的工作性質和電話公司的接線員幾乎沒有區別,所謂的編程是通過插拔電線來實現的,也就是說手工實現0和1的交換。很明顯,這種編程方式效率是非常低下的,現在的人幾乎無法相像。於是科學家們大膽創新,發明了機器語言,此後的編程工作不再是接插電線,而使用扳開關,以及更高級的穿孔紙帶等方式向機器發送指令。此時就需要能熟練做這些操作的人員來擔任程序員的工作,之前的那些程序員們如果不更新技能就將面臨失業。隨後又出現了彙編語言,它淘汰了機器語言,又出現了FORTRAN等高級語言,讓彙編語言讓位。

從這些歷史可以看出,幾乎每當計算機技術出現革命性的進步,上一代被稱為程序員的人群都幾乎被淘汰掉,而那些具有新技能的人重新被冠以程序員這個稱呼。我們也可以看到,上面每一次的革命性技術出現時,新技術都可以被稱為能自動「編程」的技術:機器語言讓機器自動接線,彙編語言讓機器自動識別指令,高級語言讓機器能「聽懂」人話。這基本上就是自動化編程的本質。把編程等同於寫代碼是非常狹隘的。

雖然高級語言出現後並沒有再出現太多本質上革命性的變化,但是仍然有很多變化在潛移默化的進行中。從IDE、庫和框架、UML等新技術到語言本身的特性上都一直在進化。有時候甚至僅僅藉助於成熟的框架就可以快速的把需求轉化為代碼,而無需手工編寫很多代碼。而因為這些功能的實現太過理所當然,我們也已經不把它們當作編程了。

任何編程活動都是在解決問題,只不過有些問題別人解決了並且把代碼或可執行程序員發布了出來,就不再是問題了。然而總是會有新的問題需要解決,也就總會有新的技術以及掌握新技能的程序員出現來解決這些問題,而不管這些程序員是不是通過寫代碼的方式進行編程。

總結一下,自動實現代碼的技術一直有,程序員不會消失!至於當前的自動代碼生成技術也有一大堆,面向意圖編程、通過UML生成代碼等成熟不成熟的技術有很多,也有JetBrains的MPS這樣面向語言編程的工具,將需求直接轉化為代碼的方式有描述性語言、邏輯式語言等,就不再贅述了。


這個屬於人工智慧。有很多相關的研究。最近看到Facebook有在做這方面的研究,有一些成果,但離可應用的程度還差得很遠。

開個玩笑類比一下,如果把寫程序比做生小孩,那麼給定需求,自動生成滿足需求程序的程序,就是一個能指定下一胎生出醫生、航天員、總統、小販的超級智能人類,這真的是很難的呢。

那一天的到來,應該會伴隨人工智慧的高度發展。別擔心程序員失業,那時候的程序員看我們,就如我們看多年前寫彙編代碼的前輩們:看,他們居然寫Java ^_^


自動生成代碼的事兒不少見。這個事情無非就是你想用更高級、更抽象的語言去描述一個演算法,然後把剩下的工作交給機器。

隨便舉個例子,我最近剛看的一篇ICS『15的paper:ASPaS: A Framework for Automatic SIMDization of Parallel Sorting on x86-based Many-core Processors, Kaixi Hou (Virginia Tech); Hao Wang (Virginia Tech); Wu-Chun Feng (Virginia Tech)。這篇paper就是在研究了各種排序網路的特點和規律後,自動生成SIMD代碼,在生成的過程中還有針對性能的優化。

類似的paper很多。想大概了解可以參考:https://en.wikipedia.org/wiki/Automatic_programming。

這件事的難點在於,這個生成出來的代碼給不給力,性能好不好,可不可靠等等。畢竟大家都不滿足於能跑,而是要求效率。從演算法的角度上講,這件事兒有兩種辦法。一種方法認為一些先進的硬體特性,比如out-of-order excution,可以幫我們保證性能,不用我們在演算法上操心。這種叫hardware oblivious。另一種認為我們需要根據硬體架構來手動優化代碼。這種叫hardware conscious。我認為hardware oblivious的演算法是更方便代碼的自動生成,因為不用管太多硬體細節。hardware conscious的演算法就不太好搞了,需要研究演算法和硬體的特性,然後對症下藥。

至於如何自動搞定一個大的軟體工程,感覺水很深,我不懂就不吹了。


哥德爾老爺爺早就證明了這是不可能的,多讀點書再開腦洞吧。


穿磁芯的看不起打紙帶的看不起搞彙編的看不起寫C的看不起編C艹的看不起堆Java的看不起玩Python的看不起買MatLab的大致上就是這個道理 :)


那工作內容就是寫需求了,說不定比代碼還難寫


用一個大盒子把100個微軟工程師和100個程序員裝起來,留個介面輸入輸出,差不多能滿足你的需求。


問題是:能否寫出一個程序,按照需求,自動生成實現的代碼?

簡單點說,這類程序現在其實已經有了,編程的時候用到的IDE就是通過代碼來描繪需求,然後由程序自動生成機器碼的程序。用高級語言描述需求,然後由程序(編譯器之類)完成底層語言的生成,是現在的主流開發方式。

這顯然不是題主想要的,問題的關鍵不在於自動生成,而在於怎麼讓計算機了解到精確的需求。程序員的工作,與其說是寫代碼,不如說是精確的向電腦描繪自己的需求,把自己腦海中的東西使用代碼的形式放進電腦。

如果在將來會出現非代碼的其他方式能夠讓電腦理解人類的需求的話,或許就是題主想要的東西了。


樓主是想這種效果?

開發人員:要器,哥想要這般那般的軟體,給哥生成出來;

機器:收到:

XXX

BB

CCC

XXX

OK,軟體已生成


傳說中的自動AC機

把題目信息輸入進去 然後生成AC代碼


貝爾實驗室1972年開發的

Lex (software)詞法分析器生成器

算是一個了吧。

把對應的編程語言的說明,規則以及用戶代碼用lex語言寫出來,然後會自動編譯生成一個可以運行的C語言實現的對應語言的詞法分析器。


這不就是封裝成函數給你調用就行了嗎?


我覺得這和解壓縮的原理是一樣的,你想輸入少量的信息去表達大量的信息,要麼信息失真,要麼需要一個密碼本。如果不想失真,那麼輸入的信息越少,需要的密碼本的內容就越大。而且這個密碼本必然是有針對性的,也就是說一個高度複雜的密碼本能生成的程序是有限的。

——————

比如說,你設計了一款究極語言,你只要說一個字母,他就能層層翻譯最後得到一個程序。但是你最多只能製造26個不同的程序,因為字母只有26個。


同志,你只看到了C語言這一層,卻沒有看到更底層的代碼。

其實你說的「scanf(「%s」,temp)」,就已經是一級翻譯了。從高級語言翻譯到彙編,又要從彙編翻譯到機器碼,真正最原始的代碼其實是機器碼。

你所言的這個系統,實際上是進行了更高一級的翻譯,那這樣的翻譯究竟有沒有意義,才是設計這個程序的人所需要考慮的問題。類似的程序其實也有,但是針對性都比較強,比如有些程序可以比較自動化地製作安卓APP,還有些程序能較為簡便地生成一些簡單得Win32程序。


推薦閱讀:

Brian W. Kernighan和Dennis M. Ritchie當年用什麼軟體寫出了《The C Programming Language》?
任何遞歸程序都能轉換為一個等價的非遞歸程序嗎?
把函數式編程語言寫得和彙編一樣是一番怎樣的感受?
Mathematica中如何定義f[x+y]=f[x]+f[y]?
如何在Unity中實現MVC模式?

TAG:編程 |