程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 冒號課堂§2.1:命令范式

冒號課堂§2.1:命令范式

編輯:關於JAVA

第二課 重要范式(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 Jacopini.Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules. Communications of the ACM,1966,9(5):366–371.

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved