我们为什么要费心去加行号呢?

42

当你使用BASIC语言编写代码时,需要使用行号,例如:

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

但我想知道:到底是谁想出来使用行号的呢?这真是一件麻烦事,在开发(故意双关)世界中留下了相当大的“回声”!


1
很棒的屏幕名,remco!喜欢那些倒过来的字符。 - David Koelle
你是怎么让你的名字倒过来显示的? - gnovice
@gnovice:这是通过使用看起来像其他字符倒置的Unicode字符完成的。请参见http://www.revfad.com/flip.html作为示例。 - Joachim Sauer
3
@DavidD, gnovice:它使用了一些特殊的Unicode字符,可以查看www.flipmytext.com。 - oɔɯǝɹ
这是为什么:https://youtu.be/OFUHjDhTIJg?t=18m45s - Koray Tugay
16个回答

78

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

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

在最初支持BASIC编程语言的界面上,没有像vi或emacs那样的高级编辑器,甚至没有像DOS edit这样的简单编辑器。你只能在控制台上打印出程序,然后通过输入对应的行号来添加或替换代码。与现代编辑器不同的是,你不能像现在一样使用光标浏览整个“文件”(程序保存在内存中,但你可以将其复制到磁盘上保存)。

因此,行号不仅仅是臭名昭著的GOTO语句的标记,而且需要告诉解释器你正在编辑程序流程中的哪个位置。


那其实就是我学习编程的方式——通过重新打字来编辑。 - StuffMaster
3
这让我想起在我父母的AT&T PC6300电脑上编写GW-BASIC应用程序的回忆... - J. Polfer
8
我记得在Commodore PET上,当无法重新编号行号时,在第24行和第25行之间添加一行是一个相当大的问题。 - e100
我曾在Acorn电子设备上学习BASIC语言,它的界面正如你所描述的那样,而我已经完全忘记了这件事!回忆起这段经历真是太棒了! - Joseph Rogers
1
这是在这个code golf中使用的。 - phuclv
@LưuVĩnhPhúc 不错! - ypnos

46

它有着悠久的历史。

行号实际上来自Dartmouth BASIC,它是BASIC编程语言的原始版本,并且是所谓的Dartmouth Time Sharing System的重要组成部分。该DTSS具有一个基本的集成开发环境(IDE),仅仅是一个交互式命令行。

因此,在这个“IDE”中键入的每一行,如果以行号开头,则会被添加到程序中,替换任何先前存储的相同编号的行;其他任何内容都被认为是DTSS命令并立即执行。


5
+1 - this is the right answer. 行编辑器和即时执行结合在同一环境中,可能是BASIC最重要的贡献。 - Jules

43

在VDT(视频显示终端)出现之前,我们这些老程序员使用的是穿孔卡编程。穿孔卡将72-80列保留为序号 - 如果你的卡片堆掉了,它们都乱了,你可以把卡片放入一台排序器中,该排序器会根据这些序号对卡片进行排序。在许多方面,BASIC行号类似于那些序号。

BASIC世界中的另一个优势是,在旧日,BASIC是按解释执行的。使用标签而不是顺序行号进行分支需要第一遍扫描以捕获所有标签及其位置,而如果使用行号,则解释器就知道是否需要向前或向后扫描目标位置。


3
这是唯一正确的答案! - cwallenpoole
3
不是无关紧要,而是历史。你认为你的父母因为不是你而无关紧要吗? - Paul Tomblin
3
BASIC在20世纪70年代就已经存在了...当时还有用打孔卡片输入的BASIC实现。小时候,我通过为计算机科学专业的同学打孔卡片赚取D&D游戏的购买费,其中包括一些BASIC程序。 - aramis
2
是的,我同意。这绝对是 Punch Card 思维方式的遗留影响。此外,由于大多数早期家用计算机内置了有行号的 BASIC(如 Apple、Commodore 等),这变得非常普遍。有趣的是,这也允许您非按顺序输入程序,这有助于它们受限的编辑能力。我在 BASIC 中编写的第一件事就是文本编辑程序。但是,一旦我接触到拥有扩展 BASIC 的 VAX,我很高兴再也不用看到行号了。 - Swanny
4
BASIC最初是作为编译器而不是解释器实现的(类似于许多LISP实现在执行之前对每个表达式进行编译),因此解释器内部也是无关紧要的。 - Jules
显示剩余5条评论

