冒號課堂節選:編程範式

編程範式

 

掌握一門語言的語法、工具和技巧固然重要,但那隻相當於學會一門兵器的招法,更重要的當然是心法。招法重形,心法重意。得形而忘意,無異捨本逐末;得意而忘形,方能遊刃有餘。下面要談的就是一種心法:編程範式。

範式譯自英文的 paradigm ,也有譯作典範、範型、範例的。如果說每個編程者都在創造虛擬世界,那麼編程範式就是他們置身其中自覺不自覺採用的世界觀和方法論。簡單講,編程範式就是編程語言的語感。

編程是爲了解決問題,而解決問題可以有多種視角和思路,其中普適且行之有效的模式被歸結爲範式。由於着眼點和思維方式的不同,相應的範式自然各有側重和傾向,因此一些範式常用 ‘oriented’ 來描述。換言之,每種範式都引導人們帶着某種的傾向去分析問題、解決問題。比如: Object-Oriented 就是 對象導向 的編程範式。

 

編程範式分類

基本範式

最基本的兩種編程範式:命令式和聲明式, 其中命令式又稱過程式。通俗點說,命令式編程由命令序列組成,即一系列祈使句: 先做這,再做那 ,強調 怎麼做 ;聲明式編程由相關表達式組成,即一系列陳述句: 已知這,求解那 ,強調 做什麼 。學術點說,命令式編程是電腦( von Neumann 機)運行機制的抽象,即有序地從內存中獲取指令和數據然後去執行;聲明式編程是人腦思維方式的抽象,即利用數理邏輯或既定規範 specification )對已知條件進行推理運算。

命令式語言是面向機器的,起源於機器語言;聲明式語言則發軔於人工智能的研究,主要包括函數式語言和邏輯式語言。

 

起源的不同決定了這兩大類範式代表着迥然不同的編程理念和風格:命令式編程是行動導向( Action-Oriented )的,因而算法是顯性而目標是隱性的;聲明式編程是目標驅動( Goal-Driven )的,因而目標是顯性而算法是隱性的。

示例:

C (命令式):

int factorial(int n)

{

     int f = 1;

      for (; n > 0; --n)   f *= n;

      return f;

}

 

 

Lisp (函數式):

(defun factorial(n)

(if (= n 0) 1                      //  n 等於 0 ,則 n! 等於 1

       (* n (factorial(- n 1)))))      //  否則 n! 等於 n* (n-1)

 

 

Prolog (邏輯式):

// 0! 等於 1

factorial(0,1).

// M 等於 N-1 M! 等於 Fm F 等於 N*Fm ,則 N! 等於 F

factorial(N,F) :-   M is N-1, factorial(M,Fm), F is N * Fm.   

 

C 明確給出了階乘的迭代算法,而 Lisp 僅描述了階乘的遞歸定義, Prolog 則陳述了兩個關於階乘的斷言。

命令式編程中的變量本質上是抽象化的內存,變量值是該內存的儲存內容 。通俗地說,前者好比姓名,所指之人是固定的;後者好比住址,所住之人是變化的。此外,等號在代數中是一種約束,而在許多命令式語言中則表示賦值。

聲明式編程讓我們重回數學思維,其中函數式編程類似代數中的表達式變換和計算,邏輯式編程則類似數理邏輯推理。其中的變量也如數學中的一樣,是抽象符號而非內存地址,因此沒有賦值運算,不會產生變量被改寫的副作用,也不存在內存分配和釋放的問題。這既簡化了代碼,也減少了調試

比較而言,聲明式編程重目標、輕過程,專注問題的分析和表達而不致陷入算法的迷宮,其代碼也更加簡潔清晰、易於修改和維護。

編程語言的流行程度與其擅長的領域關係密切。聲明式語言擅長基於數理邏輯的應用,如人工智能、符號處理、數據庫、編譯器等,對基於業務邏輯的、尤其是交互 式或事件驅動型的應用就不那麼得心應手了。而大多數軟件是面向用戶的,交互性強、多爲事件驅動、業務邏輯千差萬別,顯然命令式語言在此更有用武之地。

 

任何語言都難脫命令式或聲明式的窠臼,因此上述三種範式最爲基本。

 

歸根結底,編程是尋求一種機制,將指定的輸入轉化爲指定的輸出。 三種範式對此提供了迥然不同的解決方案:命令式把程序看作一個自動機,輸入是初始狀態,輸出是最終狀態,編程就是設計一系列指令,通過自動機執行以完成狀態轉變;函數式把程序看作一個數學函數,輸入是自變量,輸出是因變量,編程就是設計 一系列函數,通過表達式變換以完成計算;邏輯式把程序看作一個邏輯證明,輸入是題設,輸出是結論,編程就是設計一系列命題,通過邏輯推理以完成證明。繪成 表格如下 ——”

範式

程序

輸入

輸出

程序設計

程序運行

命令式

自動機

初始狀態

最終狀態

設計指令

命令執行

函數式

數學函數

自變量

因變量

設計函數

表達式變換

邏輯式

邏輯證明

題設

結論

設計命題

邏輯推理

 

 

發佈了74 篇原創文章 · 獲贊 4 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章