41

当你用 BASIC 写东西时,你需要使用行号。像:

10 PRINT "HOME"
20 PRINT "SWEET"
30 GOTO 10

但我想知道:谁提出了使用行号的想法?这真是令人讨厌,并在发展中(双关语)世界中留下了相当大的“回声”!

4

16 回答 16

76

当时的想法是,您可以通过使用适当的行号轻松地在程序中的任何地方添加代码。这就是为什么每个人都使用行号 10、20、30.. 所以还有空间:

10 PRINT "HOME"
20 PRINT "SWEET"
30 GOTO 10
25 PRINT "HOME"

在 BASIC 可用的第一个接口上,没有闪亮的编辑器,甚至没有 vi 或 emacs(或 DOS 编辑,呵呵)之类的东西。您只能在控制台上打印出您的程序,然后通过首先给出适当的行号来添加新行或替换它们。您无法像现在习惯的那样使用光标浏览“文件”(程序保存在内存中,尽管您可以将副本保存在磁盘上)。

因此,行号不仅需要作为臭名昭著的 GOTO 的标签,而且确实需要告诉解释器您正在编辑的程序流中的哪个位置。

于 2009-02-12T14:23:19.683 回答
45

它有着悠久的历史。

行号实际上来自达特茅斯 BASIC,它是 BASIC 编程语言的原始版本,是所谓的达特茅斯时间共享系统的组成部分。那个 DTSS 有一个基本的 IDE,它只不过是一个交互式命令行。

所以在这个“IDE”中输入的每一行,以一个行号开头,都被添加到程序中,用相同的数字替换任何以前存储的行;其他任何东西都被假定为 DTSS 命令并立即执行。

于 2009-02-12T14:24:58.183 回答
43

在出现 VDT(视频显示终端)之类的东西之前,我们是在打孔卡上编程的老前辈。打孔卡为序列号保留第 72-80 列 - 如果您丢弃了卡片组并且它们都出现故障,您可以将卡片组放入卡片分类器中,该分类器将根据这些序列号对卡片进行排序。在许多方面,BASIC 行号与那些序列号相似。

BASIC 世界的另一个优势是,在过去,BASIC 在运行时被解释。为分支使用标签而不是连续的行号将需要第一次通过来获取所有标签及其位置,就像您使用行号一样,解释器知道它是否需要开始向前或向后扫描目的地。

于 2009-02-12T14:28:29.687 回答
19

过去你没有像 emacs 或 vi 这样的二维编辑器。你所拥有的只是命令行。

您的程序存储在内存中,您可以输入单行命令来编辑单行。

如果您是 Unix 神,您可以使用 ed 或其他东西来完成,但对于 C-64、VIC-20 或 TRS-80 上的 BASIC,您只需覆盖该行。

所以一个会话可能看起来像:

$10 PRINT "Hellow World"
$20 GOTO 10
$10 PRINT "Hello World"

现在程序可以正常工作了。

一些较旧的大型机甚至有没有屏幕的线路终端。你的整个会议都是用墨水印在纸上

于 2009-02-12T14:25:03.877 回答
9

WHO?” 将是发明者 Kemeney 和 Kurtz。

阅读回复后,我查看了“达特茅斯 BASIC”的Wikipedia 条目,并惊讶地发现

第一个编译器是在分时系统准备好之前产生的。它被称为 CardBASIC,旨在用于基于标准读卡器的批处理系统。

所以,看起来保罗汤布林“得到了广场”。

于 2009-03-07T18:56:48.047 回答
7

Paul Tomblin 的回答是最全面的,但我很惊讶没有人提到 BASIC 项目最初目标的很大一部分是使用分时提供一个对初学者友好的交互环境。(Kurtz 和 Kemeny 对“所有学生的普遍访问”的愿景在这方面远远领先于当时的时代。)

为实现这一目标而开发的 BASIC 系统具有 Teletype ASR-33(以及后来的其他)打印终端。当连接到具有分时功能的操作系统时,它们允许在交互模式下编辑和运行 BASIC 程序(与使用穿孔卡片不同),但它们不是光标可寻址的。行号是一种对初学者友好的方式,既可以指定程序语句的顺序,又可以在没有屏幕编辑器的情况下进行明确的编辑。“行编辑器”的 Wikipedia 条目进一步解释了,任何曾经尝试使用行编辑器(例如 Un*x 'ed')的人都可以理解为什么应该感谢 Kurtz 和 Kemeny 让初学者免于学习神秘以这种方式编辑文本所需的命令序列。

于 2013-03-31T19:59:36.203 回答
6

它们起源于 FORTRAN,BASIC 就是从它衍生而来的。但是,在 FORTRAN 中,只有其他行(如 GOTO 目标)引用的行需要数字。在 BASIC 中,它们有一个次要用途,即允许编辑特定的行。

于 2009-02-12T14:23:57.827 回答
2

我猜它来自汇编程序,其中每条指令都有一个可以被另一条指令跳转到的地址。

