27

本质上,我想知道 Lisp 图像是什么?它是包含 Lisp 解释器和一个或多个程序的内存片还是什么?

4

3 回答 3

40

Lisp 图像作为转储内存

图像通常是一个文件。它是 Lisp 系统内存的转储。它包含 Lisp 系统的所有函数(通常编译为机器码)、变量值、符号等。它是一个正在运行的 Lisp 的快照。

要创建图像,需要启动 Lisp,使用一段时间,然后转储图像(执行此操作的函数名称取决于实现)。

使用 Lisp 图像

下次重新启动 Lisp 时,可以使用转储的图像并大致恢复到之前的状态。转储图像时,还可以告诉 Lisp 在转储图像启动时应该做什么。这样就可以重新连接到服务器,再次打开文件等。

要启动这样一个 Lisp 系统,需要一个内核和一个映像。有时 Lisp 可以将两者放在一个文件中,这样一个可执行文件既包含内核(具有一些运行时功能)又包含图像数据。

在 Lisp 机器(运行 Lisp 操作系统的计算机)上,一种引导加载程序(FEP,前端处理器)可以将映像(称为“世界”)加载到内存中,然后启动该映像。在这种情况下,没有内核,计算机上运行的只是这个 Lisp 映像,它包含所有功能(解释器、编译器、内存管理、GC、网络堆栈、驱动程序......)。基本上它是单个文件中的操作系统。

一些 Lisp 系统会在转储图像之前优化内存。他们可能会进行垃圾收集,对内存中的对象进行排序等。

为什么要使用图像?

为什么要使用图像?它节省了加载内容的时间,并且可以为用户提供带有应用程序代码和数据的预配置 Lisp 系统。使用保存的图像启动 Common Lisp 实现通常很快 - 在当前计算机上只需几毫秒。

由于 Lisp 映像可能包含很多功能(编译器,甚至是开发环境,大量调试信息,...),它的大小通常为几兆字节。

在 Lisp 中使用图像与 Smalltalk 系统所做的非常相似。例如,Squeak 还使用 Smalltalk 代码和数据的映像以及运行时可执行文件。有一个实际的区别:大多数当前的 Lisp 系统使用编译的机器代码。因此,映像不能在不同的处理器架构(x86、x86-64、SPARC、POWER、ARM 等)甚至操作系统之间移植。

历史

这种 Lisp 图像已经使用了很长时间。例如SYSOUT,1967 年 BBN Lisp 中的函数创建了这样的图像。SYSIN会在开始时读取这样的图像。

图像保存功能示例

示例见 LispWorks 的save - image函数或阅读SBCL手册保存核心图像

于 2009-02-25T12:25:32.017 回答
7

几种语言实现使用“图像”来存储当前上下文中的“所有内容”。这个图像可能有几个编译的抽象层(即一个中间解析级别、一个中间字节码、本机操作码)。加载此图像将比编译所有源文件快得多。在程序级别上,它非常类似于休眠功能。

例如,如果您的lisp 实现使用图像,那么首先您(或编译器供应商将)引导图像并保存它。

然后你有两个选择:(1)每次调用 lisp 时加载你的 lisp 文件,或者(2)加载你所有的 lisp,保存图像,然后使用这个图像

希望有帮助

于 2009-01-26T15:21:54.940 回答
6

通常,它是 lisp 进程的存储部分(即所有“lisp”函数和数据),但不是底层 lisp 二进制文件的任何部分。从好的方面来说,这提供了快速启动,因为(基本上)在加载图像时不需要进行簿记,一切都在那里。另一方面,这意味着任何打开的文件、套接字和你所拥有的东西都丢失了,因此将图像保存为某种检查点需要一些实现才能使其工作。

于 2009-01-27T11:56:57.053 回答