Programming languages 为什么BASIC有编号的行?

Programming languages 为什么BASIC有编号的行?,programming-languages,basic,Programming Languages,Basic,可能重复: 我很好奇为什么BASIC编程语言的早期版本有这样的行号: 42 PRINT "Hello world!" 当时的文本编辑器没有行号 编辑:是的,我知道它们是用于GOTO的,但为什么?我的意思是有标签在计算上太昂贵了?它们被用作GOTO和GOSUB的标签 像这样: 10 PRINT "HELLO WORLD" 20 GOTO 10 在一些早期的基本版本中没有命名标签 如果您想在现有的两行代码之间插入一行代码,也需要它们,因为在早期,您没有全文编辑器。所有内容都必须在“交互式”口译

可能重复:

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

42 PRINT "Hello world!"
当时的文本编辑器没有行号


编辑:是的,我知道它们是用于GOTO的,但为什么?我的意思是有标签在计算上太昂贵了?

它们被用作GOTO和GOSUB的标签

像这样:

10 PRINT "HELLO WORLD"
20 GOTO 10
在一些早期的基本版本中没有命名标签

如果您想在现有的两行代码之间插入一行代码,也需要它们,因为在早期,您没有全文编辑器。所有内容都必须在“交互式”口译员中输入

因此,如果您键入:

15 PRINT "AND THE UNIVERSE"
该计划将成为:

10 PRINT "HELLO WORLD"
15 PRINT "AND THE UNIVERSE"
20 GOTO 10
当行号用完时,您可以运行“重新编号”工具对程序中的所有行重新编号,但在Commodore 64和其他家用计算机的早期,我们甚至没有,因此您必须手动重新编号。这就是为什么您必须在行号中留出10行或更多的间隙,以便可以轻松地在行号之间添加行


如果您想试用Commodore 64解释器,请查看这个用Flash编写的C64仿真器:(无需安装)

控制流中使用了行号。没有命名的子例程。例如,您必须使用
GOSUB 60
,从第60行开始调用子例程


在您的更新中,并非所有语言都有标签,但所有语言都有行号。曾经,一切都是穿孔卡片。BASIC是最早的交互式语言之一,在这种语言中,你可以输入一些东西并立即做出响应。行号仍然是当前的技术

标签是额外的费用。您必须跟踪符号标签与其引用的代码或数据之间的相关性。但是,如果每一行都有一个行号(并且如果所有控制流语句的传输总是引用一行的开头),那么就不需要单独的符号表


还要记住,最初的基本解释器不需要变量的符号表:有26个变量名为a-Z。有些变量很复杂,并且有一个Zn。有些人非常喜欢在变量后添加“$”或“%”来区分字符串、整数和浮点。但是不需要符号表。

IIRC,行号主要用作GOTO和GOSUB语句的标签,因为在一些(大多数?)BASIC版本中,无法标记代码段

原来的基本行编号实际上是语言的一个组成部分,用于控制流


GOTO和GOSUB命令将获取该行,并将其用于控制流。这在当时很常见(尽管现在不鼓励这样做)。

在BASIC中,行号表示顺序


此外,许多旧的编辑器不支持文件,只支持行(“行编辑器”,例如)。通过这种方式对它们进行编号,您就知道您正在处理哪一行

它们是语句的标签,因此您可以
转到
行号。语句的数量不一定要与文件中的物理行号相匹配。

编辑也使用了这些语句-即您所说的:

edit 100

编辑第100行。

正如其他人所指出的,这些行号被用作子例程的一部分

当然,有一个原因,这是不做了。想象一下,如果你在第10行说Goto20,然后后来意识到你需要在第10行之后再写10行代码。突然之间,你将要面对20个,所以你要么需要将你的子例程移得更远(更高的数字)并改变你的GOTO值,要么你需要编写另一个在代码中跳得更远的子例程


换句话说,它成了真正的意大利面代码的噩梦,维护起来并不有趣。

回到那个时代,所有的语言都有序列号,所有的东西都在穿孔卡片上。 每张卡有一行。 一副副牌组成了你的程序

当你放下卡片时,你会把它们放在一个使用这些序列号的卡片分拣机中

当然,它们被控制流结构引用。

一些编辑器只有“覆盖”模式,没有“插入”模式。这使得编辑现有代码非常痛苦。但是,通过添加行号功能,您可以从文件中的任何位置修补现有代码:

100 PRINT "Broken Code"
200 PRINT "Foobar"
...
101 patch the broken code
102 patch more broken code

因为行号不必在文件中排序。

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

:

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


它在很多情况下都是在命令行中输入的(或者,在我的老Commodore 64上),因此可能并不总是有文本编辑器,或者如果有,它是非常基本的

此外,您还需要执行GOTOs之类的操作,以及在其他操作之间插入行

即:


许多微型计算机在ROM中有一个基本的解释器,在启动时启动。问题是没有文本编辑器或文件系统来说话
10 PRINT "HELLO"
20 GOTO 10
15 PRINT " WORLD"
>10 print "hello" >30 goto 10 >20 print "world" >list 10 PRINT "hello" 20 PRINT "world" 30 GOTO 10 >
10 PRINT "howdy"
20 GOTO 10
10 PRINT "WOOPS"
15 PRINT "MORE WOOPS"
20
RUN
WOOPS
MORE WHOOPS