关于编程语言:为什么BASIC有编号线?

Why BASIC had numbered lines?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why did we bother with line numbers at all?

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

1
42 PRINT"Hello world!"

当时的文本编辑器没有行编号?

编辑:是的,我知道它们是用来做哥特人的,但是为什么呢?我是说贴标签太贵了?


许多微型计算机在只读存储器中有一个基本的解释器,可以在启动时启动。问题是没有文本编辑器或文件系统可言。您有一个交互式提示来完成所有操作。如果您想插入一行代码,您只需键入它,从行号开始。它会将它插入代码中的正确位置。例如:

1
2
3
4
5
6
7
8
>10 print"hello"
>30 goto 10
>20 print"world"
>list
10 PRINT"hello"
20 PRINT"world"
30 GOTO 10
>

(在该示例中,>是基本提示)

如果您想删除一行,您可以键入类似于ERASE 20的内容。一些非常奇特的系统为您提供了一个行编辑器(即EDIT 10)。如果你没有计划好你的行号并且用完了(我如何在10到11之间插入一行?)有些系统向您提供了一个RENUM命令,它将重新对代码编号(并适当地调整GOTOsGOSUBs)。

快乐时光!


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

goto和gosub命令将获取该行,并将其用于控制流。这在当时是很常见的(即使现在不鼓励)。


它们被用作goto和gosub的标签。

这样地:

1
2
10 PRINT"HELLO WORLD"
20 GOTO 10

在一些早期的基本版本中没有命名标签

如果您想在现有的两行代码之间插入一行代码,那么它们也是必需的,因为在早期,您没有全文编辑器。所有东西都必须在"交互式"解释程序中输入。

因此,如果您键入:

1
15 PRINT"AND THE UNIVERSE"

该计划将成为:

1
2
3
10 PRINT"HELLO WORLD"
15 PRINT"AND THE UNIVERSE"
20 GOTO 10

当您的行数用完时,您可以运行一个"重新编号"工具来对程序中的所有行重新编号,但是在Commodore64和其他家用计算机的早期,我们甚至没有这样的行数,因此您必须手动重新编号。这就是为什么您必须在行号中留下10个或更多的空白,这样您就可以轻松地在中间添加行。

如果您想试用Commodore64解释器,请查看这个用flash编写的C64模拟器:http://codeazur.com.br/stuff/fc64_final/(不需要安装)


基本上,行号表示序列。

此外,许多旧的编辑器不是用于文件,而是简单的行("行编辑器",例如Ed,标准编辑器)。通过这样编号,您就知道您正在处理的是哪一行。


一个简单的谷歌揭示了维基百科对它的看法:

Line numbers were a required element of syntax in some older programming languages such as GW-BASIC.[2] The primary reason for this is that most operating systems at the time lacked interactive text editors; since the programmer's interface was usually limited to a line editor, line numbers provided a mechanism by which specific lines in the source code could be referenced for editing, and by which the programmer could insert a new line at a specific point. Line numbers also provided a convenient means of distinguishing between code to be entered into the program and commands to be executed immediately when entered by the user (which do not have line numbers).

< /块引用>


早在那一天,所有语言都有序列号,所有的东西都在穿孔卡片上。每张卡片有一行。一副牌组成了你的节目。

当你扔掉卡片时,你会把它们放在使用这些序列号的卡片分类机中。

当然,它们是由控制流构造引用的。


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


它们是语句的标签,因此您可以使用cx1(1)行编号。语句的数目不一定要与文件中的物理行号匹配。


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

在更新时,并非所有语言都有标签,但所有语言都同时具有行号。曾经,一切都是打卡。basic是最早的交互语言之一,在那里你可以输入一些东西并立即做出响应。线号仍然是当前的技术。

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

还要记住,最初的基本口译员不需要一个变量符号表:有26个变量名为a-z。有些变量很复杂,有一个zn。有些人非常喜欢在变量后面加"$"或"%"来区分字符串、整数和浮点。但不需要符号表。


行号是语言的一部分,在一些早期版本中,甚至操作系统也只是这些简单的行。你所拥有的只是一行一行地操纵。尝试使用1-4K程序文件编写一个会计系统,并按大小对其进行分段,以完成工作。要编辑,请使用行号来说明正在编辑的内容。所以,如果您输入如下:

1
2
3
4
5
6
10 PRINT"howdy"
20 GOTO 10
10 PRINT"WOOPS"
15 PRINT"MORE WOOPS"
20
RUN

你会得到:

1
2
WOOPS
MORE WHOOPS

空白20将有效删除该行。


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

此外,您还需要执行goto等操作,并在其他操作之间插入行。

IE:

1
2
3
10 PRINT"HELLO"
20 GOTO 10
15 PRINT" WORLD"

它在逻辑10 15 20中的位置


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

1
2
3
4
5
100 PRINT"Broken Code"
200 PRINT"Foobar"
...
101 patch the broken code
102 patch more broken code

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


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

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

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


编辑也用过它们——你说:

1
edit 100

编辑第100行。


IIRC中,行号主要用作goto和gosub语句的标签,因为在某些语句中(大多数?)基本风格没有办法标记代码的一部分。