代码之家  ›  专栏  ›  技术社区  ›  Barry Brown

什么是基本的Forth运算符?

  •  35
  • Barry Brown  · 技术社区  · 16 年前

    我对实现Forth系统感兴趣,这样我就可以获得一些构建简单VM和运行时的经验。

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

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

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

    7 回复  |  直到 10 年前
        1
  •  23
  •   John Parker    12 年前

    This thread 涵盖了你的确切问题。这是一个 soup-to-nuts implementation 有完整的文件。

    68K 我上大学的时候。我定义了运行时环境和字典格式,然后编写了一些C代码,引导加载默认字典的Macintosh应用程序,填充了一些I/O向量并使代码运行。然后我拿了利奥·布罗迪的书 Starting Forth 并开始用68K汇编语言实现基本字典。我从算术/逻辑单词开始,然后是控制结构,然后是单词定义/操作单词。我的理解是,至少你需要@、!、+、-、*和/。其余的可以根据这些来实现,但这就像试图基于这些来编写一个完整的图形库一样 SetPixel GetPixel :它会起作用的,但是,哎呀,为什么?

    我喜欢这个过程,因为有一些非常有趣的谜题,比如 DOES> 完全正确(一旦我有了一个坚实的 实现时,我创建了闭包,这些闭包变成了非常小的代码)。

        2
  •  13
  •   David Thornley    16 年前

    很久以前,我有一本叫做“线程解释语言”的书,我想是按字节出版的,它讨论了如何在Z80汇编中实现一种类似Forth的语言(我认为他们从来没有调用过Forth)。

        3
  •  8
  •   Peter Mortensen icecrime    14 年前

    在comp.lang.forth上的这篇文章列出了一些“最短的forth”。

    http://groups.google.com/group/comp.lang.forth/msg/10872cb68edcb526

    paper 关于做一个“最小的Forth”(虽然是瑞典语)。如果我没记错的话,他想得到一组可以在硅中构建的最少的操作符。

        4
  •  4
  •   Charlie Martin    16 年前

    我仍然不相信这个问题是正确的。例如,底座的说明可以减少;毕竟 * / 可在以下方面实施: + - ,但“+”可以用后续函数实现(请参见 Peano axioms

        5
  •  4
  •   bugmagnet    16 年前

    你可能还想看看汉斯·贝泽默的 4tH compiler

        6
  •  2
  •   dkretz    16 年前

        7
  •  1
  •   Albert van der Horst    7 年前

    与您所说的相反,通常情况下,DROP SWAP等被视为基本操作。原因是,如果您像您建议的那样使用内存操作来实现它们,那么整个系统将变得更复杂,而不是更少复杂。 此外,Forther通常会在高级中重新编码汇编词,在汇编中重新编码高级词。我是ciforth和yourforth的作者。 可以定义<=正如我在ciforth所做的那样“不是”。但在yourforth中,我决定<=&燃气轮机>=与此类似,外观统一的小型汇编程序实际上更简单。这是一种判断,是品味问题,当然不是原则问题。

    在上下文中,我将这个问题解释为:“原始操作的数量以合理的速度达到合理的强大Forth的合理大小是多少?” 显然,您对以巨大的开销为代价摆脱一个汇编词的巧妙技巧不感兴趣,正如在讨论这个主题的一些线程中所发现的那样。

    现在你可以看看一些小的福斯,比如琼斯福斯,你的福斯福斯,得出的结论是,大多数福斯都是50到100个原语。 这些Forth是在汇编程序中定义的。如果您想用c、python或Java定义原语,情况也会有所不同。现在,对于上述词典搜索,您可以在c和Forth之间进行选择。与语言设计无关的考虑因素开始发挥作用。你可能是一个多产的c程序员,或者你可能坚持用Forth编码,因为这是一个学习项目。

        8
  •  1
  •   MicroservicesOnDDD    5 年前
    1. 我最喜欢的一个是第四节的三个指令 MSDOS Pygmy Forth by Frank Sergeant . 我相信,他使用了一个固定的Forth,一个功能更全面的PC上的Forth,一个指向目标的串行链接,以及对目标的peek、poke、execute(基本语言术语),即读、写和运行。

    2. 如果您想要最新的、技术先进的答案,请查看 the 5-bit (32) instruction set forth (page 5 of the PDF, figure 3) 144-core forth cpu 由福斯之父查尔斯·摩尔开发。基本上,摩尔先生给了我们,让我们可以利用他当时拥有的东西,但他在余生中一直在优化它,直到现在,最终将其具体化到cpu级别(还制作了一个VLSI芯片CAD设计工具来设计自己的芯片,也用自己的ColorForth从下到上进行了设计。这不是低级语言,也不是高级语言——这是一种全方位语言!)

    3. 这个 Factor Programming language

    4. 最后,还有一个问题 public domain Forth called pForth kernel written in C .