【问题标题】:Explicit line numbers and execution order显式行号和执行顺序
【发布时间】:2018-07-13 13:38:51
【问题描述】:

GW-BASIC 和许多其他旧的 BASIC 方言(如 C64 BASIC)允许您执行以下操作:

20 PRINT "World"
10 PRINT "Hello"

这将在执行RUN 命令/语句时产生以下输出:

Hello
World

LIST 命令/语句将列出程序:

10 PRINT "Hello"
20 PRINT "World"

换句话说,这些 BASIC 方言会自动重新排序执行以符合您使用的行号指定的顺序,而不管您最初在另一个编辑器中键入/保存它们的顺序(例如 EDLIN.EXE) .但是,QuickBASIC 和 BASCOM2 未能做到这一点。

我可以在网上找到的最古老的 QuickBASIC 版本是 QuickBASIC 2.0,它在那里不起作用,只是忽略行号以按我写的顺序打印内容(即“World Hello”)。

BASCOM2——我能找到的最古老的 MS/IBM BASIC 编译器——显然也不支持该功能,而是因错误而失败(SQ = 乱序?):

 0046   0006    10 PRINT "Hello"
                ^ SQ

50434 Bytes Available
50325 Bytes Free

    0 Warning Error(s)
    1 Severe  Error(s)

虽然我当然了解行号是多余的,但支持以显式行号顺序 (20, 10, 30 => 10, 20, 30) 而不是隐式行号顺序 (20 , 10, 30 => 20, 10, 30)。

有人知道为什么这种传统的 BASIC 行为被忽略了吗?

【问题讨论】:

  • 旧方言 (GW-BASIC) 可能将代码放入由行号索引的数组中。
  • GW-BASIC程序中的行号是指令执行的顺序。

标签: basic qbasic gw-basic


【解决方案1】:

我很惊讶您发现的第一个 bascom 报告了错误。我曾经用于 BASIC 的所有编译器,我相信自 1982 年以来我已经使用了很多编译器,将行号设为可选并支持标签。我记得在我作为一名专业程序员的第一份工作中,我们设计了一个编译器预处理器,它只插入正确的 IF、ELSE IF 和 END IF 语句所需的行,方法是用行号和(喘气的)GOTO 语句替换内容。

由于 MZ-Tools 插件允许我通过单击一个按钮向我的方法和函数添加和删除行号,我今天仍然在我仍然支持的 VB6 会计应用程序中使用行号。这使我可以在所有错误例程中使用 Erl(错误行号),还可以快速一键添加到我的所有方法和函数中,这使我可以精确定位任何错误发生的行。

我确信编译器设计者认为行号只对解释器真正有用,也许第一个版本的 bascom 认为你会使用解释器进行开发和测试,然后编译和分发可执行文件,然后可能稍后版本认为开发人员正在使用文本编辑器,尤其是他们自己的 IDE 附带的更高版本,谁需要那里的行号?好吧,如果我们想要精确的错误报告,我们会这样做!这是我喜欢 Java 和 Eclipse 的一件事。行号在那里,所以我可以确切地知道错误在哪里,但它们不会像在 BASIC 中那样妨碍(删除行号、添加/删除代码、替换行号)。

【讨论】:

  • 最近,我得出的结论是它们变得不切实际和过时了。 “传统的” BASIC 解释器是基于命令的,允许您通过输入 EDIT 20(或仅输入 20 {new code here})来编辑第 20 行,但是像 DOS EDIT 和 Unix vi 这样的可视化编辑器的出现意味着这个功能是不必要的。明确的行号同样被认为不太必要,因为可以使用给定的行顺序。这释放了宝贵的 RAM 用于其他目的,因为不再需要保持执行有序的数组(及其搜索/插入算法)。
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2015-02-05
  • 2017-05-20
相关资源
最近更新 更多