《冒号课堂》连载之六——命令范式:一切行动听指挥

《冒号课堂》连载之六——命令范式:一切行动听指挥

 

2.1  命令范式一切行动听指挥

人生最伟大的目标是行动。

——《洛克菲勒的忠告》

 

关键词:编程范式;命令式编程;结构化编程;流程图

  :命令式编程简谈

 预览

(命令式编程)其世界观是:程序是由若干行动指令组成的有序列表。其方法论是:用变量来存储数据,用语句来执行指令。

(结构化编程)在微观上,主张循规守矩;在宏观上,主张分而治之。

一个按结构化编程思想设计的流程图,每个模块大小适中、模块之间关系简明、模块内部线路清晰,单从视觉上就会给人一种美感。

 提问

什么是命令式编程?它为什么是最常见的编程范式?

什么是结构化编程?结构化编程的主要思想是什么?

 讲解

2课伊始,冒号开门见山:“首先介绍一下最原始也是我们最熟悉的编程范式:命令式编程(imperative programming)。用命令式编写的程序由命令序列组成,即一系列祈使句:‘先做这,再做那’,强调‘怎么做’。更学术点说,命令式编程是电脑—准确地讲,是冯·诺伊曼机(von Neumann machine—运行机制的抽象,即依序从内存中获取指令和数据,然后去执行。从范式的角度看,其世界观是:程序是由若干行动指令组成的有序列表。其方法论是:用变量来存储数据,用语句来执行指令。”

逗号小声嘟囔着:“我们用的编程语言不都是命令式的吗?”

“应该说绝大多数语言是命令式的,但非命令式的语言也是存在的。关于后者,我们稍后再议。” 冒号纠正道,“这也在情理之中。语言的演化是渐进的,大多数语言追根溯源是汇编语言的升级,而作为与机器语言一一对应的汇编语言自然是命令式的,因而这种范式最为传统和普及。”

不料问号竟穷追不舍:“为什么机器语言就一定得是命令式呢?”

“我很欣赏你这种打破砂锅问到底的精神,不过你可以问到底,我却不敢保证能答到底哦。”冒号有些逗趣地说。

问号略带腼腆地笑了。

“从理论上而言,完全可以有非命令式的机器语言存在,前提是计算机采用了特殊的硬件实现,比如非冯·诺伊曼结构的数据流机(dataflow machine)和归约机(reduction machine)。但这类计算机并未流行于市,相应的机器语言自然罕见了[1]。”冒号还是给出了理由。

引号问:“命令式编程与人们常说的过程式编程是一回事吗?”

“严格说来,过程式编程(procedural programming)是指引入了过程(procedure)、函数(function)或子程序(subroutine/subprogram)的命令式编程。但由于现代的命令式语言均具备此特征,故二者往往不加区分。”冒号回应道。

句号认为:“由于常用的语言基本上都是命令式的,其思想也与计算机的运行机制相符,一切对我们来说,似乎都是自然而然的事。”

“单纯的命令式思想的确很朴素,毋庸赘述。”冒号承认,“但有必要提一下结构化编程(structured programming或简称SP),它是在过程式编程的基础上发展起来的。其本质是一种编程原则,提倡代码应具有清晰的逻辑结构,以保证程序易于读写、测试、维护和优化。可别小瞧它,在上世纪60年代首次爆发的软件危机中,它曾起着中流砥柱的作用,就像后来的OOP一样。Pascal正是遵循结构化编程原则而设计的一种教学语言,当年也是风光无限。为直观起见,我们用图来表现程序的结构化特征(如图2-1所示)—”

 

“这是一个流程图(flowchart),或称程序框图,它描述了一个简单程序:用户从标准输入中键入算术表达式,程序打印出结果,如此循环往复,直到用户输入字符‘q’为止。”冒号解释道,“若以纯粹的结构化编程的标准来衡量,该流程图并未达标。”

叹号有些惊讶:“这个图不是再清晰不过了吗?”

“根据结构化定理(structured program theorem[2],任何程序都可用顺序(concatenation)、选择(selection)和循环(repetition)等3种基本控制结构来表示。”冒号画了几幅图(如图2-2所示)

2-2  3种基本控制结构:顺序、选择和循环

冒号指点着黑板:“结构化编程就是在三种基本结构的基础上进行嵌套组合。如果将每个基本结构看作基本电器元件,编程就是将这些元件组装成复杂的电路。请注意,所有基本元件都满足‘单入口、单出口’(single entrysingle exit,简称SESE)的原则,这使得电路井井有条,不会串线缠绕。”

引号已经看出:“上面的流程图无法用基本结构来组合,所以不是标准的结构化程序。”

冒号提出要求:“你能改造一下吗?”

引号走上讲台,在前图的基础上作了些许调整(如图2-3所示)

“嗯,不错。这下流程图可以拆解为基本结构了。”冒号表示认可,“二者的区别在于前者利用了break语句,在循环途中退出,后者通过引入quit标志(flag)保证了循环的完整性。”

逗号的脸上写下一个大大的问号:“难道连break语句都不能用吗?”

break语句只是在循环体内部的跳转,合理地使用它能简化代码,不致影响整体结构,大可不必拘泥于教条。但goto语句可以跳到程序过程中的任一点,造成静态程序static program)与动态进程dynamic process)之间的差异,影响程序可读性,是要竭力避免的[3]。”冒号如是说道,“结构化编程的思想包括两方面。在微观上,主张循规守矩,采用顺序、选择和循环3种逻辑结构,摒弃或限制goto语句[4],以避免杂乱无章的代码。在宏观上,主张分而治之(divide and conquer),采用‘自顶向下(top-down[5] 的设计,通过模块化将一个较为复杂的系统分解为若干相对简单的子系统,每个子系统可以独立地进一步分解,直到容易编码实现为止。这两方面是互为因果、互为保障的—由基本结构拼装而成的系统一定是模块清晰、层次分明的;反之,系统逐步分解到最后,一定会演化成基本结构。”

叹号产生一个想法:“能从程序的流程图上看出结构化编程与非结构化编程之间的区别吗?”

“一个按结构化编程思想设计的流程图,每个模块大小适中、模块之间关系简明、模块内部线路清晰,单从视觉上就会给人一种美感。相反,如果采用非结构化的设计,流程图往往结构如杂草般松散紊乱,脉络如迷宫般错综复杂,箭头如线头般剪不断、理还乱,情节严重的会导致读者头晕目眩,乃至抓狂吐血。”冒号极尽夸张之能事。

众人掩口失声。

 总结

命令式编程是冯·诺伊曼机运行机制的抽象。它把程序看作由若干行动指令组成的有序列表,并用变量来存储数据,用语句来执行指令。

结构化编程是过程式编程的一种原则,其主要思想是:提倡在宏观上采用‘自顶向下’的设计,微观上采用顺序、选择和循环的逻辑结构,摒弃或限制goto语句,以保证程序结构清晰、易于调试和维护。

 参考

[1]  Corrado BöhmGiuseppe JacopiniFlow DiagramsTuring Machines and Languages with Only Two Formation RulesCommunications of the ACM19669(5)366–371

[2]  Ravi SethiProgramming Languages: Concepts & Constructs2nd Ed.. ReadingMA:Addison Wesley199659-77

 插语

[1]数据流机支持数据流式语言,归约机支持函数式语言。

[2]见参考文献[1]

[3]1967年,E.W. Dijkstra 在其著名论文《Goto statement considered har- mful》中指出goto语句的危害性,主张废除这种用法。

[4]1974年,Donald Knuth在论文《Structured Programming with Goto Statements》中认为goto语句仍有其合理性,应该限制而不是完全摒弃。

[5]也称“自顶向下、逐步求精”。

 

明日请看《冒号课堂》连载之七——声明范式

本文出自电子工业出版社博文视点(武汉)新书《冒号课堂——编程范式与OOP思想》。

http://www.china-pub.com/196068&ref=ps

http://www.douban.com/subject/4031906/

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值