有必要澄清兩個基本概念--算法和過程的關係以及關於程序設計方法論的一些看法

概述

前些天,在一個關於面向對象和麪向過程的話題, 我的一句評論"算法說白了就是過程"引起了辯論.於是我有了寫這篇隨筆的想法: 一位園友善意地說這個評論太業餘了.我沒有爲業餘二字生氣,因爲人家是善意的.但是,遺憾的是,這兩個概念是最基本的程序設計理論了, 而這位園友都沒有弄明白。其實沒有必要說誰業餘了,因爲那隻會助長浮躁的風氣。我希望這裏只有學習學習再學習.我相信一定有其他人沒有弄清楚.於是這篇隨筆就有必要寫寫了. 我同時將我在評論中說到的一些關於程序設計方法論的言論整理到這篇隨筆中來.

關於算法和過程的關係

先引經據典說概念:

<<算法導論>>第二版 中文版 機械工業出版社 2006.9.1出版 I S B N : 9787111187776 南京大學潘金貴等譯

第一部分(Part I) 基礎(Foundations)的第一節:

所謂算法(algorithm)定義良好的計算過程.它取一個或者一組值作爲輸入, 併產生一個或一組值作爲輸出。亦即, 算法就是一系列的計算步驟, 用來將輸入數據轉換成輸出結果.

以上是引用. 請注意第一句的主謂賓.主語是"算法".  謂語是"是".賓語是"過程".上述概念說明:一個算法一定是一個過程.

我想大家不用懷疑這本書的權威性, 有這本書的人可以看到長長的編審委員會人員名單.

我的上述評論"算法說白了就是過程"表達的就是同樣的意思.

從下文起我就不去找權威經典了.我就將我自己的描述寫到這裏.

2009.11.16.增加內容
   我上面只說了一半, 即算法一定是一個過程。但是所有過程都是算法嗎?回答是: 不是所有過程都是算法. 符合如下五個特性的過程,纔是算法。

1、有窮性: 一個算法必須保證執行有限步之後結束;

2、確切性: 算法的每一步驟必須有確切的定義;

3、輸入:一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指算法本身定除了初始條件;

4、輸出:一個算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的算法是毫無意義的;

5、可行性: 算法原則上能夠精確地運行,而且人們用筆和紙做有限次運算後即可完成。

2009.11.16增加完畢

關於過程和麪向過程編程的關係

程序語言裏面的過程指的是一系列計算步驟, 計算步驟是下列三種形式的結構:順序,條件分支和循環. 

面向過程編程是一種編程的方法論. 這種方法論將程序看成數據庫結構和算法.我們上面說過一個算法一定是一個過程.因此,也可以說面向過程編程將程序看成是數據結構和過程.爲什麼叫方法論呢,就是說它是程序設計者對世界的認識,是程序設計者的世界觀.即,當程序設計者用面向過程編程的方法論來設計和編寫程序的時候, 他的眼裏只有數據結構和算法,而沒有其他(包括類,對象等).

過程與面向過程編程是不同的概念,  進一步說, 過程與程序設計方法論也是不同的, 因爲面向過程編程只是程序設計方法論的一種.

過程反映了人們數理邏輯思維的脈絡. 你在用面象對象語言編程的時候,你在不自覺地用過程. 面象對象方法論告訴你哪裏可以避免重複寫類似地過程. 過程是所有程序語言必須的內容. 程序設計方法論再怎麼變,程序設計語言始終不能離開這三個過程式的結構: 順序,條件分支和循環結構. 離了這三個結構,就不叫程序了.

 

關於程序設計方法論

程序設計方法論即程序設計者的世界觀. 現在有很多種程序設計方法論. 如面象對象,面向過程,命令式編程,函數化編程,標記式語言等等.面象對象,面向過程,命令式編程,函數化編程,標記式語言等都是一種程序設計方法論. (從1990年後)目前工業界用得最多的是面象對象,面向過程這兩種方法論.當你用面象對象來看世界時,你只看到了對象. 當你用面向過程看世界時,你只看到了數據結構和算法, 如果用其他的, 看到的又是另外的東西了. 無論是面象對象、面向過程、函數化編程還是標記式語言,寫出來的代碼無不體現出程序設計者對真實世界的認識。面象對象是一種世界觀,面向過程也是,函數化編程同樣也是。只不過在我們表述這個認識的時候用的是不同的方式。