此外,第一台计算机没有太多内存,存储一个行号只需要两个字节(如果做得好的话)。写一个标签需要更多的内存,首先是在定义标签的位置,然后是任何跳转命令。

最后,在过去的美好时光里,没有任何花哨的编辑。唯一的“编辑器”是一个简单的命令行界面,它将以数字开头的所有内容视为程序的一部分,并将其他所有内容视为立即执行的命令。最突出的例子应该是 Commodore 64。

Basic 的较新方言不再需要行号。

于 2009-02-12T14:28:04.947 回答
2

回到 50 年代,当高级编程语言刚刚起步时,没有终端,没有编辑器,没有监视器(是的,没有监视器),只有打卡机和读卡器(用于将卡片的内容写入和读取到内存中)计算机)和打印机(自然用于打印结果)。后来,磁带被引入,但那是另一回事了。

每张打孔卡都有自己的编号。有几个原因;从纯粹保持它们的顺序,到确定执行顺序。每张卡都是一行代码(以今天的术语)。由于那时还没有 if..then..else 之类的构造,或者任何类似的变体,因此必须以某种方式确定执行顺序。因此引入了 GOTO 语句。它们是循环的基础。“意大利面条代码”一词也来自那个时期,因为写得不好的代码相对难以理解,就像盘子里的意大利面条:)

于 2009-02-12T15:20:01.000 回答
1

在 Basic 中,如果您没有行号,如何执行

GOTO 10 

那是一种跳线的方法,一种被发现的好方法……20多年前!

今天,这些行帮助我们捕获错误/异常,因为调试引擎会向我们发送消息,即我们在第 xxx 行遇到异常,我们立即跳转到它!

想象一个没有行号的世界……如果没有行号,记者怎么能得到报酬?

“既然你知道小说,你必须写一个不超过50行的摘要”

记住这一点?即使在学校,我们也了解行号!

如果它不是发明的,那么已经有人再次发明了,所以我们可以很好地使用它:)

于 2009-02-12T14:22:18.720 回答
1

并非所有 BASIC 版本都需要行号。例如,QBasic 支持标签。然后你可以跳到那些有 GOTO 的(暂时忽略 Dijkstra 的“Go To Statement Considered Harmful”)。

于 2009-02-12T14:41:17.207 回答
1

答案已经在上面了。Paul Tomblin 写了它(对 zabzonk 有一个警告)。

实际上,我认为任何没有提到“打孔卡”的答案都是不完整的,如果它既没有提到打孔卡也没有提到 FORTRAN,那就错了。我可以说这绝对是正确的,因为我的父母都经常使用打孔卡(他们从 FORTRAN 66 和 77 开始),然后在 80 年代迁移到 Basic 和 COBOL。

于 2009-02-12T15:05:09.083 回答
1

早期,大多数节目都是通过打孔卡进入的。穿孔卡片通常按顺序输入,通常每张卡片一个指令,标签(JMP/JSR 目标)是单独的指令卡片。

要编辑您的程序,您更换了卡。

后来的实现在该行的右端添加了一个可选的序列号,以便当/如果它们出现故障时,它们可以由自动阅读器重新排序。

Fortran 使用左侧的数字目标标签 (col 1-5) 并在右侧 (73-80) 留下一个保留块用于序列或注释。

最初编写 BASIC 时,决定将序列号向左移动,进入 FORTRAN 的标签字段,并允许覆盖先前卡的内存占用……作为一种编辑模式。这是为交互式开发环境设计的,但也适用于卡片。出于各种原因,在一些早期的实现中使用了卡片。

请记住:在 1970 年代后期,许多计算机都是读卡器和打印机接口。即使有交互模式基础,也经常使用打卡的基础程序。由于许多只是简单地输入 IDE,因此它们的工作方式完全相同。包括最后需要一张“跑步”卡。在这种情况下,可以简单地粘贴一张修正卡和另一张运行卡,以对某个变量进行更改重新运行;同样,在复杂的程序中,只需在运行前添加一个更正的卡片行就足以编辑出问题,而无需花费宝贵的时间来查找错误的卡片本身。

于 2012-06-30T21:02:06.367 回答
0

我喜欢飞出个未来的机器人教堂,墙上写着类似的东西

10 SIN
20 GOTO HELL

在 Speccy 上,您无法编辑没有行号的行。

于 2009-02-12T14:23:23.147 回答
0

我发现它们在配对时非常有用。当我的配对有键盘时,我不必指向一行,我可以说,“在第 74 行,那不应该是 getMoreBeer() 吗?”

于 2009-02-12T14:27:24.527 回答
-1

最初的 DOS 编辑器是一个很棒的实用程序,叫做edlin。您只能编辑一行。为了让 BASIC 的许多版本中的生活更加有趣,您可以无序键入行,第 10、20、30、25、5 行,执行将按行号而不是按出现顺序。

于 2009-02-12T14:31:19.837 回答