第四,解释或编译?

Tyl*_*den 3 compilation forth

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

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

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

这是正确的,还是有一些方法来编译Forth程序而不嵌入字典?(也许根本不使用运行时单词?)

Lar*_*off 11

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

在您描述的场景中,程序可能包含运行时评估调用,例如EVALUATE,将需要标头.

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

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

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

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

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

  • @TylerDurden,*任何* 单词都可以包含 EVALUATE。单词的 DOES> 部分没有什么特别之处。 (2认同)

agc*_*agc 5

不,整个字典不需要嵌入,也不需要编译。剩下的只是使用的单词列表及其父单词(和祖父母)。单词的名称也不是必需的,单词位置就足够了。 由这些方法编译的Forth代码可以尽可能地紧凑,在可执行文件大小上与汇编语言相媲美甚至超过。

举例证明:Tom Almy 的ForthCMP,这是一个 80 年代至 90 年代的MSDOS编译器,可以缩减可执行代码。它的自述文件说:

 .    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.
Run Code Online (Sandbox Code Playgroud)

4C.COMdosemu或 等模拟器下运行dosbox

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