什么是Lisp图像?

时间:2009-01-26 15:09:24

标签: lisp common-lisp

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

3 个答案:

答案 0 :(得分:39)

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图像已经使用了很长时间。例如,1967年BBN Lisp中的函数SYSOUT创建了这样的图像。 SYSIN会在开始时阅读此类图片。

保存图片的功能示例

有关示例,请参阅save-imageLispWorks函数或阅读SBCL上的saving core images手册。

答案 1 :(得分:7)

几种语言实现使用“图像”来存储“一切” 在目前的背景下。这个图像可能是几个抽象层的编译(即 中间解析级别,中间字节代码,本机操作代码)。加载这个 image将比编译所有源文件快得多。它非常像 hibernate功能,在程序级别。

例如,如果你的lisp实现使用的是图像,那么首先是你(或编译器) 供应商将启动图像并保存。

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

希望有所帮助

答案 2 :(得分:6)

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