繁体   English   中英

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

[英]What gives Smalltalk the ability to do image persistence, and why can't languages like Ruby/Python serialize themselves?

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

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

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

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

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

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

扩展Bert Freudenberg的优秀答案。

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

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

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

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

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

休眠就是这个词。

当你把电脑睡觉时,这种情况已经发生了,对吧? 内核将正在运行的程序写入磁盘并在以后再次加载它们? 据推测,内核可以通过网络将正在运行的程序移动到新机器上,假设另一端有相同的架构? 由于JVM,Java也可以序列化所有对象,对吧? 也许障碍只是建筑意味着不同的内存布局?

编辑:但我想你有兴趣从程序本身使用这个功能。 所以我认为这只是在Python / Ruby解释器和stdlib中实现该功能的问题,并且如果您希望能够移动到不同的硬件架构,则需要某种虚拟机。

最重要的区别是Smalltalk将程序视为一堆对象。 IDE只是编辑这些对象的一堆编辑器,因此当您保存加载图像时,所有代码就像您离开时一样。

对于其他语言,它可以这样做,但我想会有更多的摆弄,取决于有多少反射。 在大多数其他语言中,反射是附加的,甚至是后来的,但在Smalltalk中,它是系统的核心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM