編程可否做到自動化?

編程能不能做到編輯幾條基本指令程序,然後讓這些程序去自發的組合完成自動編程。工作方式類似於DNA自我編輯製造人類那樣的程序可能出現么?

補充:舉例DNA只是因為DNA雖然複雜且信息量巨大,但是他的複製方式卻是很簡單的四種鹼基兩兩配對,如同拉拉鏈方式的複製,再就如同《生命遊戲》那樣。共性在於給定一種複製規則,之後遵循這種簡單規則完成複雜程序的複製(既提問中自我編程)的可能性。

再補充:謝謝各位的回復,不過重申一下,題目重點在於可行性,請不要再說「這個叫AI」之類與「可行性」討論無關的內容,謝謝。


不知不覺,遺傳演算法已經四十歲了……


自動化也要分層次,幾十年以前的程序員看到現在的開發環境肯定會覺得這太自動化了,現在大家覺得這是理所應當的事情。所以如果考慮到大眾口中「自動化」的概念的不斷變化,回答這個問題大概先要討論強人工智慧的可行性,然後問題就收不回來了……


封裝程序員。


只要你能精確描述你的需求。其實就可以自動編程了——實際上程序員的工作就是精確描述需求,讓機器獲得正確的結果。程序員實際上把你含糊不清的需求,經過溝通和腦補之後,精確描述給機器。外帶運用到自己的知識彌補你需 求中邏輯和數據上的不足和缺陷。

==============

所以說,程序員永遠無法被取代——除非產品經理真的能做到精確描述需求。


理論上,編程的過程是把你的想法變成機器代碼的過程。人們應該只編寫必要的代碼。而這裡面不涉及自動化,只是編程人員的水平問題。水平高自然語法簡潔。菜鳥自然啰里八嗦。

如果要進一步解決抽象層級的問題,應該使用DSL。只包含一些簡單的設定,而機器自動調用相應的功能實現你後面複雜的要求。但是這個過程依舊不涉及自動化,只涉及可復用編程的內容。

年輕人好好學演算法,不要做夢了。

答二:感覺自己說話特啰嗦,還喜歡無形裝逼。還是改一下好了。

我的感覺目前的人工智慧還做不到自我編程。不要神話機器學習啊,神經網路演算法之類的名詞。如果設置場景,分別實現不同的功能,這種感覺像是策略模式。而無論是元編程,動態語言,策略模式,DSL等等這些都是已知的技術,廣泛應用且非常基礎。本質上,代碼都是人寫的。

題主要求的東西目前根本就做不到。因為機器是沒有自主創造性的。目前的的演算法根本解決不了這些問題。讓機器人用已知片斷隨機拼湊一段動聽的音樂都做不到。何況編程?這個的邏輯複雜度和目標反饋都難太多了。


如果試過用C語言在DOS下寫編輯器,再用C#的時候,就覺得實在太自動化了。

當你試過用標準C語言實現FFT,再用Matlab的時候,就覺得太自動化了。

是的,高級語言加上高級工具,就是那麼的自動化。


在限定約束範圍內編程可自動化。

不限定約束範圍編程無法自動化。

無限的那是上帝。

雖然我不相信上帝。

但是超越理解範圍的無限真實存在。


你說的這個其實就是「說明性的知識(declarative knowledge)」與「行動性的知識(imperative knowledge)」之間的差別,現在的編程語言基本上都是過程性的「行動性的知識」,即解決「如何做」的問題,所以現在有一個研究領域是關於設計超高級語言(very high-level languages),其目的是:

The idea is to make interpreters sophisticated enough so that, given 「what is」

knowledge speci?ed by the programmer, they can generate 「how to」 knowledge automatically.

即程序員不用像現在一樣總是告訴計算機「如何做」,只要告訴計算機「問題是什麼」,那麼程序可以自動化地由「是什麼」的知識推出「如何做」的知識,舉一個很簡單的例子,平方根的定義很簡單:sqrt{x} = the hspace{4mm} yhspace{4mm}  suchhspace{4mm}  thathspace{4mm}  y geq  0 hspace{4mm} andhspace{4mm}   y^{2} = x

但是僅僅給你一個這樣的定義(說明性的知識),還是不知道如何求一個數的平方根,如果有一門語言,只要描述清楚這個問題,便可以知道「行動性的知識」 ,那麼,這種自動化才是最有意義的。


關鍵詞:軟體工程的形式化方法。


沒人說計算原理么?如果存在可以根據輸入生成任意其他程序的程序A,那麼A是否能夠生成A本身?

於是,從前有座山,山裡有座廟……根本停不下來啊~~~~~

