设置WABAC机,谢尔曼。这个问题一般是关于基本的,特别是微软的基本-80。旧式基础。有电话号码。
当循环主体未被执行时(或者更确切地说,)旧的基本解释器如何处理FOR...NEXT循环,而下一个语句出现了故障呢?
下面是游戏阿瓦尼 out of 大卫·阿赫尔的“101基本电脑游戏”的一个子程序:
200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220这里是所有的东西,除了被修改的流量控制:
200 GOSUB 600
215 FOR I=0 TO 5:IF ... THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF ... THEN RETURN
235 GOTO 220这会让你回忆起不那么美好的回忆吗?你能听到迪克斯特拉在他的坟墓里翻滚吗?
下面是在这个片段中发生的有趣的部分:
因此,您可能会假设,在启动FOR循环之后,解释器只运行语句,直到下一个循环发生为止。在这种情况下,源中语句的顺序并不重要。但是,让我们看看basic80手册中关于循环的内容:
如果循环的初始值乘以步骤的符号超过最后值乘以步骤的符号,则跳过循环的主体。
因此,可以完全跳过循环体。
我们有证据,以公布的程序的形式,至少有一些版本的BASIC是动态定位他们的下一个陈述。在执行循环体时,这是非常容易的。但是,如果在BASIC-80允许的情况下跳过FOR语句的正文,则BASIC如何定位下一条语句,考虑到它可能在FOR语句的源顺序之前?
PS:是的,我正在为旧学校BASIC写一个基本的翻译。这是一种疾病。
发布于 2014-02-20 17:41:33
"101计算机游戏“微机版中使用的BASIC方言将至少执行一次FOR...NEXT循环。这确实不同于BASIC-80 v. 5。
i12 p.来自p.,列出了“普通”BASIC的例外情况:
FOR...TO...STEP
与标准BASIC一样,除了结束循环的测试是在执行h之后进行的。也就是说,当这个程序运行: 10 X=2到12 0打印"HI“30下X40端"HI”将被打印.
正因为如此,BASIC的这种方言在查找下一个语句或与多个FOR语句共享相同的NEXT语句时都没有问题。不需要进行静态分析。只需在每条语句发生时执行它,您最终就会得到下一条语句,无论它在哪里。
for语句可以跳过循环体,因为Basic-80V.5允许,而且在大多数情况下仍然允许无序的下一个语句。下面是操作步骤:
这将处理简单的病理序列,如问题中的。它不会处理下一个由IF...GOTO声明或GOSUB达成的案件。这样做的代码比问题中已经很糟糕的代码要糟糕得多,所以简单地声明解释器将不支持这样的情况并非不合理。甚至允许解释器将这样的代码放火。
发布于 2014-02-17 13:39:02
这让我们回想起过去..。
我有一本书,第三版,1975年。我查过你的名单了,这不是原创的。在原始源代码中,语句没有空格,赋值有关键字LET。例如
200 LETK=M:GOSUB600方言是数字PDP-11基本(不是基本+或基本-80)。从经验来看,并不是所有这些游戏都在基本方言上工作。我有一个模糊的回忆,必须对其中的几个游戏,让他们工作在其他方言。这种可怕的循环结构肯定是个问题。
我有超过20个基本方言的经验,我可以告诉你,这是一个棘手的问题在当时。有两个主要营地。
在一个营地里,有一名口译人员,他们每次看到每一行都会重新进行分析。他们处理一个FOR循环,方法是将它推到堆栈上,由它的变量标识,然后扫描堆栈以查找与每个下一个的匹配。如果他们跳过一个循环,他们将不得不扫描源的下一个。有的有,有的没有。
另一个阵营是标记者或半编译器。在执行之前,他们会扫描所有的行,并将它们转换成某种内部格式。他们还匹配了/NEXT循环,并检查了丢失的GOTO和GOSUB目标。据我所知,12月和基本80号都在这个营地,但那是很久以前的事了。
为了回答你的问题,
希望这能有所帮助。这些都是可怕的语言,但如果你要这么做.
发布于 2014-02-16 23:50:40
我面前没有这些古老的基本解释器之一的规范的副本(它可能根本不存在),但是我将在一个不属于它的for循环上执行一个基本解释器,即使循环变量有相同的名称。
所以,换句话说,在你的例子中
200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220当第235行执行并进入第220行时,第220行将在顶部循环下,而不是在底部。
这在"NEXT无FOR“错误消息中很明显;基本解释器拒绝任何它没有找到对应FOR的NEXT。这种情况通常发生在您的下一个程序出现问题时,如
100 FOR I = 1 to 10
110 FOR J = 1 to 10
120 ...
130 NEXT I
140 NEXT J因此,要回答你提出的问题:
https://softwareengineering.stackexchange.com/questions/229191
复制相似问题