Plädoyer für den Klassiker der Objektorientierung

Plädoyer für den Klassiker der Objektorientierung Smalltalk: Pionier von Java und C++ bedrängt

27.03.1998

Ein Grund für die Beliebtheit von Smalltalk liegt in der Entwicklungsumgebung, deren Werkzeuge (Browser, Debugger, Inspector) wie selbstverständlich ineinandergreifen.Voraussetzung hierfür ist jedoch die "Reinheit" von Smalltalk: Es existieren in dieser Sprache - von den elementaren Datentypen bis hin zu großen Anwendungen - ausschließlich Objekte; die Werkzeuge müssen daher auch nur mit Objekten verschiedener Ausprägung arbeiten können.Da der Kern des Smalltalk-Systems selbst in Smalltalk geschrieben und dem Programmierer frei zugänglich ist, können fortgeschrittene Anwender Metaprogrammierung betreiben, beipielsweise Firmenstandards unterstützen oder Programmrahmen generieren.

Smalltalk wird, wie auch Java, in einen portablen Zwischencode übersetzt, der auf verschiedenen Plattformen durch eine virtuelle Maschine interpretiert wird.Dabei erreichen die gegenwärtigen Implementierungen entgegen landläufiger Kritik eine erstaunliche Effizienz.Viele Smalltalk-Umgebungen puffern bereits übersetzten "nativen" Code zur Laufzeit oder bieten die Möglichkeit, die ganze Anwendung von vornherein in nativen Code zu übersetzen.Java setzt dem ein ähnliches Konzept mit JIT-Compilern entgegen.

In der Laufzeitumgebung geht Smalltalk allerdings einen Schritt weiter: Der Entwickler kann ein Programm während der Ausführung unterbrechen, den Systemzustand auf Knopfdruck als Binär-Datei speichern, es übers Netz auf eine andere Maschine transferieren und die Arbeit an der Unterbrechungsstelle wieder aufnehmen.Von einer solchen Flexibilität sind heutige Java-Entwicklungsumgebungen hingegen noch weit entfernt.

Beide Sprachen besitzen eine automatische Speicherbereinigung, die sogenannte "Garbage Collection", sowie einen Mechanismus für einfache Vererbung.Auf das in C++ verwendete Konzept der Mehrfachvererbung wurde aus Gründen der Klarheit bewußt verzichtet.Um dem weltweiten Heer an C- und C++- Programmierern entgegenzukommen, verwendete Java-Vater Goslin eine C++-ähnliche Syntax.

Beim Thema Effizienz wird aus traditionellen Gründen fast nur die Laufzeiteffizienz berücksichtigt und viel zuwenig auf Programmierzeiteffizienz oder Produktivität der Programmierer geachtet.Sprachen wie C unterscheiden sich in diesen Aspekten nur wenig von Assembler.Daß eine maschinennahe Programmierung zu erheblichen Laufzeitvorteilen führen kann, ist klar.

Erstaunlich ist jedoch, daß es auch umgekehrt funktioniert: Vor ein paar Jahren wurde die Neuimplementierung eines funktionalen Programmiersystems konkurrierend von einer Gruppe aus sechs Studenten in C und einer weiteren von zwei Studenten in Smalltalk begonnen.

Bei Abschluß der Diplomarbeiten lief nur die Smalltalk-Version zufriedenstellend.Nachdem die C-Version nachgearbeitet worden war, stellte sich heraus, daß sie langsamer ablief als die Smalltalk-Version.

Der Grund: In der C-Variante mußten viele rekursive Algorithmen auf kompliziert verketteten Datenstrukturen ausgeführt werden.Wegen des hohen Detaillierungsgrades sahen die C-Implementierer "den Wald vor Bäumen nicht" und konnten sich nicht auf ihre eigentliche Aufgabe konzentrieren.Die Folge waren unnötige Rekursionsstufen und damit ein sehr hoher Effizienzverlust.

Der Kampf mit den Details

