BASIC,行如何存储在内存中?

Vic*_*tor 3 basic language-design

据我了解,BASIC 有行号,因为当时您必须使用行编辑器来输入程序。它允许你做这样的事情:

20 END
10 PRINT "HELLO WORLD"
Run Code Online (Sandbox Code Playgroud)

该程序将打印"HELLO WORLD". 我的问题是 BASIC 如何允许您以这种方式输入行?它们是如何存储在内存中的?我想这是一个行号和指向行本身的指针的映射,每次输入一行时都会更新。LIST但在运行/命令之前必须对该映射进行排序RUN。是这样吗?如果不是,那么 BASIC 到底是如何在内存中存储命令的呢?

Bra*_*ros 5

我猜每个基本实现都使用了特定的方法。

我成长过程中使用的 Basic 是在 MSX 计算机上运行的 Microsoft Basic。根据我当时如饥似渴地阅读的《MSX红皮书》,MS-Basic实际上使用了线性列表。

每个 Basic 行都存储为指向下一行的指针,后跟二进制形式的实际行号,后跟该行的标记化版本,最后跟一个空字符;像这样的东西:

    Address  | Content
    8000     | 8009 -- next line
    8002     | 10   -- this line number
    8004     | .... -- opcodes for each instruction in the line
    ...      | ...
    8007     | ...
    8008     | Null -- terminator
    8009     | ...  -- the next line
Run Code Online (Sandbox Code Playgroud)

尽管这些行是链接列表,但基本解释器并没有利用这一点。每行物理上都以线性连续的方式存储。

正如您可以想象的那样,在现有程序中插入和删除行需要大量工作。如果在现有行之间插入新行,则后续行将在内存中向上移动,以为新行腾出空间。同样,在程序中删除行将导致后续行在内存中向下移动,以填充已删除行留下的空间。这种在内存中上下移动意味着每移动一行就必须更新所有这些链接。