基本上,我想知道Lisp图像是什么?它是包含Lisp解释器和一个或多个程序的内存片段还是什么?
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或阅读SBCL手册上保存核心图像.
一些语言实现使用"图像"来存储当前上下文中的"所有内容".该图像可以是几个编译抽象层(即中间解析级,中间字节码,本机操作码).加载此图像将比编译所有源文件快得多.它与程序级别的hibernate功能非常相似.
例如,如果你的lisp实现使用了一个映像,那么首先你(或编译器供应商将)启动一个映像并保存它.
然后你有两个选择:(1)每次调用lisp时加载你的lisp文件或(2)加载所有的lisp,然后保存图像,并使用这个图像
希望有所帮助
通常,它是lisp进程的存储部分(即所有"lisp"函数和数据),但不是底层lisp二进制文件的一部分.从好的方面来说,这可以实现快速启动,因为(基本上)在加载图像时没有任何记账,一切都在那里.另一方面,它意味着任何打开的文件,套接字和缺少的东西,因此将图像保存为某种检查指向将需要一些实现才能使其工作.