你显然不是 Lisp 的“狂热者”,因为符合该描述的男孩和女孩通常可以知道 Lisp 是一种编译语言。Lisp 出现于 1958 年。1961 年的 Lisp 1 手册已经描述了编译。
口译很有用;它为我们提供了语义,而无需先编写编译器。这种语义为编译语义提供了一个参考模型:理想情况下,解释程序和编译程序做同样的事情。当我们发现他们不这样做时,我们要么解决它,要么以某种方式描述和证明这种情况。
解释可用于引导编译的 Lisp 系统,而不需要现有的 Lisp 实现,而是使用另一种语言,例如 C。解释避免了用引导语言编写 Lisp 编译器的需要。
ANSI Common Lisp 的 CLISP 实现就是一个很好的例子。要构建 CLISP,您只需要一个 C 编译器。CLISP 的 Lisp 编译器是用 Lisp 编写的。因此,当然,您没有任何东西可以运行该编译器。解决方案是使用用 C 编写的解释器来解释编译器。
在运行解释时,编译器编译大部分 Lisp 库。其结果就是 CLISP 所称的“半编译内存映像”:包含已编译例程但一些解释例程的映像。(我认为,编译器本身仍然是解释代码)。
然后使用这个半编译的映像来编译剩余的代码,从而得到完全编译的映像。
如果没有解释器,CLISP 的编译器只能通过坚持首先安装另一个 Lisp 实现来引导。(您需要 C 编译器来引导 GCC 的方式)。否则,CLISP 的编译器必须用 C 语言编写,以便使用现有的 C 编译器编译编译器,然后将其应用于 Lisp 代码进行编译,然后才能运行。
头脑正常的人都不想用 C 语言编写 Lisp 编译器,并且在 Lisp 并不普遍的世界中,需要 Lisp 实现来构建 Lisp 实现是一个很大的缺点。在 Lisp-compiler-in-C 助推模型下会发生什么,用 C 语言编写的 Lisp 编译器将是一个完全最小且可能不完整的编译器,它会发出质量差的代码,仅足以启动助推,并且是“真正的”编译器仍然是用 Lisp 编写的。