19

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

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

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

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

4

4 回答 4

16

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

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

于 2012-11-16T21:05:07.860 回答
9

扩展 Bert Freudenberg 的出色回答。

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

没有。正如 Bert 指出的,Smalltalk 映像只是内存快照。Smalltalk 对象和 Smalltalk 程序的唯一真实来源是它们的内存表示。这与将程序表示为文本文件的其他语言有很大的不同。

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

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

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

休眠是一个术语。

于 2012-11-17T00:03:30.200 回答
2

关键区别在于 Smalltalk 将 Program 视为一堆对象。IDE 只是一堆编辑这些对象的编辑器,所以当你保存加载图像时,你所有的代码都在那里,就像你离开时一样。

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

于 2012-11-19T08:09:06.603 回答
1

当您让计算机进入睡眠状态时,这已经以某种方式发生了,对吧?内核将正在运行的程序写入磁盘并稍后再次加载它们?假设内核可以通过网络将正在运行的程序移动到新机器上,假设另一端的架构相同?Java 可以序列化所有对象也是因为 JVM,对吧?也许障碍只是暗示不同内存布局的架构?

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

于 2012-11-16T21:33:23.330 回答