本质上,我想知道 Lisp Image 是什么?它是一个包含 Lisp 解释器和一个或多个程序的内存切片,还是其他什么?
本质上,我想知道 Lisp Image 是什么?它是一个包含 Lisp 解释器和一个或多个程序的内存切片,还是其他什么?
将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部分。
一般来说,它是Lisp进程的存储部分(即所有“Lisp”函数和数据),但不包括底层的Lisp二进制文件。好处是启动快速,因为加载图像时没有需要处理的繁琐工作,一切都已经准备就绪。然而,缺点是任何打开的文件、套接字等都会丢失,因此将图像保存为某种检查点需要进行一些实现才能使其正常工作。