對自動編程感興趣,已經有2個多月了,想把這些想法在這裡整理一下。
說叫自動編程,其實,能把編程的效率提高一個數量級就很不的了,就是找到了所謂的銀彈,這個領域內的方法很多(Intentional programming, MDA, generative programming, language-orIEnted programming意圖編程,模型驅動架構,產生式編程,面向語言編程),這個領域現在是世界性的熱點。國外很多強手,都想有所突破。包括,開發了word 和Excel原來微軟的誰,誰,誰。。。開發了著名IntelliJ IDEA 的誰誰,誰,真是強手如雲呀。但是,要看到Word 、Intellij 這些東西,都是沒有智能的軟件。。。
要是Lisp 語言的開發者(人工智能的領軍人物?我懶得去查了,我接觸過他的論文。他對圍棋軟件有什麼什麼評價),來開發這個那真是令人生畏。。。
拉遠點,先說人的行為和程序的關系,人的行為是什麼?本質就是一步一步地做,如果說有一件事你不會做,那就是某一步,或某幾不,你不知道是怎麼做的,如果說,某個事情你會做,就是能把這個事情,分解成簡單的行動方法(猩猩去取屋頂上掛的香蕉:先搬來一個箱子,再摞上一個箱子,爬上去,取到香蕉,放到嘴裡。。。。),一步,一步,你都能做的來, 更復雜的是,你一邊做,環境和情況同時在變化,怎麼辦?if 這個條件 {我就這麼做}
Else {怎樣,怎樣}, 同樣的事情一大堆怎麼辦? While(沒完){重復做,if(情況有變){怎麼怎麼處理},再接照怎樣怎樣做},人在干事情的時候,腦袋裡分明執行的就是一個程序。
不是嗎?
再回頭來說,自動編程,說是自動編程,你總得輸入點什麼,所以永遠是半自動編程。輸入的是什麼,輸入的是比我們所用的通用編程語言(象C、C++,C#)更高一級的,更抽象的指令集產生的結果可以是這些通用語言或直接就是機器語言。我們現有的通用語言的缺點是,程序員要在你的頭腦中,把你的意思翻譯成通用語言(C 之類),這個翻譯過程就很不舒服,你不能有一點的含糊,和錯誤,前後的完整性一點問題也不能有,計算機沒有絲毫的邏輯修補能力,所以這是一個及其費時、費力的交流過程。你可以用一會就能把一個程序向程序員交待清楚(如有語誤和含糊,問題不大),和程序員交流的時候,你可以只說重點的和關鍵之處,而要開發這個程序(程序員向計算機交待清楚),可能好幾個星期。人機交流的效率,如果用通用的開發語言,真是太低了。這是寫程序,改程序更是這樣,你先要找到已經“加密”(程序員就是加密者)在程序裡的意圖(intentional programming),然後把你的意圖影射到通用的語言(例如C)裡,也是耗力的過程(即使你有文檔的幫助,大部分的時候文檔又不能及時同步)
所以我們編程序的時候,希望的是輸入計算機的是更高級抽象語言,而不是現在效率低的通用語言。通用語言的語句也好,函數也好,都是一些具體的指令或指令集,特點是沒有絲毫含糊之處,這樣用起來對人腦的壓力在有的時候就很大。我們想找到的高級抽象語言(Intentional programming, generative programming, language-orIEnted programming這些東西的目標)就一定要具更高抽象度,和模糊的特點。否則你如果要說的清清楚楚,明明白白,一點都不拉,這不就是通用語言嗎?(C, C++,C#等)如果你要叫一個人某個事情,對方又毫無知識背景,這時候的交流,就很象和機器的交流了(碰到情況就怎樣是:if(XXX) 就去做YYY。 碰到需要重復的就是: WHILE(沒做完){。。。。。。。。}。 對語言來說,所謂的抽象必然導致模糊(沒有全說,有的地方必然安默認的方式處理,還有的地方要背景知識來修補邏輯)。這種抽象的語言(也可以說是一種銀彈---在什麼什麼時間裡把軟件的開發效率提高一個數量級)的語句到底要表達的是什麼?也可以叫它為意圖(intentional programming),說到底是任務,計算必須有能力把交給它的任務,分解成子任務。。。最後到可執行的機器碼。這種把高層次的任務,逐步分解的能力,也是機器人所應具備的,一個領域的突破會導致另一個領域的突破。告訴計算機一步一步做是有計算機以來所有語言的特色。而純基於目的或任務的計算機語言一直也沒有出現,為什麼?也不可能出現,當人和人交流的時候,對方如果毫無知識背景,你說的話,也就很類似現在的計算機語言了,人把自己的 數學思考,一定要表達成語言的話,現在的計算機語言也是不錯的選擇。人交流的時候,有背景知識,常識,以及眾多的詞匯。
DSL(領域專用語言)怎麼樣? 先搞一個META-DSL開發環境,你如果要在某一領域開發,先用這個開發環境開發一個 DSL(或用別人的),再用DSL開發你要的東西,聽起來很誘人(聽說有有了不少成功的DSL)。但一個明顯的問題就是部分開發是跨領域的,問題好像不能輕易解決。
現有的基於模塊的開發系統怎麼樣?genexus有很長的開發歷史,用它開發企業應用不需要編程, speed designer等等 (自動生成部分ASP.Net程序),這些東西都不理想。每個模塊你如果想增加更能,只能求助於現有的編程語言,如果誰搞出一個基於模塊(類庫?)+抽象語言+開發環境(IDE),而且模塊(類庫)的擴展(功能擴展!)和創建,都完全依賴於這種抽象語言。另外用這個系統也能夠構建出和本身IDE類似的IDE,實在是一個進步。我想這種抽象的語言如果構造出來, 裡邊現有的通用語言的影子是揮之不去的。能用OlivaNova(一種自動商用軟件代碼生成系統能構造出其本身的各個模塊(OlivaNova modeler 之類)嗎?功能限制明顯在這裡嘛,什麼叫商用軟件? 外延是沒有邊界的。我想如果發明出來,這種抽象的語言裡邊現有的通用語言的影子是揮之不去的。就像我說的,當對方沒有知識背景的時候,人的語言就很近似於現在的計算機語言了。