2010-08-24 58 views

回答

22

大多數流行的編程系統將程序代碼(以類定義,函數或過程的形式)與程序狀態(例如對象或其他形式的應用程序數據)分開。它們在啓動應用程序時加載程序代碼,並且必須從配置文件或其他數據源顯式重新創建任何以前的應用程序狀態。應用程序員沒有明確保存的任何設置,只要重新啓動,就必須設置備份。

但是,許多Smalltalk系統不區分應用程序數據(對象)和代碼(類)。實際上,類本身就是對象。因此大多數Smalltalk系統將整個應用程序狀態(包括Class和非Class對象)存儲在一個映像文件中。然後可以通過Smalltalk虛擬機加載圖像以將類似Smalltalk的系統恢復到以前的狀態。

http://en.wikipedia.org/wiki/Smalltalk#Image-based_persistence

+10

另一種看到它的方式是,這與使用VirtualBox或VMWare等操作系統虛擬化軟件獲得的系統映像十分相似。除了映像中的操作系統是Smalltalk系統,它不像文件系統那樣組織,而是作爲對象。 – 2010-09-02 13:13:21

5

當smalltalk虛擬機啓動時,它會將保存的對象狀態(是:包括打開的文件流,窗口,線程等)從「映像」加載到其內存中,並在映像保存時恢復執行。 在工作中的任何時候,您都可以「保存圖像」(又名:當前整體狀態的快照)到圖像文件中。您可以在磁盤上保留多個圖像。如果您參與不同的項目,這很有用。 圖像經常(但不是所有的小遊戲系統)跨體系結構可移植;例如,吱吱聲圖像可以被加載到機器人窗口和mac(甚至是android)吱吱聲VM中。圖片不能通過方言移動,有時不能通過方言跨越版本。

圖像通常包含所有內容 - 甚至包括調試器,編譯器,編輯器,瀏覽器等。但是,對於部署,有時從圖像中「剝離」(即刪除未使用的東西) - 要麼隱藏祕密(; )或使其更小(適用於嵌入式或移動設備)。 除Smalltalk/X和(我認爲)S#-Smalltalk(但我在薄冰這裏...)之外,大多數小靈魔都不能沒有圖像,除了圖像以外...大多數小靈魔不能沒有圖像地生活。沒有用處 - 使用標準格式或xml或其他任何傳輸格式(有很多)的fileout。 圖像對於編組/解組也是無用的;使用xml,binarystorage,數據庫,glorb或任何其他序列化方法。

+1

小精度:文件流不會在保存的圖像中保持打開狀態。當圖像被保存或重新加載時,某些類可以註冊來執行清理/重新初始化。文件描述符,套接字,屏幕位圖......都指向圖像外部的狀態,因此如果在圖像停止時刪除文件或將圖像移動到不同的主機,則它們將無效。 線程完全在圖像內部實現(如Java的綠色線程),所以它們不映射到系統線程,並且可以像調試器一樣保存原樣 – 2010-09-02 13:09:40

+1

您是對的,但實際上:Smalltalk/X甚至嘗試重新打開一個文件並重新定位它,如果它是一個常規文件。它當然不是由VM完成的,而是由類的可選重新初始化方法(實際上是:returnFromSnapshot)完成的。另外,在st/x中,沒有屏幕位圖,而是重新創建一些win32或x topWindows。公平的說,實際上由程序員決定添加這樣一個returnFromSnapshot方法,並決定在一個所謂的snapin之後可以重建什麼以及如何重構。 – blabla999 2010-09-10 09:28:43

+1

(當然你也是對的,狀態是在圖像的外部;但是,如果你保留了一些狀態的副本,你可以重新創建一個窗口,替換舊的窗口句柄,重新映射並重繪例如新窗口,這就是returnFromSnapshot方法所做的)。 – blabla999 2010-09-10 09:30:58

1

我建議你閱讀http://pharobyexample.org/ 第一章,它說:

「當前的系統映像是一個正在運行的系統菲羅, 時間凝固的快照它包含兩個文件:一個文件圖像配,其中包含系統中所有對象的 狀態(包括類和方法, ,因爲它們也是對象)以及.changes文件,其中包含對系統源代碼所做更改的所有日誌在圖1中。1,這些文件 被稱爲pharo.image和pharo.changes。」

