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

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

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

    冒號課堂§2.1:命令范式

     

    冒號課堂

    第二課 重要范式(1)

     

    課前導讀

    這一課討論了五個最重要的編程范式:命令式、函數式、邏輯式、對象式和并發式。這些只是入門性的介紹,讀者領會其精神即可,細節上不必過于在意。

    本課共分四節——

    1.命令范式

    2.聲明范式

    3.對象范式

    4.并發范式


    2.1
    命令范式——一切行動聽指揮

    人生最偉大的目標是行動                                           ——《洛克菲勒的忠告》

    關鍵詞:編程范式,命令式,結構化編程,流程圖

    摘要:命令式編程簡談

     
    ?提問 

    • 什么是命令式編程?它為什么是最常見的編程范式?
    • 什么是結構化編程?結構化編程的主要思想是什么?

    講解

     第二課伊始,冒號開門見山:“首先介紹一下最原始也是我們最熟悉的編程范式:命令式編程imperative programming)。用命令式編寫的程序由命令序列組成,即一系列祈使句:‘先做這,再做那’,強調‘怎么做’。更學術點說,命令式編程是電腦——準確地講,是馮·諾伊曼機(von Neumann machine)——運行機制的抽象,即依序從內存中獲取指令和數據然后去執行。從范式的角度看,其世界觀是:程序是由若干行動指令組成的有序列表;其方法論是:用變量來儲存數據,用語句來執行指令。

    逗號小聲嘟囔著:“我們用的編程語言不都是命令式的嗎?”

    “應該說絕大多數語言是命令式的,但非命令式的語言也是存在的。關于后者,我們稍后再議。” 冒號糾正道,“這也在情理之中。語言的演化是漸進的,大多數語言追根溯源是匯編語言的升級,而作為與機器語言一一對應的匯編語言自然是命令式的,因而這種范式最為傳統和普及。”

    不料問號竟窮追不舍:“為什么機器語言就一定得是命令式呢?”

    “我很欣賞你這種打破砂鍋問到底的精神,不過你可以問到底,我卻不敢保證能答到底哦。”冒號有些逗趣地說。

    問號略帶靦腆地笑了。

    “從理論上而言,完全可以有非命令式的機器語言存在,前提是計算機采用了特殊的硬件實現,比如非馮·諾伊曼結構的數據流機dataflow machine)和歸約機reduction machine)。但這類計算機并未流行于市,相應的機器語言自然罕見了[1]。”冒號還是給出了理由。

    引號問:“命令式編程與人們常說的過程式編程是一回事嗎?”

    嚴格說來,過程式編程procedural programming)是指引入了過程(procedure)、函數(function)或子程序(subroutine/subprogram)的命令式編程。但由于現代的命令式語言均具備此特征,故二者往往不加區分。”冒號回應道。

    句號認為:“由于常用的語言基本上都是命令式的,其思想也與計算機的運行機制相符,一切對我們來說,似乎都是自然而然的事。”

    “單純的命令式思想的確很樸素,毋庸贅述。” 冒號承認,“但有必要提一下結構化編程structured programming或簡稱SP),它是在過程式編程的基礎上發展起來的。其本質是一種編程原則,提倡代碼應具有清晰的邏輯結構,以保證程序易于讀寫、測試、維護和優化。Pascal正是遵循結構化編程原則而設計的一種教學語言。為直觀起見,我們用圖來表現程序的結構化特征——”

    “這是一個流程圖(flowchart),或稱程序框圖,它描述了一個簡單程序:用戶從標準輸入中鍵入算術表達式,程序打印出結果,如此循環往復,直到用戶輸入字符‘q’為止。”冒號解釋道,“若以純粹的結構化編程的標準來衡量,該流程圖并未達標。”

    嘆號有些驚訝:“這個圖不是再清晰不過了嗎?”

    “根據結構化定理(structured program theorem[2],任何程序都可用順序(concatenation)、選擇(selection)和循環(repetition)等三種基本控制結構來表示。”冒號畫了幾幅圖——

    冒號指點著黑板:“結構化編程就是在三種基本結構的基礎上進行嵌套組合。如果將每個基本結構看作基本電器元件,編程就是將這些元件組裝成復雜的電路。請注意,所有基本元件都滿足‘單入口、單出口’(single entry, single exit,簡稱SESE)的原則,這使得電路井井有條,不會串線纏繞。”

    引號已經看出:“上面的流程圖無法用基本結構來組合,所以不是標準的結構化程序。”

    冒號提出要求:“你能改造一下嗎?”

    引號走上講臺,在前圖的基礎上作了些許調整——

    “嗯,不錯。這下流程圖可以拆解為基本結構了。”冒號表示認可,“二者的區別在于前者利用了break語句,在循環途中退出,后者通過引入quit標志(flag)保證了循環的完整性。”

    逗號的臉上寫下一個大大的問號:“難道連break語句都不能用嗎?”

    break語句只是在循環體內部的跳轉,合理地使用它能簡化代碼,不致影響整體結構,大可不必拘泥于教條。但goto語句可以跳到程序過程中的任一點,造成靜態程序static program)與動態進程dynamic process)之間的差異,影響程序可讀性,是要竭力避免的[3]。”冒號如是說道,“結構化編程的思想包括兩方面。在微觀上,主張循規守矩,采用順序、選擇和循環三種邏輯結構,摒棄或限制goto語句[4],以避免雜亂無章的代碼。在宏觀上,主張分而治之(divide and conquer),采用‘自頂向下(top-down) [5] 的設計,通過模塊化將一個較為復雜的系統分解為若干相對簡單的子系統,每個子系統可以獨立地進一步分解,直到容易編碼實現為止。這兩方面是互為因果、互為保障的——由基本結構拼裝而成的系統一定是模塊清晰、層次分明的;反之,系統逐步分解到最后,一定會演化成基本結構。”

    嘆號產生一個想法:“能從程序的流程圖上看出結構化編程與非結構化編程之間的區別嗎?”

    “一個按結構化編程思想設計的流程圖,每個模塊大小適中、模塊之間關系簡明、模塊內部線路清晰,單從視覺上就會給人一種美感。相反,如果采用非結構化的設計,流程圖往往結構如雜草般松散紊亂、脈絡如迷宮般錯綜復雜、箭頭如線頭般剪不斷理還亂,情節嚴重的會導致讀者頭暈目眩乃至抓狂吐血。”冒號極盡夸張之能事。

    眾人掩口失聲。


     ,插語

    [1] 數據流機支持數據流式語言,歸約機支持函數式語言。

    [2] 見參考文獻【1

    [3] 1967年,E.W. Dijkstra 在其著名論文“Goto statement considered harmful”中指出goto語句的危害性,主張廢除這種用法。

    [4] 1974年,Donald Knuth在論文“Structured Programming with Goto Statements”中認為goto語句仍有其合理性,應該限制而不是完全摒棄。

    [5] 也稱“自頂向下、逐步求精”。


    總結

    ·         命令式編程通過一系列改變程序狀態的指令來完成計算,聲明式編程只描述程序應該完成的任務。命令式編程模擬電腦運算,是行動導向的,關鍵在于定義解法,即“怎么做”,因而算法是顯性而目標是隱性的;聲明式編程模擬人腦思維,是目標驅動的,關鍵在于描述問題,即“做什么”,因而目標是顯性而算法是隱性的。

    ·         結構化編程是過程式編程的一種原則,其主要思想是:提倡在宏觀上采用‘自頂向下’的設計,微觀上采用順序、選擇和循環的邏輯結構,摒棄或限制goto語句,以保證程序結構清晰、易于調試和維護。


    “”
    參考

    [1] Corrado B?hm,Giuseppe JacopiniFlow Diagrams, Turing Machines and Languages with Only Two Formation Rules Communications of the ACM,1966,9(5)366–371.

    [2] Ravi SethiProgramming Languages: Concepts & Constructs(英文版第2).北京:機械工業出版社,200259-77

    posted on 2008-11-03 23:16 鄭暉 閱讀(2907) 評論(2)  編輯  收藏 所屬分類: 冒號課堂

    評論

    # re: 冒號課堂——第二課:重要范式(上) 2008-10-23 10:59 haijiang

    看起來很累,能不能換一個配色方案???謝謝。  回復  更多評論   

    # re: 冒號課堂——第二課:重要范式(上) 2008-10-23 18:17 鄭暉

    @haijiang
    你指的是前景色還是背景色?具體有何建議?  回復  更多評論   

    導航

    統計

    公告

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

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲Av无码乱码在线播放| 卡1卡2卡3卡4卡5免费视频| 添bbb免费观看高清视频| 看全免费的一级毛片| 在线观看免费精品国产| 亚洲欧洲日本在线观看| xvideos永久免费入口| 2021国内精品久久久久精免费| 黑人精品videos亚洲人| 国产一精品一AV一免费| 免费无遮挡无码视频网站| 亚洲日产乱码一二三区别| 国产精品酒店视频免费看| 最好2018中文免费视频| 久久久无码精品亚洲日韩软件| 国产免费一区二区视频| 亚洲黄色免费网址| 好男人www免费高清视频在线| 亚洲国产精品综合久久20| 三上悠亚在线观看免费| 毛片A级毛片免费播放| 青青青亚洲精品国产| 亚洲综合久久夜AV | 精品国产亚洲一区二区三区在线观看| 国产又粗又猛又爽又黄的免费视频| 国产偷国产偷亚洲清高APP| 亚洲午夜久久久久久噜噜噜| 久视频精品免费观看99| 亚洲国产AV一区二区三区四区| 亚洲男女内射在线播放| 亚洲精华国产精华精华液| 亚洲精品国产日韩无码AV永久免费网| 国产色无码精品视频免费| 国产精品亚洲综合专区片高清久久久| 国产午夜不卡AV免费| 亚洲另类古典武侠| 99久久久精品免费观看国产| 亚洲а∨精品天堂在线| 久久亚洲精品中文字幕三区| 亚洲高清免费视频| 亚洲国产日产无码精品|