为什么BASIC语言要使用数字行号?

20

可能是重复问题:
为什么我们一直都要使用行号?

我很好奇早期版本的BASIC编程语言为什么像这样使用行号:

42 PRINT "Hello world!"

那时候的文本编辑器没有行号吗?
编辑:是的,我知道它们用于GOTO,但为什么呢?我的意思是,拥有标签会计算开销太大吗?

13
当我加载页面时,没有任何答案。当我输入完我的答案后,包括我的在内有六个答案。回答过载。 - Mike Daniels
3
我想你可能触动了人们的怀旧情绪...许多美好的回忆从过去的日子里涌现出来... - NealB
1
为什么我们要费心去使用行号? - gnovice
1
如果你愿意的话,你可以在Visual Studio中启用行号。这是进行代码审查时引用代码的好方法(例如,您可以说“请重构文件xys.cs第150-160行,将代码拆分为几个方法”)。 - Keith Adler
4
@Nissan: "那些不是同样意义上的行号。它们不是程序的一部分,只是编辑器显示的一部分,就像左边界一样。" - John Saunders
显示剩余3条评论
15个回答

29
许多微型计算机在启动时都有一个BASIC解释器,但问题是没有文本编辑器或文件系统。你只能通过交互式提示符完成所有操作,如果你想插入一行代码,只需从行号开始输入,它会将其插入到正确的位置。例如:

>10 PRINT "hello"
>30 GOTO 10
>20 PRINT "world"
>LIST
10 PRINT "hello"
20 PRINT "world"
30 GOTO 10
>

(在此示例中,“>”是BASIC提示符)

如果你想删除一行,可以键入类似于ERASE 20的内容。一些高级系统会给你一个行编辑器(如EDIT 10),如果你没有计划好行号并且用完了(如何在10和11之间插入一行?)一些系统会提供一个RENUM命令来重新为代码编号(并相应地调整GOTOsGOSUBs)。

这真是有趣的时光!


8
那时候不仅没有互联网,如果你想使用一台电脑,你需要步行前往它所在的地方(可能还要爬山越岭)。当Ferruccio说没有文件系统时,意思是最早的微型计算机系统根本没有永久存储设备。关掉电源后,所有东西都会消失。后来,我们有了将程序保存在盒式磁带上的能力。有时,如果你成功调整了级别,甚至可以从磁带中重新加载程序。 - Hugh Brackett
不幸的是,即使这个答案是最受欢迎的,它和其他14个答案一样是错误的。 BASIC语言中使用行号的原因是因为在创建BASIC语言的达特茅斯学院,它被设计用于与分时计算机系统上的电传打字终端配合使用。保持代码行的顺序并访问它们以进行修改的唯一方法是使用行号。从未使用过电传打字终端计算机终端(例如Teletype Model 33 KSR或Teletype Model 35 ASR)的人根本没有经验可以提供正确的答案。 - Andrew P.
@AndrewP. - 我理解你需要行号来跟踪TTY上的代码,但这并不需要将行号作为语言的组成部分。我曾在TTY上进行过一些FORTRAN和Pascal编程。当时的文本编辑器会在源代码中添加行号以便在进行编辑时参考,但它们实际上并不是源代码的一部分。我猜测早期的微型计算机之所以采用TTY输入模型,是因为这些机器的资源限制。 - Ferruccio

9

原始的BASIC语言中,行号实际上是控制流程的一个重要组成部分。

GOTO和GOSUB命令会使用行号进行控制流程。虽然这种做法现在已经不被鼓励,但在过去是很常见的。


4
虽然你的回答并没有错,但更完整的回答应该表明,缺乏交互式文本编辑器使得行号成为必要之恶,以便在已输入的行之间插入额外的代码行。 - user113476
@roygbiv:这确实是BASIC中行号存在的最重要原因。 - Philippe Leybaert
@Philippe:“重要的原因”,并非最重要的原因。如果没有 GOTO 或 GOSUB,程序就不太有趣。 - John Saunders
2
不要忘记,行号在调试时非常有用,因为编译器/运行时会在发生语法错误/异常时报告有问题的行号。 - Keith Adler
到目前为止,在这个线程中有两个原因:GOTO/GOSUB和编辑... 还有其他的原因吗? - user113476
显示剩余3条评论

8
他们被用作GOTO和GOSUB的标签。
就像这样:
10 PRINT "HELLO WORLD"
20 GOTO 10

在早期的BASIC版本中没有命名标签。

如果您想在两行现有代码之间插入一行代码,也需要使用它们,因为在早期,您没有完整的文本编辑器。一切都必须在“交互式”解释器中输入。

所以,如果您输入:

15 PRINT "AND THE UNIVERSE"

程序将变为:
10 PRINT "HELLO WORLD"
15 PRINT "AND THE UNIVERSE"
20 GOTO 10

