第四,解释或编译?

时间:2015-11-01 00:56:40

标签: compilation forth

据说Forth程序可以编译"但如果他们的话只在运行时进行评估,我就不会知道这是怎么回事。例如,有一个单词DOES>,用于存储运行时评估的单词。如果这些单词包含EVALUATEINTERPRET单词,则字典会有运行时需求。

为了支持这样的陈述,这意味着整个单词列表(字典)必须嵌入到程序中,基本上是解释程序(不是编译程序)所做的。

这似乎会阻止您使用Forth编译小程序,因为整个字典必须嵌入到程序中,即使您只使用字典中的一小部分单词。

这是正确的,还是有一些方法可以在不嵌入字典的情况下编译Forth程序? (可能根本不使用运行时单词?)

3 个答案:

答案 0 :(得分:11)

可以使用或不使用单词标题编译Forth程序。标题包括单词名称(称为“名称空间”)。

在您描述的方案中,程序可能包含EVALUATE等运行时评估调用,将需要标题。

  • 字典可以分为三个逻辑上不同的部分:名称空间,代码空间和数据空间。程序执行需要代码和数据,名称通常不是。

  • 普通的Forth程序通常不会进行任何运行时评估。因此,在大多数情况下,编译程序中不需要这些名称。

  • 编译DOES>之后的代码,因此在运行时不会对其进行评估。它在运行时执行

  • 即使包含名称,它们通常也不会增加程序大小。

  • 许多Forth确实有办法忽略程序中的名字。有些人有一个删除单词标题(名称)的开关。其他有交叉编译器,它们在编译期间将名称保存在主机系统中,但生成没有名称的目标代码。

答案 1 :(得分:4)

不,整个字典不需要嵌入,也不需要编译。所有需要保留的只是所用单词列表及其父母单词(& grandparents,)。单词的名称也是不必要的,单词位置就足够了。通过这些方法编译的 Forth 代码可以像它获得的那样紧凑,与可执行大小的汇编语言相媲美甚至超越。

通过示例证明:Tom Almy的ForthCMP,一个' 80s - ' MSDOS 编译器缩小了可执行代码。它的README说:

 .    Compiles Forth into machine code -- not interpreted.

 .    ForthCMP is written in Forth so that Forth code can be executed
      during compilation, as is customary in Forth applications.

 .    Very fast -- ForthCMP compiles Forth code into an executable file
      in a single pass.

 .    Generated code is extremely compact. Over 110 Forth "primitives"
      are compiled in-line. ForthCMP performs constant expression
      folding, strength reduction, register optimization, DO...LOOP
      optimization, tail recursion, and various "peephole"
      optimizations.

 .    Built-in assembler.

4C.COMdosemudosbox等模拟器下运行。

A "Hello World"编译成117字节 .COM 文件,wc程序编译为3K .COM 文件(从5K开始)源代码)。没有字典或外部库,(除了标准的MSDOS调用,即它运行的操作系统)。

答案 2 :(得分:1)

由于没有标准的语言实现,Forth 可能会让你从外面转过头来。人们看到的大部分内容来自 Forth 的早期,当时作者(Charles Moore)仍在按摩自己的思想。或者更糟的是,人们称之为 Forth 的自制系统,因为它有一个堆栈,但实际上不是 Forth。

Forth 是解释的还是编译的? 简短回答:两者

早年: Forth 有一个面向程序员的文本解释器。如此解释:检查

但是... ':' 字符使编译器能够“编译”语言中单词的地址,因此它被“编译”而不是作为本机机器代码。它是代码在内存中的地址列表。聪明的部分是这些地址可以使用列表“解释器”运行,在大多数机器上只有 2 或 3 条指令,而在旧的 8 位 CPU 上则有更多指令。这意味着它仍然非常快并且非常节省空间。 这些系统更像是一个图像系统,所以是的,系统与您的程序一起使用,但其中一些系统内核在整个运行时为 8K 字节,包括编译器和解释器。不是举重。

这就是大多数人认为的 Forth。参见 JonesForth 的文字示例。 (这在当时叫做“线程代码”,不要和多线程混淆)

1990 年代 Forth 大师和 Chuck Moore 开始意识到 Forth 语言原语可以像现代机器上的一条机器指令一样少,所以为什么不编译指令而不是地址。这在 32 位机器上变得非常有用,因为地址有时比指令大。然后他们可以用处理器的本机 CALL/Return 指令替换小 3 指令解释器。这被称为子程序线程。前端解释器并没有消失。它只是启动了本机代码子例程

今天 商业 Forth 系统生成本机代码,内联许多/大多数原语,并执行您在现代编译器中看到的许多其他优化技巧。 他们仍然有一个面向程序员的解释器。 :-)

您还可以购买(或构建)Forth 交叉编译器,为不同的 CPU 创建独立的可执行文件,包括多任务处理、TCP/IP 堆栈,猜猜是什么,该文本解释器可以编译为可执行文件作为远程如果需要,可以进行调试和配置。

Forth 是解释的还是编译的?还是两个。