20

那些年,你没有像emacs或vi一样的二维编辑器。你只有命令行。

你的程序存储在内存中,你需要输入单行命令来编辑单个行。

如果你是Unix大神,你可以用ed或其他什么东西来做到这一点,但对于C-64、VIC-20或TRS-80上的BASIC,你只需覆盖该行。

因此,会话可能看起来像:

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

现在程序将能够正确运行。

甚至还有一些老的大型机没有屏幕的线路终端。你整个会话都会被打印纸张上!


9
"Who?"指的是发明者Kemeney和Kurtz。
阅读回复后,我查看了“Dartmouth BASIC”的维基百科条目,惊讶地发现
第一个编译器是在分时系统准备好之前制作的。它被称为CardBASIC,旨在用于标准的基于卡片阅读器的批处理系统。
因此,看起来Paul Tomblin“得到了方块”。

在高中时,我们有一个“调制解调器”,让我们拨号进入达特茅斯学院的计算机,并第一手体验这个奇迹。 - gbarry
这是一个原型,作为一个实验实施,当语言被设计用于基于电传打字机的界面仍在开发时。虽然我没有直接的证据,但我敢打赌,要么(a)这个第一版本没有强制性的行编号(像Fortran一样),或者(b)使用行号来提供程序编辑而不是立即执行已经被计划好了。 - Jules

8
保罗·汤布林的回答是最全面的,但我很惊讶没有人提到 BASIC 项目最初目标的一大部分是提供一个友好的交互环境,使用时间共享技术。(库兹和凯门伊关于“为所有学生提供普遍接入”的愿景在这方面远超时代。)
为实现这一目标开发的 BASIC 系统采用了 Teletype ASR-33(以及后来的其他)打印终端。当连接到具备时间共享功能的操作系统时,这些终端允许以交互模式编辑和运行 BASIC 程序(不像使用穿孔卡片),但它们无法进行光标寻址。行号是一种友好的方法,既可以指定程序语句的顺序,又可以在没有屏幕编辑器的情况下进行明确的编辑。维基百科条目“行编辑器”进一步解释了这一点,任何曾经尝试过使用行编辑器(如 Unix 的“ed”)的人都会欣赏库兹和凯门伊为新手省去了学习编辑文本所需的加密命令序列的功劳。

现在(2014年初)正值BASIC诞生50周年! - Phil Perry
最深的行编辑问题是BASIC的数字解决了如何在不重新打印程序的情况下确定当前程序(慢且浪费纸张)。因此,你倾向于累积一些编辑命令,直到必须再次使用LIST命令,但在大多数像ed这样的编辑器中,每次插入/删除都会改变行号,所以如果你看到插入了2行的17i,然后是24d,你的大脑必须追踪到那个时刻的第24行=上次列出的第22行。BASIC的非连续编号保持稳定,使得跟踪代码演变变得更加容易。 - Beni Cherniavsky-Paskin
最深的行编辑问题是BASIC的数字解决了如何在不重新打印程序的情况下确定当前程序(速度慢且浪费纸张)。因此,你倾向于积累一些编辑命令,直到必须再次使用“LIST”命令,但在大多数编辑器(如“ed”)中,每次插入/删除都会改变行号,所以如果你看到插入了2行的“17i”,然后是“24d”,你的大脑必须追踪到那个时刻的第24行=上次列出的第22行。BASIC的非连续编号保持稳定,使得跟踪代码演变变得更加容易。 - undefined
打印副本既是一种诅咒,也是一种福音:你可以保留整个记录!当将调试操作与代码更改混合在一起时,你实际上得到了一个“实验笔记本”,记录了你进行的所有实验,从中你希望推断出错误。因此,能够轻松追踪每个点的源代码是一种穷人版的Git,也是更好的调试工具。要感受一下,请观看Daniel Shiffman在Apple II上的演示,注意如何通过编号的编辑(1)轻松理解代码(2),并实际上帮助跟踪他的进展/调试。现在想象一下... - Beni Cherniavsky-Paskin
硬拷贝是一种诅咒和福音:你可以保留整个记录!当将调试操作与代码更改混合在一起时,你实际上得到了一个“实验笔记本”,记录了你进行的所有实验,你希望从中推断出错误。因此,能够轻松追踪每个点的源代码是一种“穷人的Git”,能够提供更好的调试能力。要感受一下,可以观看Daniel Shiffman在Apple II上的演示,并注意到如何通过编号的编辑(1)轻松理解代码(2),实际上帮助跟踪他的进展/调试。现在想象一下, - undefined

