为什么 BASIC 中的标签以 10 为增量?

Why are labels in BASIC increments of 10?

在 BASIC 中,标签以 10 为增量。例如,mandlebrot.bas from github/linguist:

10 REM Mandelbrot Set with ANSI Colors in BASIC
20 REM https://github.com/telnet23
30 REM 20 November 2020
40 CLS
50 MAXK = 32
60 MINRE = -2.5
70 MAXRE = 1.5
80 MINIM = -1.5
90 MAXIM = 1.5
100 FOR X = 1 TO WIDTH
110 FOR Y = 1 TO HEIGHT
120 LOCATE Y, X
130 REC = MINRE + (MAXRE - MINRE) / (WIDTH - 1) * (X - 1)
140 IMC = MINIM + (MAXIM - MINIM) / (HEIGHT - 1) * (Y - 1)
150 K = 0
160 REF = 0
170 IMF = 0
180 K = K + 1
190 REF = REC + REF * REF - IMF * IMF
200 IMF = IMC + REF * IMF + REF * IMF
210 IF REF * REF + IMF * IMF > 4 THEN GOTO 230
220 IF K < MAXK THEN GOTO 180
230 M = 40 + INT(8 / MAXK * (K - 1))
240 PRINT CHR$(27) + "[" + STR$(M) + "m";
250 PRINT " ";
260 PRINT CHR$(27) + "[49m";
270 NEXT Y
280 NEXT X

为什么它不以 1 为单位递增?那会更有意义。

简短的回答是 BASIC 编号以 1 为增量,但程序员可以并且确实会跳过一些增量。 BASIC 源于 Fortran,它也使用数字标签,并且经常使用 10 的增量。与 Fortran 不同,早期的 BASIC 需要编号 all 行,这样它们就从标签变成了行号。

BASIC 以大于 1 的增量进行编号,以允许在现有行之间添加新行。

  1. 大多数早期的家用计算机 BASIC 实现没有 built-in 重新编号行的方法。
  2. 具有行号的 BASIC 实现中的代码执行按行号顺序发生。

这意味着,如果您想添加新行,则需要在这些行之间留出数字。即使在具有 RENUM 实现的计算机上,重新编号也可能需要时间。因此,如果您想要标准增量,您通常仍然只在会话结束时或您认为自己已经基本完成时才返回。

推测:出于至少两个原因,程序员专门为 BASIC 行号使用 10 的增量。第一,传统。那个时代的 Fortran 代码在使用任何标准增量时似乎使用 10 的增量作为其标签。第二,外观。在那个时代的小屏幕上,如果 BASIC 行都以相同的符号结尾,则更容易看出它们从哪里开始,而零是一个非常有用的符号。从个人经验来说,我沿袭了百界千界开始不同套路的参差不齐的传统,以利用行首的多个零。这使得以后阅读代码时更容易识别这些例程的开始。

BASIC 源自 Fortran,它也使用数字,但作为标签。 Fortran 行仅在需要引用时才需要标签,例如使用 GO TO 以了解可以从何处退出循环,或者作为 WRITE 的 FORMAT。这些行的增量通常也大于 1——通常也是 10——以便 space 可以在必要时在两者之间添加更多。这在技术上不是必需的。因为它们是标签而不是行号,所以它们不需要是连续的。但是大多数程序员为了可读性而将它们顺序排列。

Erik Boman 在他的 commonly-used Fortran 77 tutorial 中写道:

Typically, there will be many loops and other statements in a single program that require a statement label. The programmer is responsible for assigning a unique number to each label in each program (or subprogram). The numerical value of statement labels have no significance, so any integer numbers can be used. Typically, most programmers increment labels by 10 at a time.

BASIC 要求所有行都有数字并且行号是连续的;这是使用行号的部分目的:可以乱序输入 BASIC 程序。这允许以后进行编辑。因此,可以在添加第 10 行和第 20 行之后添加第 15 行。这使得在现有行号之间留下潜在的行号更加有用。

如果您查看包含 BASIC 程序列表的杂志,例如 Rainbow Magazine or Creative Computing,您会经常看到数字随机夹在十位之间。根据风格的不同,许多人在例程或子例程的开头使用比行号少一的行号来注释例程。例程和数据部分也可能从数百甚至数千开始。

使用这种约定的程序员甚至可能不想对程序重新编号,因为这会弄乱他们的约定。 BASIC 程序通常是大量文本;任何提高可读性的约定都会受到欢迎。

即使在家用电脑时代之前,十也是一个普遍接受的间距。在他的 basic basic, second edition(1978 年,并期望用户使用“远程终端”)中,James S. Coan 写道(第 2 页):

It is conventional although not required to use intervals of 10 for the numbers of adjacent lines in a program. This is because any modification in the program must also have line numbers. So you can use the in-between numbers for that purpose. It should be comforting to know at this point that the line numbers do not have to be typed in order. No matter what order they are typed in, the computer will follow the numerical order in executing the program.

Coan Basic Fortran 中有类似模式的示例。例如,第 46 页有一个简单的程序“搜索毕达哥拉斯三元组”;而第一个标签是 12,其余标签分别是 20、30 和 40。

他使用了类似的模式,但没有以 10 为增量;例如,在 Basic Fortran 的第 132 页,Coan 使用 2 的增量作为他的标签,并将程序的计算部分保持在数百位,而程序的显示部分则保持在 2 位数百。 END 语句使用标签 9900。

同样,Henry Ledgard 和 Andrew Singer 在他们 1982 年 Elementary BASIC 中写道(第 27 页):

Depending on the version of Basic you are using, a line number can consist of 1 to 4 or 5 digits. Here, all line numbers will consist of 4 digits, a common practice accepted by almost every version of Basic. The line numbers must be in sequential order. Increasing line numbers are often given in increments of 10, a convention we will also follow. This convention allows you to make small changes to a program without changing all the line numbers.

Jerald R. Brown 的 1982 Instant BASIC:第 2 惊人(第 7 页):

You don’t have to enter or type in a program in line number order. That is, you don’t have to enter line 10 first, then line 20, and then line 30. If we type in a program out of line number order, the computer doesn’t care. It follows the line numbers not the order they were entered or typed in. This makes it easy to insert more statements in a program already stored in the computer’s memory. You may have noticed how we cleverly number the statements in our programs by 10's. This makes it easy to add more statements between the existing line numbers -- up to nine more statements between lines 10 and 20, for example.

在 BASIC 程序中如何对行编号的选择大部分是基于传统和对有效方法的模糊认识。在家用计算机时代尤其如此,在这个时代,大多数用户并没有学习 类 如何使用 BASIC,而是通过阅读其他人的程序,从提供程序列表的许多书籍和杂志中输入它们来学习。增加 10 并在这些增量之间插入新功能的传统是显而易见的。

你可以看到它扫描旧代码书籍,例如 101 BASIC Computer Games。第一个程序“Amazon”将其行号增加 10。但在这样的情况下e 点,user/coder 在代码打印出玩家有多少美元后决定他们需要额外的 space;所以 extra naked PRINT 在第 195 行。而游戏说明的显示都保持在第 100 和 109 行之间,这是另一种常见模式。

程序列表 on page 30 for Basket 显示了在成百上千时启动单独例程的常见习惯。这些例程中的行号继续增加 10。即使新功能(可能还有其他模式)在模式之外添加了几行,模式也相当明显。

随着 BASIC 实现开始获得 RENUM 命令,出现了更多的 BASIC 代码清单,增量为 1。这部分是因为使用一个增量使用更少的内存。虽然行号本身使用固定数量的 RAM(结果是最大行号通常是 somewhere around FFFF,或 65525),但 references 行号并不倾向于使用固定长度。因此,较小的行号总体上使用较少的 RAM。

根据程序的大小以及它使用的分支数量,与机器本身的 RAM 量相比,这可能很重要。

例如,我最近输入了 October 1984 Rainbow Magazine 第 97 页的 SKETCH.BAS 程序。这是一本杂志,也是一个程序,适用于 TRS-80 彩色计算机。该程序的行号以 1 为增量。在加载程序时,可用内存为 17049。使用 RENUM 10,1,10 以 10 为增量重新编号后,可用内存为 16,953。

96字节的节省听起来可能不多,但这是一个非常小的程序;它仍然是可用 RAM 的 0.5%。区别可能是适合可用 RAM 或不适合的程序之间的区别。即使内存中根本没有程序,这台计算机也只有 22823 字节的可用 RAM。