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 > |
(在该示例中,>是基本提示)
如果您想删除一行,您可以键入类似于
快乐时光!
最初的基本行编号实际上是语言的一个组成部分,用于控制流。
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语句的标签,因为在某些语句中(大多数?)基本风格没有办法标记代码的一部分。