Wenn Objekte Smalltalk machen

Seite 3: Die Ursprünge von Smalltalk

Inhaltsverzeichnis

Das wirft die Frage auf, wie jemand auf die Idee kam, ein System zu schaffen, das nicht nur ein elegantes Programmiersystem ist, sondern sozusagen ein Programmierverstehsystem. Dahinter steht die menschenorientierte Philosophie seiner Schöpfer. Ein kleiner Blick auf die Geschichte hilft beim Verständnis.

Die Wurzeln von Smalltalk gehen auf die Idee zurück, dass ein Computer für alle Menschen da sein sollte. Statt eine Maschine nur für Experten zu sein, sollte er sogar Kindern beim Lernen helfen. Diese Vision leitete den am Xerox PARC arbeitenden Alan Kay und seine Kollegen Dan Ingalls, Adele Goldberg und andere in den frühen 1970er Jahren an. Das bedeutete aber zusätzlich, dass das Gerät klein sein musste und kein wandfüllender Schrank. Grafische Displays, Einfachheit in Konzepten wie Bedienung und Interaktivität waren zwingend.

Alan Kay wusste von Seymour Paperts LOGO, einer Sprache gedacht für pädagogische Zwecke. In den 1960er Jahren präsentierte Ivan Sutherland seine graphische Umgebung Sketchpad. Sie erlaubte das interaktive Erstellen von (Linien-)Zeichnungen am Bildschirm, was zu der Zeit ein absolutes Novum war. Sketchpad stellte eine deutliche Erweiterung der damaligen Rolle des Computers als reiner Zahlenfresser dar. Die geometrischen Zeichenfiguren waren übrigens als Instanzen eines Masters implementiert.

Alan Kay hatte eine Ausbildung in Biologie. In dem Dokument "Early History of Smalltalk" beschreibt er, dass er sich von der Idee kommunizierender Zellen hatte inspirieren lassen. Wenn also der Computer helfen sollte, die Welt zu verstehen, sollte er die Natur der kommunizierenden Elemente abbilden. Jedes Objekt für sich wurde auf die Weise zu einem Computer, der Nachrichten versteht und sendet.

Anregungen von Lisp mit seinem interaktiven Evaluieren, LOGO mit dessen Syntax und anderen Systemen anderer Forscher sowie nicht zuletzt die damals beschränkte Hardware bestimmten die praktische Umsetzung der Ideen. Das System bildete eine Nachricht auf die Sequenz <Empfänger, Token, Ausdrücke> ab. Das Token adressierte die gewünschte Funktion des Empfängerobjektes, die Interpretation der Ausdrücke geschah auf ähnliche Art wie bei einem Micro-LISP. Das war der Kern von Smalltalk-72, geschrieben von Dan Ingalls. Diese Urform von Smalltalk bestand letztlich aus einer Sammlung von Objekten mit interpretierten Funktionen.

Es folgten Smalltalk-76 mit virtueller Maschine und Vererbung und schließlich das für heutige Systeme immer noch relevante Smalltalk-80. Von den Grundideen her war Smalltalk also ein Modell der Welt, gedacht um kinderleicht weitere Modelle der Welt zu entwerfen und in Form eines laufenden Programms erlebbar zu machen.

Dass jede Klasse eine Oberklasse hat, ist ein naheliegender Gedanke. Im aktuellen Smalltalk ist die Hierarchie äußerst ausgefeilt, damit die Programmiersprache die gebotene Symmetrie maximal umsetzen kann. Jede Klasse soll schließlich wieder ein ansprechbares Objekt sein. Die Klassen, deren Objekte wiederum Klassen sind, heißen Metaklassen. Die METACLASS ist als einziger Typ im System eine Instanz von sich selbst, also quasi die Wurzel. Die mächtige Reflection-Fähigkeit von Smalltalk begründet sich in der strikt hierarchischen und konsequenten Architektur.

Smalltalk besitzt einen Objektspeicher (Image) mit einem Garbage Collector. Alle Objekte bleiben erhalten, bis die letzte Referenz auf sie erlischt. Klassen sind definiert durch ihre Oberklasse und ein Methodenverzeichnis, der Katalog aller verstandenen Nachrichten und deren Funktion.

Das Wort "Funktion" ist ernst zu nehmen: Funktionale Entwickler mögen Lambda-Ausdrücke, also anonyme Funktionen, die wiederum Objekte sein können. Smalltalk bietet dafür als Blöcke bezeichnete vollwertige Objekte, die Nachrichten empfangen können. Sie haben Closures und lassen sich mit der passenden Nachricht zur Angabe ihres Wertes bewegen:

myObject := OrderedCollection new.       
myObject add: [ x | x*x ].
myFunc := myObject at: 1.
myFunc value: 2.

Smalltalk gibt als Ergebnis der Evaluierung '4' aus. Auf unterster Ebene führt eine virtuelle Maschine sogenannte Primitive aus, also Bytecode-Befehle. In heutigen Systemen besitzen die virtuellen Maschinen effiziente JIT-Compiler (Just in Time).

Seit Smalltalk-72 finden Anwender eine grafische Benutzeroberfläche mit Mausbedienung. Fenster und Menüs gehörten und gehören fest zum System. Heutzutage lässt sich aber (manches) Smalltalk für Serveranwendungen "headless" ohne GUI betreiben.

Zu einer Programmiersprache gehört immer eine gut gepflegte Bibliothek. Smalltalk zeigt dabei seinen Charakter als Systemumgebung. Es gibt Klassen für Collections wie die im Beispiel gezeigte OrderedCollection. In diesen Strukturen lassen sich alle Arten von Objekten speichern. Array und Dictionary sind Spezialformen davon. Schließlich finden Entwickler viele Arten von Streams und eine breite Klassenpalette für Grafik und die GUI. Die konkrete Ausstattung hängt vom jeweiligen System ab.

Als Sprache bietet Smalltalk zudem Kontroll- und Schleifenstrukturen. Schleifenkörper oder Elemente in IF-Konstrukten sind nicht nur alternativer Code, sondern Blöcke im obigen Sinne. Sie bereiten damit die Bahn für einen funktionsorientierten Ausdrucksstil.

Schließlich existieren Klassen zur Unterstützung des Test Driven Development. Unit-Tests unterstützt Smalltalk gut, und sie gehören zum guten Stil. Geschriebener Code lässt sich in eine Datei serialisieren. Je nach Smalltalk-Implementation ist eine Anbindung an ein Repository wie Git möglich. Gemstone als kommerzielles Smalltalk erlaubt sogar das Speichern in eine objektorientierte Datenbank. Neben den exemplarisch vorgestellten Erweiterungen haben aktuelle Implementierungen deutlich mehr zu bieten.