HTH

16

Smalltalk的形象是一個非常有趣的東西,看看它是一種不死的。許多當前的Smalltalk系統,菲羅,其中VisualWorks的Squeak共享一個共同的祖先,即來自Xerox PARC的Smalltalk圖像,然而這個共同的祖先並不是一些遙遠的東西,但實際上在現代系統中仍然活着,現代變種是通過向這些消息中的一部分實際上是當前對象的變形,類是完整的對象,創建新的類是通過向類對象發送消息來完成的.Smalltalk圖像中的一些對象可以追溯到1972年,當時第一個Smalltal k圖像bootstrapped! Smalltalk圖像永遠不會死亡,它們只是褪色成潛在的根本不同。您應該將您的應用程序構建視爲與創建新的Smalltalk版本沒有根本區別。

0

簡而言之,Smalltalk圖像是在特定時間點保存的Smalltalk環境的圖像。當這個圖像被重新加載到Smalltalk運行時系統中時,一切就像在圖像保存時一樣。

由一個Smalltalk系統保存的圖像通常不能由不同的Smalltalk系統加載。

我發現令人難以置信的基於圖像的開發賦權。如果我被打斷,我可以保存圖像,當我回到它時,我馬上回到原來的位置。已打開的調試器仍處於打開狀態,正在等待繼續。有很少的「必須弄清楚如何讓我回到原來的位置」 - 這更「好,讓我們繼續......」。

分享和享受。

1

這是序列化整個系統中的所有內容,包括所有開發工作和所有用戶數據。除了運行時環境的內核以外的所有內容。

Smalltalk與Java一樣運行在運行符號字節碼的虛擬機上,它包含垃圾收集器等底層事物。這使得Smalltalk非常便攜,並且在任何地方都非常容易編寫。

不出所料,這是Java的靈感。所以Smalltalk VM(StVM)等同於Java運行時環境。

在Smalltalk中,其他一切都存儲在RAM中。代碼庫,爲StVM動態編譯。所有通過運行垂直和水平最終用戶應用程序構建的對象數據。您對窗口環境及其外觀所做的所有定製。你寫的所有新代碼。您已加載到虛擬機上播放音樂播放器的歌曲。您正在使用或已經加載的任何其他數據,代碼或對象。

它全部都在PC內存中。

定期地,您可能希望將當前狀態播放保存到磁盤。當你這樣做時,你立即凍結Smalltalk VM,它將的所有內容複製到一個磁盤文件中。該磁盤文件被稱爲映像文件,並且默認情況下,它將在PC上的大多數發行版(無論它們運行的​​是Linux,MacOS,Windows還是RiscOS)中具有.image後綴。

這就像您在典型PC上的文字處理器或電子表格中保存正在進行的工作一樣。除了此保存包括電子表格應用程序本身的最新版本的電子表格代碼。

Smalltalk系統確實有其他方法來保護您的數據。如果您開發任何軟件或修改任何編寫Smalltalk系統的代碼庫,它將實時記錄每次更改到磁盤。

您可以選擇編寫代碼或加載應用程序,以將源代碼及其相關數據結構保存到分佈式源代碼存儲庫或本地光盤上的存儲庫中。或關係數據庫。或者對象數據庫或新時尚的NoSQL數據庫。

大多數預先編寫的應用程序會將數據即時備份到磁盤或數據庫。

的圖像是一個保存整個的Smalltalk系統,(除了虛擬機,虛擬機等同於Java運行時環境。其他的一切都存儲在圖像中。

寫一個新的文件系統訪問底層操作系統的光盤?這在圖像中(並且所有更改也都由Smalltalk系統自動記錄到磁盤上)

將大量數據輸入到基於Smalltalk圖像的對象數據庫中?

想要對你的Smalltalk系統進行出廠重置TEM?只需返回使用首次安裝Smalltalk時收到的映像文件即可。想要每小時保存一次圖像,然後恢復到4小時前?只需從4小時前加載圖像文件。

該圖像是的一切副本 Smalltalk系統在內存中的內容。除了作爲虛擬機的系統的小而不變的重要比例之外。