6

它们起源于FORTRAN,BASIC是从FORTRAN派生而来的。但是,在FORTRAN中,只有其他行引用的行(如GOTO目标)需要编号。在BASIC中,它们有第二个用途,就是允许对特定行进行编辑。


此外,FORTRAN行号是任意的,更像是数字标签而不是行号。 - David Thornley

2

我猜它起源于汇编语言,每个指令都有一个地址,可以被其他指令跳转到。

此外,最初的计算机内存很少,只需两个字节(如果正确地执行),就可以存储行号。编写标签需要更多的内存,首先是在定义该标签的位置,然后是在任何跳转命令中。

最后,在旧时代没有任何花哨的编辑器。唯一的“编辑器”是简单的命令行界面,它将以数字开头的所有内容视为程序的一部分,将其他所有内容视为立即执行的命令。最著名的例子应该是Commodore 64。

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


另一个顺序行号的优点是,您不必进行第一遍扫描以获取标签及其位置 - 您可以在同一遍扫描中解释程序并运行它。 - Paul Tomblin

2

在五十年代,高级编程语言刚刚开始出现时,没有终端、编辑器或显示器(是的,没有显示器),只有卡片打孔机和读卡器(用于将卡片内容写入计算机内存中并读取)以及打印机(用于自然地打印结果)。

后来引入了磁带,但那是另一个故事。

每个打孔卡都有自己的编号。这样做有几个原因:从纯粹的保持它们的顺序到确定执行顺序。每个卡片都是一行代码(按今天的术语)。由于当时没有像 if..then..else 或其他类似的结构,必须以某种方式确定执行顺序。所以引入了 GOTO 语句。它们是循环的基础。术语“意大利面条式代码”也来自那个时期,因为糟糕的编写代码相对难以理解,就像盘子里的意大利面条一样 :)


1
在BASIC中,如果你没有行号,你如何执行一个操作?
GOTO 10 

那是一种跳行的方式,一个好的方式,早在20多年前就被发现了!

今天,行号帮助我们捕捉错误/异常,因为调试引擎会向我们发送消息,告诉我们在第xxx行出现了异常,我们可以立即跳转到该行!

想象一下没有行号的世界……没有行号,记者怎么能拿到报酬呢?

“现在你已经知道这部小说了,你必须写一份不超过50行的摘要”

还记得吗?即使在学校里,我们也要学习行号!

如果它没有被发明,某个人肯定已经重新发明了它,以便我们可以很好地使用它 :)


1
标签不是基本行号的原因,它们只是一个副作用。 - ypnos
@ypnos,你搞反了。数字标签在BASIC之前就存在了,例如在FORTRAN中,但在BASIC中它们承担了编辑/插入功能。 - Paul Tomblin
在FORTRAN中,您不需要在程序的每一行前面写上行号。这就是我们在这里讨论的内容 :) - ypnos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接