Die von uns zunächst erwarteten Probleme mit der Typfreiheit der Sprache und der entsprechend fehlenden Unterstützung des Compilers durch Fehlermeldungen traten völlig hinter dem Effekt zurück, daß wegen des hohen Abstraktionsgrades die typischen Fehler kaum noch eine Rolle spielten: Ein großer Teil von Programmierfehlern resultiert aus dem Kampf mit Details.Bei der Prototypentwicklung kann das Fehlen von Typfestlegungen den nachträglichen Wechsel von Objekttypen erleichtern.Da die Datenstrukturklassen alle bewußt mit einer einander ähnlichen Schnittstelle versehen wurden, kann der Programmierer fast ohne Änderungen am Programmtext eine zuerst gewählte Datenstruktur durch eine günstigere ersetzen.

Objektorientierte Programmierung erfordert einen relativ hohen Einarbeitungsaufwand.Die "Kernsprache" von Smalltalk verwendet eine zunächst ungewohnte Syntax, die sich aber in zwei Stunden vermitteln läßt.Die eigentliche Hürde bilden das Kennenlernen der Klassenbibliothek zwecks Wiederverwendung und das Einüben objektorientierter Programmiermethodik.Hier bietet - und das räumen auch C++-Verfechter durchaus ein - Smalltalk Vorteile, weil die Sprache rein objektorientiert konzipiert ist und eine andere Vorgehensweise gar nicht erst zuläßt.

Im Vergleich dazu ist die Kernsprache von C++ erheblich komplexer; sie umfaßt mit C eine wenig sauber definierte Teilsprache.Bereits der Anfänger muß sich mit den Schwierigkeiten der "manuellen" Speicherverwaltung mittels Konstruktoren und Destruktoren auseinandersetzen, da diese Konzepte implizit an wenig offensichtlichen Stellen verwendet werden.

Aufgrund seiner Historie gibt es für Java auch Klassenbibliotheken nach dem Smalltalk-Vorbild, die jedoch wegen der statischen Typisierung von Java teilweise an Eleganz verlieren.Will ein Entwickler etwa einen "Int"-Wert in einer polymorph implementierten Datenstruktur speichern, so muß nur für diesen Zweck der Integer-Wert in einen "Umschlag" gesteckt werden.Da Java-Datenstrukturen nach Smalltalk-Vorbild beliebige Objekte zu speichern gestatten - also etwa Zahlen, Texte und Grafiken durcheinander -, ist beim Entnehmen ein Objekt durch einen geeigneten Cast wieder mit seinem Typ zu verbinden.Das ist schreibaufwendig und kann auch zu Typfehlern im Laufzeitverhalten führen.

Die inkrementelle Form der Kompilation in Smalltalk vermeidet die sonst so zeitraubenden Compile-Link-Run-Zyklen praktisch völlig.Besonders eindrucksvoll ist hierzu das Beispiel eines Doktoranden aus Weihenstephan, der eine in den USA entwickelte Formel über Düngungsvorgänge auf deutsche Verhältnisse übertragen wollte: Die Formel lag in Form eines Fortran-Pakets vor.Zur Verifikation der angepaßten Formel existierte eine große Zahl heimischer Daten (sogenannter Schlage).Nach jeder Änderung der Hypothese mußte das ganze Paket neu kompiliert, gebunden und mit den kompletten Daten - dies geschah über Nacht - ausgeführt werden.Zur Auswertung lag dann morgens ein Zahlenteppich vor.

Der Doktorand portierte das komplette Paket in drei Monaten nach Smalltalk. Danach konnte er jede Änderung der Formel sofort auf einige besonders typische Schlage anwenden und das Resultat grafisch anzeigen.Interessante Hypothesen wurden dann wieder über Nacht auf alle Schlage angewandt.Wegen der grafischen Aufbereitung ließ sich später die komplett angepaßte Formel vor Ort den Landwirten auf einem Notebook mit ihren eigenen Daten demonstrieren.

