Java中的Forth解释器

Java中的Forth解释器,java,interpreter,forth,Java,Interpreter,Forth,我发现了一个用Java实现的简单的Forth解释器。 但是如果我想使用它,我不明白它的意义 第四个口译员的优势是什么: 如果最终编译的代码是 JVM执行的仍然是“字节” 代码“我们第四个要做什么 你在干什么 这对写作有帮助吗 高效/紧凑的程序 我会用Forth写代码吗 解释器将转换它 到Java 你的想法…不是字节码翻译器 你的问题的答案是:“见下文,有点像,没有” 它只是一个接受一些输入并产生一些输出的程序。输入是第四个脚本。除了一些非常重要的系统外,很少真正产生字节码。jRuby、Clo

我发现了一个用Java实现的简单的Forth解释器。
但是如果我想使用它,我不明白它的意义

第四个口译员的优势是什么:

  • 如果最终编译的代码是 JVM执行的仍然是“字节” 代码“我们第四个要做什么 你在干什么
  • 这对写作有帮助吗 高效/紧凑的程序
  • 我会用Forth写代码吗 解释器将转换它 到Java
你的想法…

不是字节码翻译器 你的问题的答案是:“见下文,有点像,没有”

它只是一个接受一些输入并产生一些输出的程序。输入是第四个脚本。除了一些非常重要的系统外,很少真正产生字节码。jRuby、Clojure、Scala。。这样的大系统确实会产生字节码

然而,您的第四个解释器可能就是:一个碰巧用java编写的脚本解释器。它接受的输入是一个排序程序,因此最终会得到一个很好的双间接执行。通过字节码解释器执行,通过CPU上运行的jvm执行

现在,如果你在CPU模拟器上运行它,或者在Forth中编写一个解释器,你可以使它成为三重间接的。(从某种意义上说,它已经存在了,因为您的英特尔CPU在执行它们之前正在进行大部分转换。:-)

无论如何,问题是,用java这样的静态语言编写的程序可能需要一些复杂的用户输入并执行它,或者程序的作者可以用forth更容易地完成一些事情,这就允许他同时用java和forth编写程序


你应该考虑所有这些,直到你理解它

它确实允许您编写高效/紧凑的程序。部分原因是定义定义词(在编译时执行的词)的能力可以有效地定义领域特定语言(DSL)。Forth还鼓励重构(否则堆栈内容就会变得不可理解……),因此代码会很紧凑。

作者在页面上描述at实现了Forth的一个子集,适合在其他应用程序中合并;据推测,它旨在为应用程序提供脚本功能。系统不太可能通过吐出java或JVM字节码来工作;它几乎肯定使用Java编写的解释器

传统上,FORTH解释器可以在非常小的内存占用中实现。我知道有人在COSMAC上实现了一个,核心解释器有30字节长。面向堆栈的字节码也非常紧凑,因为它不需要指定操作数的位置——它只是从堆栈中读取并将结果存放在堆栈顶部。这使得它在嵌入式系统界非常流行,在嵌入式系统中,解释器的小开销被程序逻辑的紧凑表示所抵消

如今,它不再那么重要了,因为机器往往要大得多,尽管digitalross还谈到了其他仍然使用FORTH的情况

这对写作有帮助吗 高效/紧凑的程序

这是有争议的

我相信福斯的人会告诉你这很快。但我怀疑在Java实现的FORTH解释器上运行的FORTH程序的执行速度是否会与直接在Java中实现的等效程序的速度一致。首先,JIT编译器在优化FORTH解释器方面做得不如在普通Java版本中那么好


如果你所说的“紧”是指“使用更少的内存”,我认为两者之间的差别将是微不足道的。请记住,在“FORTH in Java”和“plain Java”两种情况下,您都有Java JVM的所有内存开销。这可能会淹没对FORTH代码密度与等效编译Java代码密度的任何比较。

有几个FORTH系统在Java中实现了FORTH解释器。据我所知,有两种方法可以将forth源代码编译成JVM类,并允许您直接执行forth代码,而无需解释器

  • 沃尔夫·韦杰加德
    • 与JVM上的任何其他RPN语言相比,更接近forth的原始设计。有一个带有行号和代码beautyfier的编辑器。“interpiler”和字典的实现与词汇表/当前/上下文匹配。 有条件地,大多数与硬件相关的字(存储到特定内存地址或从特定内存地址获取)丢失。无论如何,在JVM上计算内存的任何字眼都是毫无意义的。 对第四种语法进行了一些有用的补充:

      • “帮助”这个词
      • 是面向对象的吗
      • 有一种类似perl的模式匹配
      • 复数和数组是语言的一部分
      • 一种可重定向/不可重定向的机制,用于选择性地将输出发送到堆栈或控制台,并防止执行文件io字,例如在测试时

      类似FORTH的口译员的主要优势在于其交互性–意味着我输入一个单词并立即得到响应。如果它首先需要一个中间步骤来生成一个文件或其他东西,那么这个优势就消失了。第二件事是POL(面向问题的语言)方面:语言必须是可无缝扩展的。因此,如果一种类似FORTH的语言无法编译新词,那么它就毫无价值。

      FORTH中的输入(我指的是我将要编写的代码)是吗?是的,只要运行的forth解释器读取您的输入,或者您用java读取它并对forth解释器进行API调用。请注意,您可能希望在java程序中使用此解释器的一个原因是,您可以包括预写的forth,可能来自文件,也可能只是在初始化字符串或其他内容中。像这样的东西有一些复杂的用途,比如机器代码-