2012-11-16 13 views
18

In Smalltalk können Sie den Zustand der Welt in einer Bilddatei speichern. Ich nehme an, das hat mit Smalltalks Fähigkeit zu tun, sich selbst zu "serialisieren" - das heißt, Objekte können ihren eigenen Quellcode erzeugen.Was gibt Smalltalk die Fähigkeit, Bildpersistenz zu machen, und warum können sich Sprachen wie Ruby/Python nicht selbst serialisieren?

1) Ist das ein genaues Verständnis?

2) Was ist die Herausforderung beim Hinzufügen dieser Fähigkeit zu modernen Sprachen (offensichtlich nicht Lispeln)?

3) Ist "Serialisierung" das richtige Wort? Was ist der richtige Jargon?

Antwort

15

Es ist viel einfacher als "Serialisierung". Ein Smalltalk-Bild ist einfach eine Momentaufnahme des Objektspeichers. Es nimmt den gesamten RAM-Inhalt (nach der Müllsammlung) und speichert es in eine Datei. Beim Start lädt es diesen Snapshot von der Festplatte in den Arbeitsspeicher und fährt dort fort, wo er aufgehört hat. Es gibt einige Hooks, um spezielle Aktionen auf Snapshots und beim Fortsetzen durchzuführen, aber im Prinzip funktioniert das so.

(hinzugefügt: siehe Lukas Renggli Kommentar unten für eine entscheidende Design-Wahl, dass es so einfach macht im Vergleich zu anderen Umgebungen)

+0

Beachten Sie, dass dies gut funktioniert, da Smalltalk in einer eigenen VM ausgeführt wird, so dass es seinen eigenen Speicherstatus organisiert und selbst verwaltet. Wenn Sie dies mit einem C-Programm versuchen, das nicht dafür gebaut wurde, würde es wahrscheinlich die meiste Zeit in Ordnung sein, aber Eckfälle könnten sich verschlimmern. – Marcin

+6

Was die Snapshot-Funktion unterstützt, ist, dass der Ausführungsstatus (z. B. Prozesse, Stapelrahmen) Teil des normalen Objektspeichers ist. Dies macht es besonders einfach, den laufenden Code zu speichern und wieder aufzunehmen. –

1

Dies geschieht bereits in einer Art und Weise, wenn Sie Ihren Computer in den Ruhezustand, nicht wahr? Der Kernel schreibt laufende Programme auf den Datenträger und lädt sie später wieder hoch? Vermutlich könnte der Kernel ein laufendes Programm über ein Netzwerk auf eine neue Maschine verschieben, wenn er die gleiche Architektur am anderen Ende annimmt? Java kann alle Objekte auch wegen der JVM serialisieren, oder? Vielleicht ist die Hürde nur Architektur, die unterschiedliche Speicherlayouts impliziert?

Bearbeiten: Aber ich denke, Sie sind daran interessiert, diese Funktionalität aus dem Programm selbst zu verwenden. Ich denke, es ist nur eine Frage der Implementierung der Funktion im Python/Ruby-Interpreter und der stdlib und einer Art von virtueller Maschine, wenn Sie in eine andere Hardware-Architektur wechseln wollen.

+0

"nur eine Frage der Implementierung des Features im Python/Ruby-Interpreter und stdlib" Sie meinen, nur eine Frage der Erstellung Ihrer eigenen Implementierung? Warum, das wird nicht lange dauern;) – Marcin

+1

Ja, deine eigene Implementierung der Ruhezustandsfunktion. Sie müssen nicht den ganzen Dolmetscher schreiben. Nicht dass ich mich freiwillig melde. –

8

Erweiterung der ausgezeichneten Antwort von Bert Freudenberg.

1) Ist das (dh Objekt Fähigkeit, ihren eigenen Quellcode serialisieren) ein genaues Verständnis?

Nein. Wie Bert darauf hingewiesen hat, ist ein Smalltalk-Bild einfach ein Speicher-Snapshot. Die Single-of-Truth-Eigenschaft von Smalltalk-Objekten und Smalltalk-Programmen ist ihre Speicherdarstellung. Dies ist ein großer Unterschied zu anderen Sprachen, in denen Programme als Textdateien dargestellt werden.

2) Was ist die Herausforderung, diese Fähigkeit zu modernen Sprachen in dem Hinzufügen (Nicht-Lisp, natürlich)?

Technisch gesehen sollte Bootstrapping einer Anwendung von einem Speicher-Snapshot für die meisten Sprachen möglich sein. Wenn ich mich nicht irre, gibt es Lösungen, die diesen Ansatz verwenden, um die Startzeiten für Java-Anwendungen zu beschleunigen. Sie müssen sich jedoch auf eine kanonische Speicherrepräsentation einigen, und Sie müssen beim Neustart des Programms sorgfältig darauf achten, native Ressourcen neu zu initialisieren. In Smalltalk werden beispielsweise geöffnete Dateien und die Netzwerkverbindung erneut geöffnet. Und es gibt auch einen Startup-Hook, um die Endlichkeit von Zahlen zu beheben.

3) Ist "Serialisierung" das richtige Wort? Was ist der richtige Jargon?

Ruhezustand ist der Begriff.

+0

Wo kann ich lesen, wie die Smalltalk VM Dateien und Netzwerkverbindungen wieder öffnen kann? Und was ist die In-Memory-Darstellung? Ich sehe nirgends leicht lesbare Smalltalk-Quellen ... vielen Dank. –

+0

Laden Sie das Pharo-Ein-Klick-Bild von http://pharo-project.org herunter und durchsuchen Sie die Quellen. Ich erinnere mich nicht an die relevanten Nachrichten von meinem Kopf, aber sie sollten in den Datei- und Verbindungsklassen gefunden werden. – akuhn

1

Entscheidender Unterschied ist, dass Smalltalk Programm als Bündel von Objekten behandelt. Und IDE ist nur ein Haufen Editoren, die diese Objekte bearbeiten. Wenn Sie also das Bild speichern, ist der gesamte Code genau so da, wie Sie ihn beendet haben.

Für andere Sprachen könnte es möglich sein, aber ich denke, es gäbe mehr Gerede, je nachdem, wie viel Reflexion es gibt. In den meisten anderen Sprachen kommt die Reflexion als Add-On oder sogar als Nachsatz, aber in Smalltalk ist sie das Herz des Systems.