Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

去年关闭。



Improve this question




我对实现Forth系统感兴趣,只是为了获得一些构建简单VM和运行时的经验。

从Forth开始时,通常通常会先了解堆栈及其操作符(DROP,DUP,SWAP等),因此很自然地将它们视为原始操作符。但事实并非如此。它们中的每一个都可以分解为直接操作内存和堆栈指针的运算符。后来,人们了解了可用于实现DUP,SWAP等(ha!)的存储(!)和获取(@)。

那么什么是原始运算符?哪些必须在可以构建其他所有环境的运行时环境中直接实现?我对高性能不感兴趣;我想要我(和其他人)可以学习的东西。运营商优化可以稍后进行。

(是的,我知道我可以从图灵机开始,然后从那里去。这有点极端。)

编辑:
我的目标类似于引导操作系统或新的编译器。我至少需要实现什么,以便可以从那些原始构建块中构建系统的其余部分?我不会在裸机上实现;作为一项教育性练习,我将编写自己的最小VM。

最佳答案

This thread涵盖了您的确切问题。这是带有完整文档的soup-to-nuts implementation

我上大学时写了一个针对68K的线程例程Forth。我定义了运行时环境和词典格式,然后编写了一些C代码,引导它们 bundle 了Macintosh应用程序,该程序加载了默认字典,填充了一些I / O vector 并使代码运行。然后,我读了利奥·布罗迪(Leo Brodie)的书Starting Forth,并开始用68K汇编语言实现基本词典。我从算术/逻辑词开始,然后是控制结构,然后是词定义/操纵词。我的理解是,至少需要@,!,+,-,*和/。其余的可以通过这些实现,但这就像尝试基于SetPixelGetPixel编写整个图形库一样:它可以工作,但是,为什么呢?

我喜欢这个过程,因为这里有一些非常有趣的难题,例如使正确的DOES>正确(一旦有了可靠的DOES>实现,我就创建了可以变成极少量代码的闭包)。

08-27 05:48