序言
第四,在我读过的几本手册中,它通常是用极其低级的术语定义的,通常是在汇编中。以这种方式定义Forth对于理解实现来说是非常违背直觉的,并且真正的只适用于将Forth的基于汇编或其他基于低级语言的端口写入不同的系统/架构。
这可以在著名的JonesForth中看到,他在那里实现了一些单词,这些单词在组装中为了速度而不需要实现,并且模糊了组装结束和Forth开始之间的界限。
启动Forth是一项更好的工作,它以一种更容易理解的方式解释了Forth,然而,由于它是为了教授Forth本身,它在Forth解释器/编译器的实际功能方面不是很简洁,这再次模糊了Forth的实现。
问题
我真正想问的是,一个有效的Forth实施涉及到什么?Forth工作的高级模式是什么?到目前为止,我了解:
- 福斯用字典查找已定义的单词
- Forth有两个堆栈,一个参数堆栈和一个返回堆栈
- 参数堆栈用于保存正在操作的值,而返回堆栈用于保存从跳转到嵌套单词的返回位置
- 基元单词NEXT用于返回到返回堆栈顶部的状态,并且通常出现在每个定义的单词之后
这就是我所能确信的,因为在ANS FORTH-83必需的单词集中,没有定义INTERPRET,但在Starting FORTH中,INTERPRET被定义为一个原始单词,用于检查字典中的单词,如果不检查它是否是数字,如果不中止。所有这些相互矛盾的信息,以及相反的,关于福斯的信息的缺乏,使福斯的内心变得难以理解。
任何Forth实现都可以在逻辑上分为以下层(或机制(:
-
第四处理器。它包括对数据堆栈、返回堆栈、内存、子程序调用和返回、逻辑和算术运算的访问,线程代码解释器(或"地址解释器",如果有的话(。有时它也被称为第四虚拟机(FVM(。
-
代码生成器。它负责访问数据空间和代码空间区域、创建子例程、文本的增量编译、子例程调用、返回和控制流。
-
口译员。它结合了创建词汇和单词(词汇条目(、管理搜索顺序以及根据上下文解析词汇(名称、数字等(的能力。
-
翻译。它解析文本,分解成词法,解析词法(使用解释器(,并根据STATE(或翻译模式(将其转换为各种副作用。许多标准词都是译者的一部分。此外,它还可以通过用户定义的(可能是即时的(单词或一些更高级的(特定于实现的(方法进行扩展。
每个下一层都基于(并使用(上一层。此外,一些额外的可重复使用的模块也可以在引擎盖下使用(例如,堆栈、列表等(
理解下一层需要理解上一层。在澄清了最初的问题之后,这个答案也可以扩展。
要么把FORTH看作一个用户/程序员(Brodie的书《开始FORTH》和《思考FORTH》大放异彩,要么看看Pelc的教程(。无需担心下一步,或组装,或任何"低级"的事情。选择一些FORTH系统并使用它。
或者在它的内部闲逛,那么琼斯福思是必须的。其他有趣的系统是lbForth(自托管,为几个不同的机器进行元编译(或ff(也可以是元编译,来自最小"伪汇编程序"源的boostrap(。
如果你不想处理低级别的细节,还有一些用C编写的forth。