当你的代码行号用完后,你可以运行一个“重新编号”工具来重新给程序中的所有行编号,但在Commodore 64和其他家用计算机的早期阶段,我们甚至没有这个工具,所以你必须手动重新编号。这就是为什么你需要在行号中留下10或更多的间隔,这样你就可以轻松地在它们之间添加新的行。
如果你想尝试Commodore 64解释器,请查看这个用Flash编写的C64模拟器:http://codeazur.com.br/stuff/fc64_final/(无需安装)。

1
没有文字编辑器,只有一个命令行界面,你可以在其中输入代码。 - Philippe Leybaert
是的,但是这个命令行有没有名称?我在网上找不到任何参考资料,也没有截图或其他资料。 - Giovanni Funchal
@Helltone:BASIC是一种解释性语言。你需要在解释器中输入代码。 - John Saunders
@John,“edlin”是一个具体的(微软)产品 - “行编辑器”是编辑文本的通用概念。 - anon
1
@John 实际上,“edlin” 在 Windows 中仍然可用,至少在我此刻运行的 Win2K 中是如此。打开命令行提示符并键入“edlin foo.txt”,以体验其出色的用户界面。 - anon
显示剩余7条评论

7
在BASIC中,行号表示顺序。
此外,许多旧编辑器并不是针对文件的,而只是针对行数的(“行编辑器”,例如ed,标准编辑器)。通过这种方式编号,您可以知道正在处理哪一行。

7

简单的谷歌搜索可了解到维基百科对此的解释:

在一些旧的编程语言(如GW-BASIC)中,行号是语法的必要元素。这主要是因为当时大多数操作系统缺乏交互式文本编辑器;由于程序员的界面通常仅限于行编辑器,行号提供了一种机制,可以引用源代码中的特定行进行编辑,并且程序员可以在特定点插入新行。行号还提供了一种方便的方式来区分要输入到程序中的代码和用户输入后立即执行的命令(这些命令没有行号)。


6

早期的所有编程语言都有序列号,所有内容都存储在打孔卡片上。

每个卡片上只有一行代码。

程序由一叠叠的卡片组成。

当你丢失了这些卡片时,你需要使用一个卡片分类器来将它们按照序列号排序。

当然,这些卡片也可以通过控制流构造进行引用。


1
你可能需要提供一个链接来解释什么是打孔卡,因为根据大多数其他答案,这里的大多数人都不熟悉它们。 - Gabe

4
在C64上,甚至没有真正的编辑器(至少没有内置的)。要编辑程序的一部分,您需要执行类似于LIST 100-200的操作,然后您只能编辑当前显示在屏幕上的那些行(不能向上滚动!)

你有这个“编辑器”的参考资料吗? - Giovanni Funchal
1
是的 - 编辑器基本上就是屏幕内存,那时在8位机上非常普遍。 - Martin Beckett
3
当C64电脑启动时,解释器的一部分就开始运行了。它是不可修改的ROM的一部分(因为它必须首先被复制到RAM中,所以只留下了大约40k的64k总RAM)。它还用作基本shell(用于加载程序等)。也许你想尝试一下C64模拟器(http://en.wikipedia.org/wiki/List_of_computer_system_emulators#Commodore_64)-这很有趣 :-) - Chris Lercher

3

这些是语句的标签,可以使你 GOTO 到指定行号的语句。语句的数量不一定要与文件中的物理行号匹配。


事实上,常见而且几乎必要的是留出5-10的空隙,以便在不需要重新编号整个程序的情况下进行添加。 - Buggabill

2
行号用于控制程序流程。没有命名的子程序。例如,您必须使用“GOSUB 60”调用从第60行开始的子程序。
更新时,并非所有语言都具有标签,但是曾经所有语言都有行号。曾经,一切都是穿孔卡片。 BASIC是最早的交互式语言之一,在这种语言中,您可以实际键入某些内容并立即得到响应。行号仍然是当前技术。
标签是额外的费用。您必须跟踪符号标签与其引用的代码或数据之间的关联。但是,如果每行都有行号(并且如果所有控制流传输语句始终指向一行的开头),则不需要单独的符号表。
还要记住,原始的BASIC解释器不需要变量的符号表:有26个名为A-Z的变量。有些复杂的变量名称为An-Zn。有些变量名称则通过在变量后添加“$”或“%”来区分字符串,整数和浮点数。但是不需要符号表。

问题并不是“激进”的——汇编器在Algol-60使用它们之前就已经有标签了。问题在于标签的“多遍”解析。早期的汇编器(和编译器)必须多次读取整个程序源代码才能解析标签名称。这只是很慢而已。 - S.Lott
@S.Lott:我好像丢失了我的“ALGOL-60”注释。 - John Saunders

1

行号是语言的一部分,在一些非常早期的语言中,甚至操作系统也只是这些简单的行。你所拥有的就是一次只能操作一行。试着使用1-4k程序文件编写会计系统,并通过大小对其进行分段以完成任务。编辑时,您使用行号来确定正在编辑的内容。因此,如果您输入:

10 PRINT "howdy"
20 GOTO 10
10 PRINT "WOOPS"
15 PRINT "MORE WOOPS"
20
RUN

你将会得到:

WOOPS
MORE WHOOPS

将空白的20删除,可以有效地删除该行。


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