这三行Forth模块系统是如何工作的?
问题描述:
我已经开始阅读Thinking Forth。在这本书中,作者提到了一个三行模块系统,并参考了Forth会议的会议记录。从第14页开始的Here's a PDF containing a description of the module system,(打印132)。这三行Forth模块系统是如何工作的?
下面是如何使用三个定义的词INTERNAL
,EXTERNAL
和MODULE
的说明。
模块是单词INTERNAL和 MODULE之间的程序的一部分。常量,变量和例程的定义是模块本地的 写在INTERNAL和EXTERNAL之间。在模块外部使用的定义是在外部和模块之间写入的 。 [局部变量 例程]在INTERNAL和EXTERNAL之间定义。 引用它们的例程在EXTERNAL和MODULE之间定义。
而这里的代码本身:
: INTERNAL (--> ADDR) CURRENT @ @ ;
: EXTERNAL (--> ADDR) HERE ;
: MODULE(ADDRl ADDR2 -->)PFA LFA ! ;
我在读这本书的有关如何在一般的写软件的想法,而不是如何在任何特定的实现的第四方案,所以我我不熟悉代码中使用的内置单词,但我对这个模块系统很好奇。有人可以解释它的工作原理吗?
答
我将重新描述说明。模块应该是这样的:
INTERNAL
... code ...
EXTERNAL
... more code ...
MODULE
实现该模块的系统中的代码假定该词典是传统的单向链表。 INTERNAL
保存一个指向当前单词的指针,例如在INTERNAL
之前。 EXTERNAL
在EXTERNAL
之后保存一个指向该单词的指针。 MODULE
需要两个指针,并且在EXTERNAL
之后修补该单词的链接字段以指向INTERNAL
之前的单词。实际上,它使字典跳过INTERNAL
和EXTERNAL
之间的所有单词。
这可能不适用于现代Forth,因为文字CURRENT
,PFA
和LFA
未标准化。而且,HERE
可能不是下一个单词标题的正确地址。
在现代的Forth系统中,一种可能的方法是编译成不同的单词列表并相应地改变搜索顺序,如[Ulrich Hoffmann的模块包](https://theforth.net/package/modules/current-view /modules.fs) – fiz