如果只能根據特定輸入生成程序,那麼直接解決不就好了。

計算原理才是王道啊,一台圖靈機定義出來之後,transition table就已經定義好了,你讓他怎麼根據不同輸入做出修改嘛。


自動化的意義也是一直在變的。

具體說就是隨著編程語言越來越高級,「設計」和「實現」的邊界一直在往人的一側移動。

然而,「幾條指令」肯定是不夠的。因為複雜的程序需要大量的細節。除非很多功能固化而無法更改了,作為一個不可拆解的單元被提供。這種東西其實就是現在所謂的「軟體」:只要一條「下載」指令和一條「安裝」指令就夠了。


如果編程自動化了,你還是需要碼農來寫使編程自動化的程序



如果Template Haskell等metaprogramming工具算的話已經算是可以自動化了吧

雖然我覺得題主不是想要這個。。。


這個問題的存在只是因為把「自動化」用爛了罷了。

所以這個問題本來就不應該存在才對。或者題主能夠講一下什麼才叫自動化呢?

在我上學的那個年代,自動化指的是現在海信和富士康用的那些東西,所以還有個專門的工業與自動化專業,後來好像又叫自動化控制專業了。

在我上班的那個年代,自動化指的是在網頁上點擊一個鏈接的人類行為,連編輯那幾行指令的行為都是不允許的。所以還有個專門的自動化了多少的的KPI出來。

至於題主設想的編輯幾條簡單的指令,然後計算機去展開成成千上萬行代碼什麼什麼的,,,,,你真的沒有看過別人用DSL 嗎?你真的沒有看到過有人寫Lisp Macro 嗎?或者再退一步,你真的沒有看見過別人調API 嗎?

當然了,你大概認為那些行為調用的代碼都是事先寫好了的,即便是Lisp Macro 的展開也是事先寫好的編譯器做的,那麼你到底是想要什麼呢? 你想的是每次 Macro 展開的時候都現場連編譯器都重新擼一遍嗎?你有那麼多時間等嗎?有現成的binary 幹嘛不用?

或者你是自動化原教旨主義者,一切要從真空量子漲落開始擼......

至於真的要從真空量子漲落開始擼,或者就從題主心裏面懵懵懂懂的感覺的那種「自動化」的角度來說呢,那就根本不叫「自動化」了。那東西叫智能,「我不知道紅樓夢裡的智能兒為什麼也叫這個名字」 智能的領域難的是推理。但是推理這個領域的東西在編譯器裡面也有。只是我不會罷了。


這個問題還是可以探討一下的。現在有的項目發布就是帶其他子項目,在github上。當你配置好之後,如果需要其他的子項目,會從github下載,然後編譯。就是一個腳本。當然哪些子項目是腳本定好的。如果開開腦洞的話,還是有可能讓電腦自己去查找項目然後下載編譯的,比如你寫個腳本讓電腦去跑,跑個幾個月之後電腦可能給你組裝好了幾個app,甚至可以自動幫你發布到app市場去。還有,電腦可以自己運行一個虛擬機,還能截屏,加上ocr。。。


編程可以干任何事


早就有了。

編譯器就是個自動化,這東西早年都是人類手動乾的,後來諸多演算法成熟後人類發現自己優化不過編譯器,就放棄了。你現在給幾個參數,編譯器自己幫你編譯鏈接優化,基本就等於你說的第一句話。

我自己都有簡單的編程自動化。給幾個參數,程序自己幫我寫makefile。

Hexo把幾句markdown寫成複雜的有js有css的網頁,同理。

你如果是想把幾個參數結合context來translate成一段程序。這麼看NLP也是自動化,參數的多少不影響本身的性質。

不存在機器思考這個問題,因為機器是執行,想寫程序的是你,所以你要提供足夠的信息。除非問什麼時候機器自己能產生寫程序的慾望,那才會問機器會不會思考。

你知道在宇宙studio或者xcode里,你點一個按鈕他們會為你自動生成多少代碼?


然後你可以用它通過圖靈測試,再然後人類可能就滅絕了。


你說的能自動編程的程序,還有個名字,叫做:AI……


推薦閱讀:

如何看待現在文科理科化的一些工作?
校強我弱,難以組出有實力的ACM隊伍。有哪些含金量高的、單人參加的演算法競賽可以作為ACM的替代品?
AlphaGo 和人類棋手比起來誰消耗的資源更多?
計算機專業去英國讀本科還是加拿大?
應屆生找工作,對C++的要求是怎樣的?

TAG:編程語言 | 編程 | 計算機 | 計算機科學 |