首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当跳过循环体时,BASIC如何定位无序的NEXT语句?

当跳过循环体时,BASIC如何定位无序的NEXT语句?
EN

Software Engineering用户
提问于 2014-02-16 23:42:38
回答 3查看 593关注 0票数 9

设置WABAC机,谢尔曼。这个问题一般是关于基本的,特别是微软的基本-80。旧式基础。有电话号码。

当循环主体未被执行时(或者更确切地说,)旧的基本解释器如何处理FOR...NEXT循环,而下一个语句出现了故障呢?

“前时间”中的“无序”下一条语句:

下面是游戏阿瓦尼 out of 大卫·阿赫尔的“101基本电脑游戏”的一个子程序:

代码语言:javascript
复制
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

这里是所有的东西,除了被修改的流量控制:

代码语言:javascript
复制
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循环,因为它使用相同的循环变量,所以替换了第一个FOR循环。
  • 两个FOR循环共享相同的下一个语句。
  • 第二个FOR循环的下一个语句以源顺序出现在它前面,但在它之后,按执行顺序出现

因此,您可能会假设,在启动FOR循环之后,解释器只运行语句,直到下一个循环发生为止。在这种情况下,源中语句的顺序并不重要。但是,让我们看看basic80手册中关于循环的内容:

basic-80手册上写着“moo.”

如果循环的初始值乘以步骤的符号超过最后值乘以步骤的符号,则跳过循环的主体。

因此,可以完全跳过循环体。

我们有证据,以公布的程序的形式,至少有一些版本的BASIC是动态定位他们的下一个陈述。在执行循环体时,这是非常容易的。但是,如果在BASIC-80允许的情况下跳过FOR语句的正文,则BASIC如何定位下一条语句,考虑到它可能在FOR语句的源顺序之前?

  • "101基本电脑游戏“中使用的BASIC版本是否总是至少执行一次循环体?
  • BASIC-80是否要求FOR循环的下一个语句按源顺序出现在FOR语句之后?

PS:是的,我正在为旧学校BASIC写一个基本的翻译。这是一种疾病。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2014-02-20 17:41:33

"101电脑游戏“基本做什么

"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语句时都没有问题。不需要进行静态分析。只需在每条语句发生时执行它,您最终就会得到下一条语句,无论它在哪里。

BASIC-80是否有可能处理下一个无序的问题?

for语句可以跳过循环体,因为Basic-80V.5允许,而且在大多数情况下仍然允许无序的下一个语句。下面是操作步骤:

  • 解释器获得两种状态,“运行”和“跳到下一个”。
  • 当处于“运行”状态时,解释器将正常执行每条语句。
  • 在计算FOR语句时,如果要跳过循环体,状态将更改为“跳过到下一个”。
  • 当处于“跳转到下一个”状态时,解释器将跳过除NEXT和无条件GOTO之外的所有语句。
    • 下面是一个无条件的GOTO语句。
    • 如果下一个语句的变量与FOR语句的变量匹配(或者如果未指定变量),则切换回“not”状态。如果变量不匹配,解释器将保持“跳到下一个”状态。

这将处理简单的病理序列,如问题中的。它不会处理下一个由IF...GOTO声明或GOSUB达成的案件。这样做的代码比问题中已经很糟糕的代码要糟糕得多,所以简单地声明解释器将不支持这样的情况并非不合理。甚至允许解释器将这样的代码放火。

票数 2
EN

Software Engineering用户

发布于 2014-02-17 13:39:02

这让我们回想起过去..。

我有一本书,第三版,1975年。我查过你的名单了,这不是原创的。在原始源代码中,语句没有空格,赋值有关键字LET。例如

代码语言:javascript
复制
200 LETK=M:GOSUB600

方言是数字PDP-11基本(不是基本+或基本-80)。从经验来看,并不是所有这些游戏都在基本方言上工作。我有一个模糊的回忆,必须对其中的几个游戏,让他们工作在其他方言。这种可怕的循环结构肯定是个问题。

我有超过20个基本方言的经验,我可以告诉你,这是一个棘手的问题在当时。有两个主要营地。

在一个营地里,有一名口译人员,他们每次看到每一行都会重新进行分析。他们处理一个FOR循环,方法是将它推到堆栈上,由它的变量标识,然后扫描堆栈以查找与每个下一个的匹配。如果他们跳过一个循环,他们将不得不扫描源的下一个。有的有,有的没有。

另一个阵营是标记者或半编译器。在执行之前,他们会扫描所有的行,并将它们转换成某种内部格式。他们还匹配了/NEXT循环,并检查了丢失的GOTO和GOSUB目标。据我所知,12月和基本80号都在这个营地,但那是很久以前的事了。

为了回答你的问题,

  1. 是的,如果最初满足,BASIC的方言确实会跳过一个循环。
  2. 不,NEXT的排序并不是一个有记录的要求,但是行为是没有定义的。作为一名专业人士,显然我从来没有做过。:)

希望这能有所帮助。这些都是可怕的语言,但如果你要这么做.

票数 7
EN

Software Engineering用户

发布于 2014-02-16 23:50:40

我面前没有这些古老的基本解释器之一的规范的副本(它可能根本不存在),但是我将在一个不属于它的for循环上执行一个基本解释器,即使循环变量有相同的名称。

所以,换句话说,在你的例子中

代码语言:javascript
复制
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。这种情况通常发生在您的下一个程序出现问题时,如

代码语言:javascript
复制
100 FOR I = 1 to 10
110 FOR J = 1 to 10
120 ...
130 NEXT I
140 NEXT J

因此,要回答你提出的问题:

  • 是的,如果循环变量在FOR的范围内。
  • 是的,据我所知,是这样的。
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/229191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档