Lisp 解释器和 Lisp 图像之间有什么区别和关系?它们可以用作同义词吗?

What is the difference and the relation between the Lisp interpreter and the Lisp image? Can they be used as synonoms?

我注意到有些人把这些术语当作同义词来使用。

例如,在同一场景中,我听到“将此函数添加到对其进行评估的 lisp 图像中”和“将此函数评估到 Lisp 解释器中以便稍后使用”。

但是,我不确定这种用法在技术上是否准确。因此,问题。

图片

“图像”是磁盘上的一个文件。

"Add a function to the image"

表示计算函数并保存图像,因此函数在下次调用时立即可用。

REPL

“解释器”(通常)是错误的抽象层次;一个应该使用 “REPL”代替。例如,SBCL 根本没有解释器(所有内容总是编译的)但这不是与本主题相关的细节。

"eval this function into the Lisp interpreter to use it later"

表示在当前 REPL 中评估函数并在同一进程中使用它(即,它在 Lisp 重新启动之前可用)。

这是两个正交的概念。让我们从通常综合的Common Lisp Glossary:

开始

Lisp image n. a running instantiation of a Common Lisp implementation. A Lisp image is characterized by a single address space in which any object can directly refer to any another in conformance with this specification, and by a single, common, global environment.

所以关键思想是图像是一组相互引用的 Lisp 对象(函数和数据),可以在执行期间“调用”或“访问”一个程序。

Common Lisp 程序的执行方式取决于系统的实现方式。例如,它可以通过机器语言编译来执行,或者通过某种形式的解释(甚至是两者的混合)来执行。所以 Lisp 解释器只是完成实现的一种特定方式(在当前的 Common Lisp 系统中,有许多不同的方式来实现该语言)。

image 是 Lisp heap 写入磁盘(或另一个辅助存储)的副本。 Lisp 堆是计算机 RAM 中用于存储数据的内存。要将 Lisp 堆写入图像,运行 Lisp 将停止并将内存转储到磁盘。然后 Lisp 要么恢复要么退出。

该映像可用于在启动新的 Lisp 时恢复堆。这通常比启动一个新的 Lisp 然后加载相应的软件要快。

A Lisp 解释器 是一个从源代码执行 Lisp 程序的程序。许多 Lisp 实现不使用解释器,但它们执行编译后的 Lisp 代码,通常是编译为本地机器代码的 Lisp 代码。