admin 管理员组

文章数量: 887021


2023年12月19日发(作者:japonensisjavahomem本日)

Go To Statement Considered Harmful

Edsger ra

interpreter:sdulmz

经过数年的观察我发现:编程人员的质量是其在程序中产生的go to语句密度的减函数。最近,我发现了为什么go to语句的使用会有这样灾难性的影响,并且我坚信go to语句应该从所有的“高级”编程语言中取消。当时我并没有十分重视这一发现;现在才考虑提交并出版是因为在最近的研究中这一问题又出现了,我不得不这样做了。

第一个备注是:尽管程序员的活动在他构造出正确的程序时就结束了,但是在程序控制下发生的过程才是其活动的真正的主题,因为是过程完实现了预期效果;同时是过程的动态行为满足了预期指标。但是,当编写完程序后,程序相应的过程的构造往往交给机器去完成。

第二个备注是:人类智能在掌握静态关系方面变现的非常不错,人类智能在想象实时过程方面相对地发育不良。因此,我们应该尽最大的努力缩短静态程序和动态过程的概念上的间隙,从而使程序(分散在文本空间上)和过程(分散在时间上)尽可能一致。

现在考虑一下我们是怎样描述过程的的发展的。(你可能会用具体的方式考虑这个问题:假设一个过程(过程看成是一次连续的动作)

在任意动作后停止,我们必须修正什么数据才能使过程重新进行到相同的点?)如果程序是纯粹的赋值语句(为了讨论的方便,赋值语句看成是对单个动作的描述)的串联,我们能够指出两个连续的动作描述之间的间隔点。(如果没有go to语句,可以允许前面句子的“连续的动作描述”在语法上存在歧义:如果将其理解成“连续的(动作描述)”,意思是指在文本空间上连续;若果将其理解成“(连续的动作)描述”,则是指时间上连续。)我们将这样的指示器称之为文本索引。

在考虑条件语句(if B then A),分支语句(if B then A1 else

A2),选择语句(case[i] of (A1,A2,„,An)),或者hy介绍的条件语句(B1->E1,B2->E2,„,Bn->En),过程的发展仍然是用单个文本索引描述的。

一旦我们涉及到语言程序,我们必须承认单个的文本索引是不够用的。当文本索引指向程序体(procedure body)的内部,只有当我们向动态过程给出涉及到的程序调用时才能描述动态过程。我们可以通过一个文本索引序列描述过程的发展,序列的长度等于程序调用的深度。

现在在考虑循环语句(while B repeat A or repeat A until B)。逻辑上来讲,这样的循环语句是多余的,因为循环语句可以用递归程序表示。但是站在现实主义的角度来看,我不希望取消循环语句:一方面,循环语句在现有的设备上可以很好地实现;另一方面,推理模

式—归纳法可以是我们理解循环语句发生的过程。在有循环语句的程序中,文本索引不足以描述过程的动态发展过程。然而,可以用“动态索引”与循环语句的每一个入口(循环允许嵌套)联系起来,用动态索引计数对应的当前循环的序号。由于循环允许嵌套,过程的发展就可以用文本索引序列或动态索引序列来描述。

要点是这些索引值是不受程序员控制的,不管程序员是否希望产生这些索引值,他们都会在过程的动态进展中产生。这些索引提供了独立的坐标系描述过程的进展。

我们为什么需要这样的独立坐标系呢?原因是:只有考虑过程的发展我们才能理解一个变量(例如n)的值。如果想计数一开始是空的房间中的人数,可以用n计数,任何时候看到有人进入房间则n=n+1。在我们观察到有人进入房间但是还没有执行后续的n=n+1动作时,那么n的值等于房间中得人数减一。

Go to语句的滥用的直接后果是很难找到有意义的坐标集描述过程的发展。通常会考虑用选定变量的值作为坐标集,但是这是不可能的因为选定变量的值与这些变量值被理解的过程是相关的,不是独立的!当然,再有go to语句的程序中,我们人可以通过计数器计数从程序开始执行的动作数目唯一地描述过程。麻烦的是:这样的坐标系尽管是唯一的,但是却毫无用处。因为在这样的坐标系中,定义过程发展中得所有间隔点是一件十分复杂的事情,正如n表示房间中的人数那个例子。

以现状来说,go to语句太原始了;它引诱人把自己的程序弄的一团糟。控制go to语句的使用,它还是值得重视的欣赏的。就满足所有需要而言,我并不认为前面提到的语句是彻底的,但是不管建议是用什么语句,他们都应该满足维持独立坐标系并以一种有益的可管理的方式动态过程描述这一要求。


本文标签: 过程 语句 程序 描述 动态