<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冒號課堂§4.3:匯總范式

     

    冒號課堂

    第四課 重溫范式(3)


    4.3
    匯總范式——一張五味俱全的大烙餅

    形者神之質(zhì),神者形之用                                               ——《范縝·神滅論》

     

    關(guān)鍵詞:      編程范式,設(shè)計模式

    摘要:   總結(jié)編程范式

     

     提問

     

    l        編程范式與設(shè)計模式有什么區(qū)別?

    l        編程范式的核心價值是什么?

    l        總結(jié)前面介紹的編程范式,它們各自有哪些代表語言?核心概念和運行機(jī)制是什么?針對的問題和主要的目的是什么?實現(xiàn)原理是什么?常見的應(yīng)用有哪些?有什么不足之處?


       講解

     

    稍事休整后,大家重新團(tuán)結(jié)在以冒號為中心的周圍。

    問號再度發(fā)問:“編程范式與設(shè)計模式都是一種抽象的軟件思想,都有一套具體的實現(xiàn)方法。單從字面上看,‘編程’與‘設(shè)計’、‘范式’與‘模式’的區(qū)別似乎也不太大。它們究竟有什么不同呢?”

    “這個問題有點意思。”冒號頷言,“設(shè)計模式一般針對某一特定場景的問題,而編程范式針對的是廣泛得多的問題領(lǐng)域,通常有一整套的思想和理論體系,具有全局性、系統(tǒng)性和滲透性,這一點在五大重要范式中顯得尤為突出。因此,編程范式更普適更抽象,涉及的深度和廣度也是設(shè)計模式難以比擬的。”

    引號不免有些疑問:“但事件驅(qū)動式不是也能作為設(shè)計模式嗎?”

    冒號解疑:“這倒并不矛盾。同樣的思想用在整體系統(tǒng)的結(jié)構(gòu)設(shè)計上,則稱為架構(gòu)模式;用在局部模塊的細(xì)節(jié)實現(xiàn)上,則稱為設(shè)計模式[1];用在引導(dǎo)編程實踐上,則稱為編程范式。”

    句號的武俠癮又犯了:“設(shè)計模式好比組合套路,能在一些特定場合下克敵制勝;編程范式則好比武功門派,博大精深且自成體系。”

    “很形象的比喻。”冒號贊賞道,“設(shè)計模式是遵循設(shè)計原則的一些具體技巧,以保證代碼的靈活性、擴(kuò)展性和可重用性為目的。它重在設(shè)計,對語言一般沒有要求[2]。編程范式則不同,對語言往往有專門的要求。通常所說的某某范式的語言,即指該語言對該范式在語法上有明確充分的支持,不需要借助其他的范式或工具。事實上,語言本來就是圍繞其所倡導(dǎo)的核心范式來設(shè)計的[3]。”

    逗號詢問:“如果一種語言不支持某種范式,那么還能用這種范式編程嗎?”

    “語言不直接支持范式,只是說明它不屬于該范式的語言,但還是可能求助工具來應(yīng)用該范式。比如元編程可以借助YaccANTLR來完成,AOP可以借助一些庫或框架來實現(xiàn)。”冒號道,“正是依靠語言和工具的支持,編程范式得以建立起一套獨特而完善的抽象機(jī)制和方法體系,從而為所倡導(dǎo)的世界觀與方法論奠定基石。”

    嘆號請求:“能不能幫我們理清一下思路,把學(xué)過的范式一并匯總比較?”

    不一會兒,眾人面前呈現(xiàn)出一張表格,地毯似的覆蓋了整個投影屏——

    編程范式

    核心概念

    關(guān)鍵突破

    主要目的

    代表語言

    運行機(jī)制

    實現(xiàn)原理

    常見應(yīng)用

    命令式/過程式

    Imperative/Procedural

    命令/過程

    Command

    /Procedure

    突破單一主程序和非結(jié)構(gòu)化程序的限制

    模擬機(jī)器思維,實現(xiàn)自頂向下的模塊設(shè)計

    Fortran/Pascal/C

    命令執(zhí)行

    引入邏輯控制和子程序

    交互式、事件驅(qū)動型系統(tǒng);數(shù)值計算等

    函數(shù)式/應(yīng)用式

    (Functional/Applicative

    函數(shù)

    Function

    突破機(jī)器思維的限制

    模擬數(shù)學(xué)思維,簡化代碼

    Scheme/Haskell

    表達(dá)式計算

    引入高階函數(shù),將函數(shù)作為數(shù)據(jù)處理

    微積分計算;數(shù)學(xué)邏輯;博弈等

    邏輯式

    Logic

    斷言

    Predicate

    突破邏輯與控制粘合的限制

    專注邏輯分析,減少控制代碼

    Prolog/Mercury

    邏輯推理

    利用推理引擎在已知的事實和規(guī)則的基礎(chǔ)上進(jìn)行邏輯推斷

    機(jī)器證明;專家系統(tǒng);自然語言處理;語義網(wǎng)(semantic web);決策分析;業(yè)務(wù)規(guī)則管理等

    對象式

    Object-Oriented

    對象

    Object

    突破數(shù)據(jù)與代碼分離的限制

    迎合人類認(rèn)知模式,提高軟件的易用性和重用性

    Smalltalk/Java

     

    對象間信息交換

    引入封裝、繼承和多態(tài)機(jī)制

    大型復(fù)雜交互式系統(tǒng)等

    并發(fā)式/并行式

    Concurrent/Parallel

    進(jìn)程/線程

    Process/Thread

    突破串行的限制

    充分利用資源、提高運行效率、提高軟件的響應(yīng)能力

    Erlang/Oz

     

    進(jìn)程/線程間通訊與同步

    引入并行的線程模塊以及模塊間的通訊與同步機(jī)制

    圖形用戶界面;I/O處理;多任務(wù)系統(tǒng)如操作系統(tǒng)、網(wǎng)絡(luò)服務(wù)器等;實時系統(tǒng);嵌入式系統(tǒng);計算密集型系統(tǒng)如科學(xué)計算、人工智能等

    泛型式

    Generic

    算法

    Algorithm

    突破靜態(tài)類型語言的限制

    提高算法的普適性

    Ada/Eiffel/C++

     

    算法實例化

    (多發(fā)生于編譯期)

    利用模板推遲類型指定

    普適性算法如排序、搜索等;集合類容器等

    元編程

    Metaprogramming

    元程序

    Metaprogram

    突破語言的常規(guī)語法限制

    減少手工編碼,提升語言級別

    Lisp/Ruby/JavaScript

    動態(tài)生成代碼或自動修改執(zhí)行指令

    利用代碼生成或語言內(nèi)建的反射(reflection)、動態(tài)等機(jī)制,將程序語言作為數(shù)據(jù)來處理

    自動代碼生成;定義結(jié)構(gòu)化配置文件;IDE;編譯器;解釋器;人工智能;模型驅(qū)動架構(gòu)(MDA);領(lǐng)域特定語言(DSL)等

    切面式

    Aspect-Oriented

    切面

    Aspect

    突破橫切關(guān)注點無法模塊化的限制

    實現(xiàn)橫切關(guān)注點分離

    AspectJ/AspectC++

     

    在接入點處執(zhí)行建議

    通過編織(weaving)將附加行為嵌入主體程序

    日志輸出;代碼跟蹤;性能監(jiān)控;異常處理;安全檢查;事務(wù)管理等

    事件驅(qū)動

    Event-Driven

    事件

    Event

    突破順序、同步的流程限制

    調(diào)用者與被調(diào)用者在代碼和時間上雙重解耦

    C#/VB.NET

    監(jiān)聽器收到事件通知后做出響應(yīng)

    引入控制反轉(zhuǎn)和異步機(jī)制

    圖形用戶界面;網(wǎng)絡(luò)應(yīng)用;服務(wù)器;操作系統(tǒng);IoC框架;異步輸入;DOM

    嘆號怔了怔,好似被一張巨大的烙餅給噎住了。

    冒號并不急于講解,欲以靜制動。

    果然,逗號沉不住氣了,問道:“在第一欄的編程范式及其代表語言中,為什么并發(fā)式的代表語言沒有JavaC#,只有ErlangOz?”

    JavaC#雖然在語法和核心庫中為并發(fā)編程提供了不少支持,但真正將并發(fā)范式融入基本設(shè)計理念的語言還得數(shù)ErlangOz這些較為冷門的語言。”冒號解釋,“類似地,比起JavaJavaScript等語言來,C#VB.NET在語言設(shè)計上對事件驅(qū)動式編程給予了更多的關(guān)注[4],因而更具代表性。”

    問號發(fā)現(xiàn):“第三欄‘關(guān)鍵突破’的提法很特別啊。”

    冒號輕捶桌面以示強(qiáng)調(diào):“一種編程范式之所以能獨樹一幟,關(guān)鍵在于它突破了原有的編程方式的某些限制,帶來革命性的新思維和新方法,進(jìn)一步解放程序員的勞動力。這便是范式的核心價值所在。”

    引號如獲至寶:“這張表格濃縮了范式的精華,既是對此前知識的總結(jié),也是對今后編程的指導(dǎo),實在太有用了!”

    句號顯得更為冷靜:“有其長必有其短。我們了解了每種范式的長處,是不是還應(yīng)該了解它們各自的短處?”

    冒號開始對各個范式逐一數(shù)落:“過程式編程的數(shù)據(jù)與代碼脫節(jié),不方便維護(hù);函數(shù)式和邏輯式的開發(fā)效率一般比過程式高,但運行效率和語言表現(xiàn)力則有所不如;對象式編程用于數(shù)學(xué)計算、符號處理等對象特征淡薄的領(lǐng)域,在心理上缺乏認(rèn)知基礎(chǔ),在運行效率上不如純過程式,在開發(fā)效率上不如函數(shù)式;并發(fā)式編程增加了代碼的復(fù)雜度,加重了程序員的負(fù)擔(dān);泛型式編程影響了代碼的可讀性,過度使用模塊還可能造成代碼膨脹(code bloat[5];元編程過于強(qiáng)大,運用不當(dāng)會超出程序員的控制,宜謹(jǐn)慎使用;切面式編程減少了程序的可預(yù)測性和可控性,同時給代碼的跟蹤調(diào)試帶來一定困難,還可能造成性能上的損失;事件驅(qū)動式編程雖然也能用于同步的流程應(yīng)用,但畢竟機(jī)制更復(fù)雜,沒有普通的流程式編程那么自然易懂。”

    嘆號看上去有點泄氣:“您可真夠絕的,先把這些編程范式一個個捧到天上,又幾桿子它們一個個打下云端。”

    因其長而容己,因其短而容他,此萬物之理也。”冒號忽然惜言如金,一番之乎者也地予以回應(yīng)。

    句號借用了一句俗話:“不怕有缺點,就怕沒特點。”

    冒號本欲多言,卻恐眾人食多傷胃,遂作結(jié)案陳詞:“盡管只是管中窺豹,相信大家多少見識了編程范式的魅力之處。它們各擅勝場,有風(fēng)格之別而無高下之分。作文繪畫講究形神兼?zhèn)洌幊桃膊焕狻?strong>語言為形,范式為神。若能以神導(dǎo)形、以形傳神,則看似平白無趣的程序也能寫出詩畫般的意境。”

    一席話說得眾人皆覺雖不能至,然心向往之。


     插語 

    [1] 因此設(shè)計模式有時被稱為微架構(gòu)(microarchitecture)模式。

    [2] 雖然設(shè)計模式一般多用于OOP語言,但并不總是必須的,更何況大多流行語言均支持OOP

    [3] 當(dāng)然隨著語言的演進(jìn),也可能支持新的范式。如Javagenerics是后來加入語言以支持泛型編程的。

    [4] C#VB.NET專門為事件驅(qū)動式設(shè)計了eventdelegate等關(guān)鍵字以及一些配套的便利機(jī)制。

    [5] 這里的代碼不是指程序員寫的源代碼,而是指編譯器生成的代碼。


    總結(jié)

    l        相比設(shè)計模式,編程范式針對的問題領(lǐng)域更廣泛,提出的思想和方法更普適、更抽象、更系統(tǒng)。此外,設(shè)計模式重在設(shè)計,對語言和工具的要求不高,而編程范式需要建立一套抽象機(jī)制和方法體系,離不開語言或工具的支持。

    l        編程范式的核心價值在于:突破原有的編程方式的某些限制,帶來新思維和新方法,從而進(jìn)一步解放程序員的勞動力。

    l        正文中編程范式的匯總表格既是對此前知識的總結(jié),也是對今后編程的指導(dǎo)。

    l        既要了解編程范式的長處,也要了解它們的短處。

    l        編程范式為神,編程語言為形,應(yīng)以神導(dǎo)形、以形傳神。


    “”參考

    [1] Elena BolshakovaPROGRAMMING PARADIGMS IN COMPUTER SCIENCE EDUCATIONInternational Journal "Information Theories & Applications"2005Vol.12285-290

    [2] Amnon H. EdenRick KazmanArchitecture, design, implementationProceedings of the 25th International Conference on Software engineering 2003149–159

    posted on 2008-12-15 16:28 鄭暉 閱讀(2948) 評論(0)  編輯  收藏 所屬分類: 冒號課堂

    導(dǎo)航

    統(tǒng)計

    公告

    博客搬家:http://blog.zhenghui.org
    《冒號課堂》一書于2009年10月上市,詳情請見
    冒號課堂

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲丰满熟女一区二区哦| 激情综合色五月丁香六月亚洲| 黄+色+性+人免费| 精品熟女少妇a∨免费久久| 蜜桃成人无码区免费视频网站 | 国产成人精品日本亚洲| 久久影视综合亚洲| 亚洲综合色视频在线观看| 亚洲精品网站在线观看不卡无广告 | 久久精品国产亚洲夜色AV网站| 亚洲一区二区三区在线播放| 亚洲国产精品尤物YW在线观看 | 2015日韩永久免费视频播放 | EEUSS影院WWW在线观看免费| 国产黄在线观看免费观看不卡| g0g0人体全免费高清大胆视频| 久青草视频在线观看免费| 精品国产麻豆免费人成网站| 97免费人妻在线视频| 中文字幕无码播放免费| 97人伦色伦成人免费视频| 国产gav成人免费播放视频| 亚洲一区二区高清| 亚洲精品无码不卡在线播放HE| 久久精品7亚洲午夜a| 亚洲精品中文字幕乱码影院| 亚洲 欧洲 自拍 另类 校园| 老子影院午夜伦不卡亚洲| 无码人妻一区二区三区免费视频| 本道天堂成在人线av无码免费| 国产精品白浆在线观看免费| 91av视频免费在线观看| 成人免费一区二区三区在线观看| 又爽又高潮的BB视频免费看| 国产日产亚洲系列| 亚洲精品美女在线观看| 亚洲变态另类一区二区三区| 中文字幕无码免费久久9一区9| 最近中文字幕无免费| 在线A级毛片无码免费真人| 亚洲AV日韩精品一区二区三区|