這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
這篇文章是應“編程新思路”COP小組之邀,對編程範式做一個專題分享。主要是自己在讀書、學習、工作上的一些心得總結,能力有限,希望能拋磚引玉,一同探討。
為什麼要瞭解編程範式和語言
到目前為止,世界上約有2500種程式設計語言,其中一部分的族譜關係如下。
[圖片上傳中。。。(2)]
語言從世界觀上思考和影響軟體設計,不同範式看待設計的角度也迥然不同,比如命令範式語言以狀態(變數)抽象現實世界,對象範式語言以對象對象現實世界,函數範式語言以計算(函數)抽象現即時間。對現實問題的不同觀察視角,從根本上影響軟體開發人員的思考方式和對軟體設計的認識。
程式設計語言的產生和流行都有其時代背景,比如,
在早期機器語言開發的低效率之下,需要更高效率的程式語言,結構化設計思想應運而生,這一階段命令範式語言大放異彩,以C語言為傑出代表;
隨後,大規模軟體開發項目死亡率之高,讓人們重新思考總結軟體設計原則和思想,這時候面對對象設計思想脫穎而出,命令範式語言無法實踐這些新的軟體設計理念,新語言的產生勢在必然,這一段大量的對象範式語言湧現,其中C++、Java語言的接受度最為廣泛;
後來隨著多核CPU的推廣和分散式運算應用情境問題的湧現,為了將程式員從複雜的並發管理的焦油坑中解救出來,要求語言能提供一種合適的抽象機制對並發情境進行描述,這時候函數範式和並發方式終於吸引了眾人的目光,成為聚光燈下的寵兒,這其中erlang、golang語言的關注度最高;
然後,又發現在某些特定應用領域,通用語言無法完美地在問題域的抽象層次上進行描述,針對不同的問題域,產生了大量的特定領域語言。由於DSL比通用語言更簡單、更抽象、更專業、更接近自然語言,開發效率顯著提高。此外尤為關鍵的是,這種方式填補了專業程式員與業務分析員之間的鴻溝。
但是隨著軟體規模越來越大,需求越來越多,變更越來越快,為了管理快速膨脹的軟體複雜度,大量的語言、設計模式和架構湧現。面對這些新知識時,我們常常感到困惑:0)為什麼有這麼多新語言、新設計模式、新架構?1)如何快速的學習、掌握這些新語言、設計模式和架構,它們背後是否存在更普遍性的規律?2)基於A語言(如Java,Erlang)特性的設計模式如何借鑒並運用到B語言(如C)上?
從抽象語義的角度看,設計模式、架構、庫都是語言的一種外延,說的苛刻點,這些都是彌補語言缺陷的補丁。比如對於動態類型語言,類型像變數一樣使用,很多建立型設計模式就沒用了。對於函數式語言,函數像變數一樣使用,很多行為設計模式就沒用了。
通過深度學習編程範式和語言設計,才能撥開繁雜的設計模式迷霧,從語言的本源來瞭解軟體設計的本質和解決問題的思想和方法,讓我們快速把握語言的脈絡,進而提高我們軟體設計的能力和語感,加深理解設計模式、架構的意義。
編程範式**的差異**
編程範式的核心價值在於:突破原有的編程方式的某些限制,帶來新思維和新方法,從而進一步解放程式員的勞動力。編程範式匯總表格如下:
[圖片上傳中。。。(4)]
過程式編程世界觀是:程式是由若干行動指令組成的有序列表;其方法論是:用變數來儲存資料,用語句來執行指令,其設計思想就是結構化設計。擅長於面向使用者的,互動性強、多為事件驅動、商務邏輯複雜的應用。
函數式和邏輯式語言擅長基於數理邏輯的應用,如並發、人工智慧、符號處理、資料庫、編譯器等。函數式編程中的高階函數與基礎資料型別 (Elementary Data Type)平起平坐,故可將代碼作資料用,這是程式既簡潔又強大的原因之一。回調機制採用的正是函數式風格。
對象式雖然是在命令式的基礎上發展起來的,其本質就是將相關的函數用資料粘合,重新封裝後再貼上對象的標籤。對象式以對象為基本模組單位,而對象是現實中具體事物和抽象概念的類比,它更接近人類的認知模式,編程者更容易也更樂於用這種方式編程。過程式編程的理念是以過程為中心,自頂向下、逐步求精。對象式則正相反,以資料為中心,自底向上、逐步合并。
並髮式編程以進程為導向 (Process-Oriented)、以任務為中心將系統模組化。
編程範式舉例:
策略模式
python對象式實現
快排
erlang函數式實現qsort([]) -> [];qsort([H|T])-> qsort([LO || LO <- T, LO < H]) ++ [H] ++ qsort([HI || HI <- T, HI >= H]).
程式設計語言的共性
上一節,我們從宏觀角度上看語言,從2500種語言中總結出5種主要的編程範式。那麼從微觀角度看語言,是否也可以從2500種語言中,找出共性呢?答案是肯定的。
有一種觀點:軟體 = 資料 + 演算法。資料通過資料類型來描述,演算法通過控制來描述,所以不管語言如何層出不窮,所有語言的設計離不開2個基本面:控制流程和資料類型。並且為了提升其描述能力,提供了控制抽象和資料抽象。這是一個宏大的話題,這裡就不展開說,下面這張腦圖基本涵蓋了語言設計中控制流程、控制抽象、資料類型和資料抽象的核心問題和實現手段。
參考資料:
- 《冒號課堂》
- 《程式設計語言--實踐之路》第三版
-- EOF--