Lisp镜像是什么?

28

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


@juanitofatas 的链接已失效。 - Jon Chesterfield
3个回答

40

将Lisp图像作为转储内存

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

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

使用Lisp图像

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

要启动这样的Lisp系统,需要一个内核和一个图像。有时Lisp可以将两者放入单个文件中,因此可执行文件包含内核(带有某些运行时功能)和图像数据。

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

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

为什么使用图像?

为什么会使用图像?这样可以节省加载时间,同时可以将预配置的应用程序代码和数据与Lisp系统一起提供给用户。在当前计算机上,使用保存的图像启动Common Lisp实现通常非常快-只需要几毫秒。

由于Lisp图像可能包含大量功能(编译器,甚至是开发环境,大量调试信息等),因此其通常大小为几兆字节。

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

历史

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

保存图像的函数示例

有关示例,请参见LispWorks的函数save-image,或阅读SBCL手册上的saving core images部分。


7
许多语言实现使用“映像”来存储当前上下文中的“所有内容”。这个映像可能包含多个编译抽象层次(即中间解析级别、中间字节码、本地操作码)。加载这个映像将比编译所有源文件要快得多。这非常类似于程序级别的休眠功能。
例如,如果您的Lisp实现使用映像,则首先您(或编译器供应商)将引导一个映像并保存它。
然后您有两个选项:(1)每次调用Lisp时都加载您的Lisp文件,或者(2)加载所有Lisp并保存映像,然后使用此映像。
希望这有所帮助。

6

一般来说,它是Lisp进程的存储部分(即所有“Lisp”函数和数据),但不包括底层的Lisp二进制文件。好处是启动快速,因为加载图像时没有需要处理的繁琐工作,一切都已经准备就绪。然而,缺点是任何打开的文件、套接字等都会丢失,因此将图像保存为某种检查点需要进行一些实现才能使其正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接