- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高级语言程序设计方法学第07章-10
第7章
第7章 程序控制
冯·诺依曼机器模型变量的时空特性对程序中求值的次序是十分敏感的。程序员用这类
语言要得到预想的计算,就要善于驾驭求值次序。表达式的求值次序是最低层的程序控制,在
前面章节中我们已经介绍过了。在它的上层是四类控制:顺序控制、选择控制、重复(迭代)、
函数或过程调用。本章要讨论它们。
再上二层是对程序模块的控制。包括一个程序的各模块组织以及它们与环境(软、硬件平
台)的相互关系。本章部分讨论它们。
并发控制也是一类控制,它可以在语句级,特征块和模块级实施并发控制。涉及并发结构
模型和通信机制后文第13章还要讨论。本章只讨论顺序程序控制。
结构化程序最重要的成果是程序控制。它使程序成为可分析的、分层结构的,程序正文和
程序的执行逻辑比较一致。同时也使编译器易于实现,尽管它已定论,在前述章节中也零散讨
论某些部分。本章对此作一系统的小结。
7.1 一般概述
程序控制是控制机器执行计算的次序。我们把表达式求值规则看作是微观的。则最基本的
控制对象是“语句”(Statement)所表征的计算。在英语中statement一词有陈述的意思,易
于和声明混淆,所以,有的书上主张叫“命令”(command)。对于命令式(Imperative)语言叫
命令也许更好,本书这两个词通用。
早期的高级语言脱胎于汇编语言,语句和汇编语言的一条指令对应。它相当于程序世界的
一条“指令”。是可以独立处理的最小单元(当编译或解释时)。程序员通过语言代码陈述的先
后表达是程序最基本的顺序控制。但是一个复杂的计算单有顺序指令是编不出来的。汇编语言
的JUMP指令在程序世界就成了GOTO命令。它打破单一的顺序,使程序有声有色。可以毫不夸张
地说:命令式语言只要有赋值语句V∶=EXP,简单的逻辑条件IF(e)和GOTO语句就可以编出一切
计算程序(输入/出除外)。按IF条件跳过一段代码是很容易的,GOTO返回到某起始语句即可实
现重复。早期的语言都脱离不了GOTO。
GOTO和语句标号把顺序的程序代码切分得七零八落。 编译时只能把它们分成很多可连续
执行的程序小块(显然,GOTO语句的前后语句不能在一块)的语句组。这就是模块(Module)一词
的来历。对于重复执行的块单给出关键字和截止处语句标号,并引出循环域和嵌套循环的概念。
这是模块封闭性的开始:GOTO只能从循环域内转向域外,反之不行。但当时重点还在想出方便
的GOTO表示上。单GOTO语句FORTRAN就有五种之多。流程图的发明使得编程思路清晰,而程序
代码仅仅是实现流程图的表示工具,它本身的可读性未引起足够重视。随着程序尺寸的增长,
脱离了流程图,程序正文越来越难读(见第2章图2-3示例)。即使不太大的程序,几十个GOTO来
回穿梭就成了戏称的“乱面条”程序。难读、难调、难修改。但当时人们醉心于精巧的设计。
终于酿成60年代初的软件危机。
自从1965年E.Dijkstra提出“GOTO语句是有害的”以来,60年代中叶在西方软件界引起一
场争论,因为它动摇了赖以构成巧妙计算转移的根基。既然它有害,那么,首先要回答,不用
GOTO行不行?1966年Boehm和Jacopini回答了这个问题:任何流程图的计算逻辑都可以用顺序
组、条件选择组、迭代组三种程序结构实现。这三种结构严格一个进口一个出口。也正因为如
此可以随意嵌套(将某一对进出口置换成另一结构), 构成极为复杂的程序。用这三种构件块
构造程序可完全不用GOTO语句。这就是结构化程序设计的基本思想。程序控制在块一级,块相
第1页
第7章
对封闭,即不许有控制从块的一部分处转移到另一块内。这样程序控制就成了组织顺序、选择、
迭代的结构了。
图7-1 三种最基本的程序结构
理论探索完成后要回答的第二个问题是用结构化程序代替非结构化程序会有哪些问题?
是否一切都好?事实上,结构化程序结构确有不方便之处,至少是低效。例如,在一计数循环
中查找一个数,头几次就找到了,余下空循环不做到底是不能出来的。
文档评论(0)