簡體   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