可能重复:
为什么我们要为行号烦恼?
我很好奇为什么 BASIC 编程语言的早期版本的行号如下:
42 PRINT "Hello world!"
当时的文本编辑器没有行号?
编辑:是的,我知道它们用于 GOTO,但为什么呢?我的意思是标签的计算成本太高了?
可能重复:
为什么我们要为行号烦恼?
我很好奇为什么 BASIC 编程语言的早期版本的行号如下:
42 PRINT "Hello world!"
当时的文本编辑器没有行号?
编辑:是的,我知道它们用于 GOTO,但为什么呢?我的意思是标签的计算成本太高了?
许多微型计算机在 ROM 中都有一个 BASIC 解释器,它会在启动时启动。问题是没有文本编辑器或文件系统可言。您有一个交互式提示来完成所有操作。如果你想插入一行代码,你只需输入它,从行号开始。它会将其插入代码中的正确位置。例如:
>10 打印“你好” >30 转到 10 >20 打印“世界” >列表 10 打印“你好” 20 打印“世界” 30 转到 10 >
(在那个例子中 > 是 BASIC 提示符)
如果你想删除一行,你可以输入类似ERASE 20
. 一些非常漂亮的系统给了你一个行编辑器(即EDIT 10
)如果你没有计划你的行号并且用完了(我如何在 10 和 11 之间插入一行?)一些系统给你一个RENUM
命令,它会重新编号你的代码(GOTOs
并适当调整GOSUBs
)。
娱乐时间!
最初的 BASIC 行号实际上是语言的一个组成部分,用于控制流。
GOTO 和 GOSUB 命令将占用该行,并将其用于控制流。这在当时很常见(尽管现在不鼓励这样做)。
它们被用作 GOTO 和 GOSUB 的标签
像这样:
10 PRINT "HELLO WORLD"
20 GOTO 10
在一些早期的 BASIC 版本中没有命名标签
如果您想在现有的 2 行代码之间插入一行,它们也是必需的,因为在早期,您没有全文编辑器。一切都必须在“交互式”解释器中输入。
因此,如果您键入:
15 PRINT "AND THE UNIVERSE"
该程序将变为:
10 PRINT "HELLO WORLD"
15 PRINT "AND THE UNIVERSE"
20 GOTO 10
当行号用完时,您可以运行“重新编号”工具来重新编号程序中的所有行,但是在 Commodore 64 和其他家用计算机的早期,我们甚至没有这个,所以你' d 必须手动重新编号。这就是为什么您必须在行号中留下 10 或更多的间隙,以便您可以轻松地在其间添加行。
如果您想试用 Commodore 64 解释器,请查看这个用 Flash 编写的 C64 仿真器: http: //codeazur.com.br/stuff/fc64_final/(无需安装)
在 BASIC 中,行号表示顺序。
此外,许多较旧的编辑器不是用于文件,而只是用于行(“行编辑器”,例如ed,标准编辑器)。通过以这种方式对它们进行编号,您就知道您正在处理哪条线路。
在某些较旧的编程语言(例如 GW-BASIC)中,行号是语法的必需元素。 [2] 主要原因是当时大多数操作系统都缺乏交互式文本编辑器。由于程序员的界面通常仅限于行编辑器,因此行号提供了一种机制,通过该机制可以引用源代码中的特定行进行编辑,并且程序员可以通过该机制在特定点插入新行。行号还提供了一种方便的方法来区分要输入程序的代码和用户输入后立即执行的命令(它们没有行号)。
过去所有语言都有序列号,一切都在打孔卡上。每张卡有一行。一副牌组成了你的程序。
当您放下卡片时,您会将它们放入使用这些序列号的卡片分类器中。
当然,它们被控制流结构引用。
在 C64 上,甚至没有真正的编辑器(至少是内置的)。要编辑程序的一部分,您可以执行 LIST 100-200 之类的操作,然后您只能编辑当前显示在屏幕上的那些行(不能向上滚动!)
它们是语句的标签,因此您可以GOTO
使用行号。语句的数量不一定要与文件中的物理行号相匹配。
行号用于控制流。没有命名的子程序。例如,您必须使用GOSUB 60
来调用从第 60 行开始的子例程。
在您的更新中,并非所有语言都有标签,但所有语言同时都有行号。曾经,一切都是打卡。BASIC 是最早的交互式语言之一,您可以在其中实际输入内容并立即获得响应。行号仍然是当前的技术。
标签是额外的费用。您必须跟踪符号标签与其引用的代码或数据之间的相关性。但是如果每一行都有一个行号(并且如果所有控制流语句的转移总是引用一行的开头),那么您就不需要单独的符号表。
还要记住,最初的 BASIC 解释器不需要变量的符号表:有 26 个变量名为 AZ。有些是复杂的并且有An-Zn。有些人非常花哨,并通过在变量后添加“$”或“%”来区分字符串、整数和浮点数。但是不需要符号表。
IIRC,行号主要用作 GOTO 和 GOSUB 语句的标签,因为在某些(大多数?)BASIC 风格中,无法标记一段代码。
编辑也使用了它们 - 即您说:
edit 100
编辑第 100 行。
正如其他人指出的那样,这些行号被用作子程序的一部分。
当然,不再这样做是有原因的。想象一下,如果您在第 10 行说 GOTO 20,然后意识到您需要在第 10 行之后再编写 10 行代码。突然之间,您遇到了 20 行,因此您要么需要将子程序移得更远(更高的数字)并更改您的 GOTO 值,或者您需要编写另一个在代码中跳得更远的子程序。
换句话说,它变成了真正的意大利面条代码的噩梦,而且维护起来并不有趣。
有些编辑器只有“覆盖”模式,没有“插入”模式。这使得编辑现有代码变得非常痛苦。通过添加该行号功能,您可以从文件中的任何位置修补现有代码:
100 PRINT "Broken Code"
200 PRINT "Foobar"
...
101 patch the broken code
102 patch more broken code
因为不必在文件中对行号进行排序。
在许多情况下,它是在命令行中输入的(或者是在我的旧 Commodore 64 上),因此可能并不总是有文本编辑器,或者如果有,它是非常基本的。
此外,您需要执行 GOTO 等操作,以及在其他之间插入线条。
IE:
10 PRINT "HELLO"
20 GOTO 10
15 PRINT " WORLD"
它在逻辑 10 15 20 中的位置
行号是语言的一部分,在一些非常早期的语言中,甚至操作系统也只是这些简单的行。你所拥有的只是一条线来操纵。尝试使用 1-4k 程序文件编写一个会计系统,并按大小对其进行分段以完成工作。要编辑,您使用行号来说明您正在编辑的内容。所以,如果你像这样输入:
10 PRINT "howdy"
20 GOTO 10
10 PRINT "WOOPS"
15 PRINT "MORE WOOPS"
20
RUN
你会得到:
WOOPS
MORE WHOOPS
空白 20 将有效地删除该行。