是什么让Smalltalk能够进行图像持久化,为什么像Ruby/Python这样的语言不能自行序列化?

dav*_*ola 18 serialization persistence smalltalk interpreted-language

在smalltalk中,您可以将世界状态保存到图像文件中.我认为这与Smalltalk自身"序列化"的能力有关 - 也就是说,对象可以生成自己的源代码.

1)这是一个准确的理解吗?

2)将这种能力添加到现代语言中的挑战是什么(非lisp,显然)?

3)"序列化"是正确的词吗?什么是正确的行话?

Ber*_*erg 15

它比"序列化"简单得多.Smalltalk图像只是对象内存的快照.它占用整个RAM内容(在垃圾收集之后)并将其转储到文件中.在启动时,它将该快照从磁盘加载到RAM中并继续处理它停止的位置.有一些钩子可以对快照和恢复时执行特殊操作,但基本上这就是它的工作原理.

(补充说:请参阅下面的Lukas Renggli的评论,其中一个关键的设计选择使其与其他环境相比如此简单)

  • 有助于快照的是执行状态(例如进程,堆栈帧)是正常对象存储器的一部分.这使得快照和恢复运行代码变得特别简单. (6认同)

aku*_*uhn 8

扩展Bert Freudenberg的优秀答案.

1)这是否(即对象能够序列化自己的源代码)是否准确理解?

不.正如Bert所指出的,Smalltalk图像只是一个内存快照.Smalltalk对象和Smalltalk程序的单一事实来源是它们的内存表示.这与其他语言存在巨大差异,其中程序表示为文本文件.

2)将这种能力添加到现代语言中的挑战是什么(非lisp,显然)?

从技术上讲,对于大多数语言来说,应该可以从内存快照引导应用程序.如果我没有弄错,有些解决方案使用这种方法来加速Java应用程序的启动时间.您必须同意规范内存表示,并且您需要注意在重新启动程序时重新初始化本机资源.例如,在Smalltalk中,重新打开打开的文件和网络连接.而且,还有一个启动挂钩来修复数字的字节序.

3)"序列化"是正确的词吗?什么是正确的行话?

休眠就是这个词.