我对实现Forth系统感兴趣,这样我就可以获得构建简单VM和运行时的一些经验。
当从Forth开始时,人们通常首先了解堆栈及其运算符(DROP,DUP,SWAP等),因此将它们视为原始运算符之间是很自然的。但他们不是。它们中的每一个都可以分解为直接操作内存和堆栈指针的运算符。后来人们学习了存储(!)和获取(@),可以用来实现DUP,SWAP等等(哈!)。
那么原始运算符是什么?哪些必须直接在运行时环境中实现,可以从中构建所有其他环境?我对高性能不感兴趣;我想要一些我(和其他人)可以学习的东西。运营商优化可以在以后进行。
(是的,我知道我可以从图灵机启动并从那里开始。这有点极端。)
编辑: 我的目标是类似于引导操作系统或新编译器。我至少需要做什么才能实现,以便我可以用这些原始构建块构建系统的其余部分?我不会在裸硬件上实现它;作为一项教育活动,我会编写自己的最小虚拟机。
答案 0 :(得分:23)
This thread涵盖您的确切问题。这是一个soup-to-nuts implementation,包含完整的文档。
我在大学期间编写了一个子程序Forth target 68K。我定义了运行时环境和字典格式,然后写了一些C代码,它引导了一个加载了默认字典的Macintosh应用程序,填充了一些I / O向量并运行了代码。然后我拿了Leo Brodie的书Starting Forth并开始用68K汇编语言实现基本字典。我从算术/逻辑词开始,然后控制结构然后是词定义/操纵词。我的理解是,至少你需要@,!,+, - ,*和/。其余的可以用这些来实现,但这就像尝试编写基于SetPixel
和GetPixel
的整个图形库一样:它会起作用,但是为什么呢?
我喜欢这个过程,因为有一些非常有趣的谜题,比如让DOES>
完全正确(而且一旦我有一个稳定的DOES>
实现,我创造的闭包变成了微小的,很少量的码)。
答案 1 :(得分:10)
很久以前,我有一本名为“Threaded Interpretive Languages”的书,我认为是Byte发表的,讨论了如何在Z80组装中实现类似Forth的语言(我认为它们从未称之为Forth)
你可能没有Z80方便,或想要一本,但这本书可能很有启发性。
答案 2 :(得分:8)
comp.lang.forth上的这篇文章列出了一些“最小的Forths”。
http://groups.google.com/group/comp.lang.forth/msg/10872cb68edcb526
为什么我知道这个?我的兄弟Mikael写了#3,他还写了一篇关于制作“最小Forth”的paper(虽然是瑞典语)。如果我没记错的话,他想获得一套可以用硅片构建的最小算子。
答案 3 :(得分:4)
我仍然不相信这个问题是完整的。例如,可以减少Plinth的指令;毕竟,*
和/
可以用+
和-
来实现,但是'+'可以用后继函数来实现(请参阅{ {3}}。)这会让你进入图灵机的附近。你怎么知道在哪里停下来?
答案 4 :(得分:3)
您可能还想看看Hans Bezemer的4tH compiler。
答案 5 :(得分:2)
您使用的是哪种Forth实现不在文档中提供此信息?鉴于Forth的性质,它可能依赖于实现。字典中有一组标准的单词,但无论它们是通过汇编/ C /无论是什么还是由Forth到达都不重要,因为Forth定义为一种自我扩展的语言。
答案 6 :(得分:1)
与您所说的相反,通常DROP SWAP等被认为是基本的Forth操作。原因是如果你使用你建议的内存操作来实现它们,整个系统会变得更多,而不是更简单。 在Forth和基础之间没有明显的区别。在80年代,字典搜索将是基本的,并以汇编语言编码以提高速度,而托管的现代Linux可以承担在所谓的高级别编码。 Forthers也倾向于常规地在汇编语言中重新编码高级汇编语言和高级语言。我是ciforth和yourforth的作者。 可以像在ciforth中那样定义< = as“> not”。但在今后我决定拥有所有< < => > =类似,一致的外观,小的汇编程序实际上更简单。这是一种判断力,一种品味,当然不是原则问题。
在上下文中,我将这个问题解释为:“以合理的速度达到合理强大的Forth的原始操作数量的合理大小是多少?” 很明显,你不会对巧妙的技巧感兴趣,以牺牲巨大的开销为代价来摆脱一个汇编词,正如在讨论这个主题的一些主题中所发现的那样。
现在你可以看看像Jonesforth yourforth eforth这样的一些小Forth,并得出结论,大多数人到达大约50到100个原语。 那些Forth是用汇编语言定义的。如果要在c,python或Java中定义基元,情况又是不同的。现在,例如上面的字典搜索你可以选择c和Forth。与语言设计无关的考虑因素开始发挥作用。你可能是一个多产的程序员,或者你可能会坚持在Forth编码,因为它是一个学习项目。
答案 7 :(得分:0)
我的最爱之一是MSDOS Pygmy Forth by Frank Sergeant的三句话。我相信,他使用了拴系的Forth,可以在PC上发挥更大的功能,与目标之间建立串行链接,并在目标上进行窥视,戳戳,执行(基本语言术语),即读取,写入和运行。 / p>
如果您想要最新,技术最先进的答案,请查看由Forth的父亲Charles Moore开发的the 5-bit (32) instruction set forth (page 5 of the PDF, figure 3)中的144-core forth cpu。基本上,Moore先生给了我们Forth,让我们可以制造出当时的货叉,但是直到现在,他一直在余生中继续对其进行优化,最终将其精简到cpu级别(还制作了VLSI芯片CAD设计工具来设计自己的芯片,也使用自己的ColorForth从上到下进行设计。这不是低级语言,也不是高级语言,而是全能语言!)
我认为Factor Programming language非常相似,并且其核心是用C(或c ++)语言编码的虚拟机
最后,有一个public domain Forth called pForth,它的kernel written in C。