Die Smalltalk-Umgebung enthält einen Interpreter, der in alle Textfenster des Systems eingebettet ist und dort selektierte Smalltalk-Ausdrucke auszuführen gestattet.Auch der Browser, in dem die Programme geschrieben werden, besitzt diese Fähigkeit.Es ist daher guter Brauch, in Smalltalk-Quelltexte Testaufrufe in Form von Kommentaren einzufügen.Wegen der inkrementellen Übersetzung kann dies auf Methodenebene erfolgen, was praktisch dazu führt, daß Smalltalk-Programme meist gut ausgetestet sind.

Die Flexibilität von Smalltalk rührt auch von den erweiterbaren Kontrollstrukturen her.So kann der Programmierer ergänzend zu den existierenden Kontrollstrukturen (if, do, ...) die Sprache homogen um weitere Konstrukte anreichern oder eigene Datenstrukturen implementieren, beispielsweise eigene Schleifenkonstrukte, die sich nahtlos in die Sprache integrieren.Die Eleganz dieser Lösung wird im Vergleich zu entsprechenden Konstruktionen in Java (Enumeration) deutlich.Die Metaprogrammierung erlaubt es sogar, die Sprache, die eigentlich Einfachvererbung umfaßt, mit relativ geringem Aufwand auf multiple Vererbung zu erweitern.

Demgegenüber spielt Java bei der anbieterübergreifend standardisierten Bibliothek und dem ausgefeilten Sicherheitskonzept seine Trümpfe aus.So ist vor allem die Internet-Funktionalität zu nennen.Diese umfaßt sowohl die Generierung von Applets, kleinen Codestückchen, die sich in HTML-Seiten einstreuen lassen, wie auch das Sandkasten-Prinzip, das es ermöglicht, eine Anwendung innerhalb eines nach außen abgeschlossenen Systems ablaufen zu lassen und so "böswilligen" Programmen Einhalt gebietet.Auch sprechen eine Reihe von standardisierten Schnittstellen für die Interoperabilität der Sprache.

Ein gewichtiger Vorteil von Java ist natürlich die mittlerweile überall kostenlos verfügbare virtuelle Maschine (VM).Ihr Einsatz löste in den Internet-News eine hitzige Diskussion darüber aus, wie Smalltalk für die JVM übersetzt werden kann.Das Problem ist, daß die JVM für manche Smalltalk-Konstrukte einfach nicht mächtig genug ist.Daher wollen etliche Smalltalk-Anbieter in der Zukunft eine einheitliche VM für Java und Smalltalk auf die Beine stellen, um beiden Welten gerecht zu werden.

In den letzten Jahren hat man vor allem in den Bereichen Banken und Versicherungen erkannt, daß mit Smalltalk ein mächtiges Werkzeug bereitsteht, mit dem man den notorischen Anwendungsstau abbauen kann.

Halbherziger Start

Smalltalk entstand während der 70er Jahre im Palo Alto Research Center von Xerox, wurde von der Mutterfirma nach seiner Fertigstellung aber nur halbherzig vermarktet.Im Unterschied dazu konnte sich C++ frühzeitig als "das bessere C" und als zeitgemäßer Nachfolger der Unix-Stammsprache C positionieren.Sun Microsystems gelang Mitte der 90er Jahre ein genialer Coup, indem das Unternehmen Java gleichzeitig als Internet-Sprache und als "noch besseres C" präsentierte und damit zu einer beispiellos raschen Verbreitung verhalf.Dabei verband James Goslin, der Erfinder von Java, vorwiegend aus Smalltalk bekannte Konzepte mit einer an C++ angelehnten Syntax.Internet-Adressen zu Smalltalk: http://www.stic.org http://www.objectshare.com/se/ seinfo.htm

Arne Bayer und Lothar Schmitz sind wissenschaftliche Mitarbeiter am Institut für Softwaretechnologie in der Fakultät für Informatik der Universität der Bundeswehr München.