冒号課堂
第四課 重溫範式(3)
4.3彙總範式——一張五味俱全的大烙餅
形者神之質,神者形之用 ——《範缜·神滅論》
關鍵詞: 程式設計範式,設計模式,程式設計語言
摘要: 總結程式設計範式
!預覽
· 設計模式好比組合套路,能在一些特定場合下克敵制勝;程式設計範式則好比武功門派,博大精深且自成體系
· 一種程式設計範式之是以能獨樹一幟,關鍵在于它突破了原有的程式設計方式的某些限制,帶來革命性的新思維和新方法,進一步解放了程式員的勞動力
· 因其長而容己,因其短而容他,此萬物之理也
· 語言為形,範式為神。若能以神導形、以形傳神,則看似平白無趣的程式也能寫出詩畫般的意境
?提問
· 程式設計範式與設計模式有什麼差別?
· 程式設計範式的核心價值是什麼?
· 總結前面介紹的程式設計範式,它們各自有哪些代表語言?核心概念和運作機制是什麼?針對的問題和主要的目的是什麼?實作原理是什麼?常見的應用有哪些?有什麼不足之處?
:講解
稍事休整後,大家重新團結在以冒号為中心的周圍。
問号再度發問:“程式設計範式與設計模式都是一種抽象的軟體思想,都有一套具體的實作方法。單從字面上看,‘程式設計’與‘設計’、‘範式’與‘模式’的差別似乎也不太大。它們究竟有什麼不同呢?”
“這個問題有點意思。”冒号颔言,“設計模式一般針對某一特定場景的問題,而程式設計範式針對的是廣泛得多的問題領域,通常有一整套的思想和理論體系,具有全局性、系統性和滲透性,這一點在五大重要範式中顯得尤為突出。是以,程式設計範式更普适更抽象,涉及的深度和廣度也是設計模式難以比拟的。”
引号不免有些疑問:“但事件驅動式不是也能作為設計模式嗎?”
冒号解疑:“這倒并不沖突。同樣的思想用在整體系統的結構設計上,則稱為架構模式;用在局部子產品的細節實作上,則稱為設計模式[1];用在引導程式設計實踐上,則稱為程式設計範式。”
句号的武俠瘾又犯了:“設計模式好比組合套路,能在一些特定場合下克敵制勝;程式設計範式則好比武功門派,博大精深且自成體系。”
“很形象的比喻。”冒号贊賞道,“設計模式是遵循設計原則的一些具體技巧,以保證代碼的靈活性、擴充性和可重用性為目的。它重在設計,對程式設計語言一般沒有要求[2]。程式設計範式則不同,對程式設計語言往往有專門的要求。通常所說的某某範式的語言,即指該語言對該範式在文法上有明确充分的支援,不需要借助其他的範式或工具。事實上,語言本來就是圍繞其所倡導的核心範式來設計的[3]。”
逗号詢問:“如果一種語言不支援某種範式,那麼還能用這種範式程式設計嗎?”
“語言不直接支援範式,隻是說明它不屬于該範式的語言,但還是可能求助工具來應用該範式。比如元程式設計可以借助Yacc或ANTLR來完成,AOP可以借助一些庫或架構來實作。”冒号道,“正是依靠語言和工具的支援,程式設計範式得以建立起一套獨特而完善的抽象機制和方法體系,進而為所倡導的世界觀與方法論奠定基石。”
歎号請求:“能不能幫我們理清一下思路,把學過的範式一并彙總比較?”
不一會兒,衆人面前呈現出一張表格,地毯似的覆寫了整個投影屏(如表4-1所示)——
表4-1
程式設計範式 | 核心概念 | 關鍵突破 | 主要目的 |
代表語言 | 運作機制 | 實作原理 | 常見應用 |
指令式/過程式 (Imperative/Procedural) | 指令/過程 (Command /Procedure) | 突破單一主程式和非結構化程式的限制 | 模拟機器思維,實作自頂向下的子產品設計 |
Fortran/Pascal/C | 指令執行 | 引入邏輯控制和子程式 | 互動式、事件驅動型系統;數值計算等 |
函數式/應用式 (Functional/Applicative) | 函數 (Function) | 突破機器思維的限制 | 模拟數學思維,簡化代碼,減少副作用 |
Scheme/Haskell | 表達式計算 | 引入高階函數,将函數作為資料處理 | 微積分計算;數學邏輯;博弈等 |
邏輯式 (Logic) | 斷言 (Predicate) | 突破邏輯與控制粘合的限制 | 專注邏輯分析,減少控制代碼 |
Prolog/Mercury | 邏輯推理 | 利用推理引擎在已知的事實和規則的基礎上進行邏輯推斷 | 機器證明;專家系統;自然語言處理;語義網(semantic web);決策分析;業務規則管理等 |
對象式 (Object-Oriented) | 對象 (Object) | 突破資料與代碼分離的限制 | 迎合人類認知模式,提高軟體的易用性、重用性和可維護性 |
Smalltalk/Java | 對象間資訊交換 | 引入封裝、繼承和多态機制 | 大型複雜互動式系統等 |
并發式/并行式 (Concurrent/Parallel) | 程序/線程 (Process/Thread) | 突破串行的限制 | 充分利用資源、提高運作效率、提高軟體的響應能力、保證公平競争 |
Erlang/Oz | 程序/線程間通訊與同步 | 引入并行的線程子產品以及子產品間的通訊與同步機制 | 圖形使用者界面;I/O處理;多任務系統如作業系統、網絡伺服器等;實時系統;嵌入式系統;計算密集型系統如科學計算、人工智能等 |
泛型式 (Generic) | 算法 (Algorithm) | 突破靜态類型語言的限制 | 提高算法的普适性 |
Ada/Eiffel/C++ | 算法執行個體化 (多發生于編譯期) | 利用模闆推遲類型指定 | 普适性算法如排序、搜尋等;集合類容器等 |
元程式設計 (Metaprogramming) | 元程式 (Metaprogram) | 突破語言的正常文法限制 | 減少手工編碼,提升語言級别 |
Lisp/Ruby/JavaScript | 動态生成代碼或自動修改執行指令 | 利用代碼生成或語言内建的反射(reflection)、動态等機制,将程式語言作為資料來處理 | 自動代碼生成;定義結構化配置檔案;IDE;編譯器;解釋器;人工智能;模型驅動架構(MDA);領域特定語言(DSL)等 |
切面式 (Aspect-Oriented) | 切面 (Aspect) | 突破橫切關注點無法子產品化的限制 | 實作橫切關注點分離 |
AspectJ/AspectC++ | 在接入點處執行建議 | 通過編織(weaving)将附加行為嵌入主體程式 | 日志輸出;代碼跟蹤;性能監控;異常處理;安全檢查;事務管理等 |
事件驅動 (Event-Driven) | 事件 (Event) | 突破順序、同步的流程限制 | 調用者與被調用者在代碼和時間上雙重解耦 |
C#/VB.NET | 監聽器收到事件通知後做出響應 | 引入控制反轉和異步機制 | 圖形使用者界面;網絡應用;伺服器;作業系統;IoC架構;異步輸入;DOM等 |
歎号怔了怔,好似被一張巨大的烙餅給噎住了。
冒号并不急于講解,欲以靜制動。
果然,逗号沉不住氣了,問道:“在第一欄的程式設計範式及其代表語言中,為什麼并發式的代表語言沒有Java和C#,隻有Erlang和Oz?”
“Java和C#雖然在文法和核心庫中為并發程式設計提供了不少支援,但真正将并發範式融入基本設計理念的語言還得數Erlang、Oz這些較為冷門的語言。”冒号解釋,“類似地,比起Java、JavaScript等語言來,C#和VB.NET在語言設計上對事件驅動式程式設計給予了更多的關注[4],因而更具代表性。”
問号發現:“第三欄‘關鍵突破’的提法很特别啊。”
冒号輕捶桌面以示強調:“一種程式設計範式之是以能獨樹一幟,關鍵在于它突破了原有的程式設計方式的某些限制,帶來革命性的新思維和新方法,進一步解放了程式員的勞動力。這便是範式的核心價值所在。”
引号如獲至寶:“這張表格濃縮了範式的精華,既是對此前知識的總結,也是對今後程式設計的指導,實在太有用了!”
句号顯得更為冷靜:“有其長必有其短。我們了解了每種範式的長處,是不是還應該了解它們各自的短處?”
冒号開始對各個範式逐一數落:“過程式程式設計的資料與代碼脫節,不友善維護;函數式和邏輯式的開發效率一般比過程式高,但運作效率和語言表現力則有所不如;對象式程式設計用于數學計算、符号處理等對象特征淡薄的領域,在心理上缺乏認知基礎,在運作效率上不如純過程式,在開發效率上不如函數式;并發式程式設計增加了代碼的複雜度,加重了程式員的負擔;泛型式程式設計影響了代碼的可讀性,過度使用子產品還可能造成代碼膨脹(code bloat)[5];元程式設計過于強大,運用不當會超出程式員的控制,宜謹慎使用;切面式程式設計減少了程式的可預測性和可控性,同時給代碼的跟蹤調試帶來一定困難,還可能造成性能上的損失;事件驅動式程式設計雖然也能用于同步的流程應用,但畢竟機制更複雜,沒有普通的流程式程式設計那麼自然易懂。”
歎号看上去有點洩氣:“您可真夠絕的,先把這些程式設計範式一個個捧到天上,又幾杆子它們一個個打下雲端。”
“因其長而容己,因其短而容他,此萬物之理也。”冒号忽然惜言如金,一番之乎者也地予以回應。
句号借用了一句俗話:“不怕有缺點,就怕沒特點。”
冒号本欲多言,卻恐衆人食多傷胃,遂作結案陳詞:“盡管隻是管中窺豹,相信大家多少見識了程式設計範式的魅力之處。它們各擅勝場,有風格之别而無高下之分。作文繪畫講究形神兼備,程式設計也不例外。語言為形,範式為神。若能以神導形、以形傳神,則看似平白無趣的程式也能寫出詩畫般的意境。”
一席話說得衆人皆覺雖不能至,然心向往之。
,插語
[1] 是以設計模式有時被稱為微架構(microarchitecture)模式。
[2] 設計模式的應用範圍主要集中于靜态的OOP語言,但也不排斥動态的或非OOP的語言。
[3] 當然随着語言的演進,也可能支援新的範式。比如,C++、Java和C#一開始都不支援泛型程式設計,C#對函數範式的支援也是逐漸加大的。
[4] C#和VB.NET專門為事件驅動式設計了event、delegate等關鍵字以及一些配套的便利機制。
[5] 這裡的代碼不是指程式員寫的源代碼,而是指編譯器生成的代碼。
。總結
· 相比設計模式,程式設計範式針對的問題領域更廣泛,提出的思想和方法更普适、更抽象、更系統。此外,設計模式重在設計,對語言和工具的要求不高,而程式設計範式需要建立一套抽象機制和方法體系,離不開語言或工具的支援。
· 程式設計範式的核心價值在于:突破原有的程式設計方式的某些限制,帶來新思維和新方法,進而進一步解放程式員的勞動力。
· 正文中程式設計範式的彙總表格既是對此前知識的總結,也是對今後程式設計的指導。
· 既要了解程式設計範式的長處,也要了解它們的短處。
· 程式設計範式為神,程式設計語言為形,應以神導形、以形傳神。
“”參考
[1] Elena Bolshakova.PROGRAMMING PARADIGMS IN COMPUTER SCIENCE EDUCATION.International Journal "Information Theories & Applications",2005,Vol.12:285-290
[2] Amnon H. Eden,Rick Kazman.Architecture, design, implementation.Proceedings of the 25th International Conference on Software engineering ,2003:149–159
轉載于:https://www.cnblogs.com/xyz98/archive/2009/04/14/1435712.html