這些程序設計方法論之間沒有什麼優劣之分.只有根據實際需要採取最合適的方法論或者方法論的組合. 關於如何選取程序設計方法論,我目前還沒有仔細看這個話題.就不寫這個話題了. 有興趣的朋友可以去找找看. 不過請朋友們記住: 當某大師向你說某個方法論總是(或者說任何時候都)比其他方法論好的時候,你可要警惕了. 道理很簡單, 拿治病來說, 因爲從來就沒有萬靈的藥物, 只有在某種情況下最合適的藥物. 病萬變,藥亦須萬變.

現在面向對象的強勢, 以致於我們好多從業人員連想都不想就會選擇面向對象. 因爲目前我們很多開發工具都是國外生產的.國外說面向對象我們就只能跟着念. 國外計算技術的發展是多樣的,豐富的。當面向過程強勢時,面向對象的方法論也在醞釀和進化中,後來面向對象取代面向過程成爲工業界的主流, 現今面象對象強勢時,他們又有其他的方法論被提出,或者拿出多年前的方法論再改進. 這反應出國外的計算技術水平較高. 希望不久的將來,我國的計算技術水平也能稍領風騷. 中國, 加油!

 

關於未來程序語言的猜想

這是我在前面發評論時想到的, 不當真. 大家就當笑談吧. 當我們的人工智能等學科發展, 將來的程序表現形式可能既不是面向過程的, 也不是面向對象的. 而是更象自然語言.   從微觀看, 它還是有過程的特徵; 從宏觀看, 它是不確定的, 動態的, 經過規劃的,評估過的體系. 簡單說是一個可進化的智能專家系統的語言. 它對於一個問題的求解象人類的認識過程似的, 有進化上升的特徵, 所以不同時期它的求解可能得出不同的答案.

還不知道這個真的能實現否. 但是夢想是可以的.

 

2008.12.5. 將評論裏面的觀點整理出來

一個園友發表不同意見覺得上文中的這句明顯有問題: "程序設計語言始終不能離開這三個過程式的結構: 順序,條件分支和循環結構. 離了這三個結構,就不叫程序了". 並拿lisp語言來做證明. 他說:"比如LISP就沒有過程,用遞歸的". 那麼好吧,我們就來看看一個實際的lisp程序是否有這三個結構.

下面的lisp程序來源於:   http://www.dynamiclearningcenter.com/samples/htout/htout.lisp  , 是我到網上找的. 

我們可以看到lisp有"if", "loop"等. 在lisp裏面它們被稱爲函數, 但是這些函數就是實現我所說的分支結構和循環結構. lisp裏面的運作是完全函數化, 
對函數的調用是一層嵌套一層,先調用一個函數再調用一個, 是用遞歸實現這麼多函數的調用.我們可以注意到lisp的先調用一個函數再調用另一個函數
就是我所說的順序結構. 可見lisp雖稱爲非過程語言. 它實際上是一樣是有我說的過程. 
不僅lisp, 稍微記得程序語言發展史的人, 一定記得c++也是被學者們劃入非過程語言範躊的. 不少人學過c++, 一定知道c++也是有我說的過程.
這個事實就是, 不管是過程語言(如c),還是非過程語言(如lisp,c++)都有過程.
過程表達的是人們自然的邏輯思考,先幹什麼後幹什麼, 如果..., 就..., 否則就..., 
要有先後的次序就必須有順序結構, 要有邏輯就必須有條件分支, 要重複做某事就必須有循環. 到具體程序語言上, 只是其表現形式不一樣而已. 
結論就是這位園友引用的那句: "程序設計語言始終不能離開這三個過程式的結構: 順序,條件分支和循環結構. 離了這三個結構,就不叫程序了".
程序語言的一個傾向--只要告訴計算機做什麼而不要告訴計算機怎麼做
這是由lisp想起的話題. 程序語言設計者們開始傾向於設計這樣的程序語言: 只要告訴計算機做什麼而不需要告訴計算機怎麼做. 
lisp應該是他們在這個方向上的一個努力. 但是, "只要告訴計算機做什麼而不要告訴計算機怎麼做" 只是相對的. 計算機不可能預先知道天下所有的事情.
所以這方面的努力還只是很初步的. lisp仍然需要人們在很多地方告訴計算機怎麼做.
 
這個話題說起來似乎微不足道, 有些人沒有注意到這些概念也照樣在寫程序. 有些人甚至覺得無聊之極, 還在下面寫上構思比較巧妙的評論. 
我只好付之一笑了,也好啊, 娛樂娛樂. 對於這樣的評論, 我要說的是: 你不經意的地方 有 你沒有注意的事實. 
2009.11.16: 此處應該說是:不識廬山真面目,只緣身在此山中。
至於重要不重要嘛,你用你自己的智慧來判斷吧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章