Smalltalk (Programmiersprache)
| {} | |
|---|---|
| {} {} | |
| Entwickler: | {} |
| Aktuelle Version: | {} / {} |
| Betriebssystem: | {} |
| Kategorie: | {} |
| Lizenz: | {} |
| Website: | {} |
Smalltalk ist eine dynamisch typisierte objektorientierte Programmiersprache und zugleich eine vollständige Entwicklungsumgebung, die in den 1970er Jahren am Xerox PARC Forschungszentrum durch Alan Kay, Dan Ingalls, Adele Goldberg und andere entwickelt wurde. Sie wurde allgemein unter dem Namen Smalltalk-80 freigegeben und hat die Entwicklung vieler späterer Programmiersprachen beeinflusst (z.B. Java). Smalltalk basiert stark auf den ersten objektorientierten Konzepten, die bei der Entwicklung von Simula gewonnen wurden; das erste Smalltalk-System wurde in Simula geschrieben. Smalltalk ist im Gegensatz zu Sprachen wie C++, Java oder C# eine rein objektorientierte Programmiersprache, d.h. Datentypen wie Integer, String o.ä. sind ebenfalls vollwertige Objekte. Die Smalltalk-Entwicklungsumgebung enthielt viele Ideen, die später mit der Macintosh- und dann Windows-Benutzeroberfläche verbreitet wurden. Verwendet wurde ein Grafikbildschirm mit verschiebbaren Fenstern, Aufklappmenüs und Schriften von verschiedener Größe. Eine Maus mit drei Tasten - rot, blau und gelb - diente erstmals als zusätzliches Eingabegerät. Das Model-View-Controller-Konzept (MVC) spielte in der Smalltalk-80-Entwicklungsumgebung eine wesentliche Rolle.
| Inhaltsverzeichnis |
|
2 Ausdrücke (Expression) 3 Zuweisungsanweisungen 4 Blöcke 5 Kontrollstrukturen 6 Collections 7 Programmbeispiel 8 Weblinks |
Wichtige Eigenschaften von Smalltalk
- Alles in Smalltalk ist ein Objekt, auch Zeichenketten, Integer, Boolesche Werte, Klassen(-definitionen), ausführbarer Code, Stack-frames, der Speicher, Codeblöcke etc.
- Objekte werden dadurch aktiviert, dass man ihnen Nachrichten (Messages) schickt. Dies führt dazu, dass die entsprechende Methode (Funktion) des Objekts ausgeführt wird.
- Der gesamte Quelltext ist i.d.R. offen und kann somit verändert werden. Nur sehr wenige Methoden greifen auf echte 'Primitives' der VM (virtuellen Maschine) zurück.
- Dynamische Typisierung - erst zur Laufzeit wird ermittelt, welche Methode tatsächlich aufgerufen wird. Im Vergleich zu C++ muss dies nicht explizit angegeben werden.
- Vererbung: Jede Klasse (außer der Wurzelklasse
Object) ist von genau einer Oberklasse abgeleitet, deren Verhalten sie erbt und beliebig erweitern kann (keine Mehrfachvererbung). - Automatische Speicherbereinigung (engl. garbage collection = Mülleinsammeln), die nicht durch den Programmierer beeinflusst werden muss. Ein Objekt 'lebt' solange, wie es von anderen Objekten referenziert wird.
- Smalltalkprogramme werden in Bytecode übersetzt, der durch eine virtuelle Maschine ausgeführt wird. Dadurch laufen Smalltalk-Programme ohne jegliche Änderung auf jedem System, für das eine virtuelle Maschine existiert. Ursprünglich wurde der Bytecode interpretiert; kommerzielle Umgebungen arbeiten inzwischen fast ausschließlich mit dynamischer Übersetzung.
- Üblicherweise hat man eine Programmierumgebung (selbst in Smalltalk geschrieben), in der man Quelltext am "lebenden" Objekt ändern und dann auch direkt in der geänderten Form (weiter)ausführen kann. "Smalltalkprogramme" kann man ändern, während sie laufen.
- Die Quelltexteingabe erfolgt üblicherweise im Klassenbrowser.
- Eine überraschende Eigenschaft im Vergleich zu traditionellen Sprachen ist, dass die Kontrollstrukturen wie if-then-else, for, while nicht in die Sprache eingebaut sind. Zumindest erscheint dies dem Programmierer so. Zum Beispiel wird eine IF-Anweisung so ausgeführt, indem eine ifTrue:-Botschaft an ein Boole'sches Objekt gesandt wird. Als Parameter wird ein Block (Anweisungsfolge) übergeben. Lediglich in der Klasse True wird dieser Block ausgeführt. In der Klasse False ist diese Methode zwar auch implementiert, aber sie führt den Block nicht aus.
- Senden einer Botschaft an ein Objekt
- Zuweisen eines Objekt an eine Variable
- Ein Objekt als Rückgabewert einer Methode liefern
Ausdrücke (Expression)
Ausdrücke sind von der Form
anObject message.D.h. man sendet einem Objekt eine Message. Das Objekt antwortet mit einem Antwortobjekt. Jeder Ausdruck muss mit einem Punkt beendet werden.
Die message kann komplex sein, d.h. statt nur aus einem Bezeichner kann sie aus mehreren sog. Selektoren und Parametern bestehen.
anObject selektor.heißt unäre Nachricht.
anObject selektor: einParameter.heißt binäre Nachricht. Arithmetische Operationen sind so implementiert.
anObject operator einParameter.Ein Operator ist +,-,*, oder :. D.h. auch nichtalphabetische Zeichen sind Methodennamen.
anObject selektor1: einParameterObjekt1 selektor2: einParameterObjekt2.ist eine Schlüsselwortbotschaft.
Ausdrücke können kombiniert und mit Klammern geschachtelt werden.
Sollen einem Objekt in Folge mehrere Nachrichten geschickt werden, so besteht die Möglichkeit, diese Nachrichten mit einem Semikolon (;) zu verketten:
anObject message1;
message2;
message3.
Zuweisungsanweisungen
Eine Zuweisung ist von der Form
aVariable := anExpression.Zuweisungen werden mit einem Punkt abgeschlossen.
Blöcke
Blöcke sind Sequenzen von Zuweisungsanweisungen und Expressions. Sie werden durch eckige Klammern eingeschlossen. Blöcke können parameterlos sein oder auch Parameter aufweisen.
blockEins := [ Anweisungen ] blockZwei := [ :einParameter | Transcript show: einParameter ]Diese Blöcke behalten ihren Kontext, so dass diese bei der Ausführung mit den Objekten arbeiten, die bei der Erzeugung von dort aus verfügbar waren. Um einen Block ohne Parameter auszuführen gibt es eine Parameterlose Methode. Bei dem Aufruf von Blöcken mit Parametern müssen diese mit Werten versorgt werden.
blockEins value blockZwei value: 'Test'
Kontrollstrukturen
Die Kontrollstrukturen werden mit booleschen Ausdrücken und Blöcken implementiert. Ein boolescher Ausdruck liefert nach der Auswertung ein Boolesches Objekt. Diesem wird dann eine Message zugesandt, die als Parameter einen ausführbaren Block hat. Der Programmtext sieht aber ähnlich aus, wie bei anderen Programmiersprachen auch, so dass man wie dort einfach gewisse Kontrollstrukturen als gegeben anwenden kann.
Einige Beispiele.
IF-Anweisung
aBoolean ifTrue: [ ein Block mit Anweisungen ]oder
( einAusdruck ) ifTrue: [ ein Block mit Anweisungen ]Das aus anderen Programmiersprachen bekannte else sähe folgendermaßen aus:
aBoolean ifTrue: [ ... ] ifFalse: [ ... ]
Schleifen
[ ein Block, der ein boole'sches Objekt zurückgibt ] whileTrue [ ein Block, der ein boole'sches Objekt zurückgibt ] whileFalse [ ein Block, der ein boole'sches Objekt zurückgibt ] whileTrue: [ einAndererBlock ] [ ein Block, der ein boole'sches Objekt zurückgibt ] whileFalse: [ einAndererBlock ]einIntegerStartWert to: einIntegerEndwert do: [ :laufvariable | Anweisungsfolge ]
Collections
Die Smalltalkumgebungen sind mit einer großen Klassenbibliothek ausgestattet. Ein wichtiger allgemeiner Objekttyp (Klasse) sind die Collections, d.h. Sammlungen von Objekten. Die Klasse Collection steht an der Wurzel einer ganzen Hierarchie von Klassen.
Eine wichtige Arbeit, die man mit einem Collection-Objekt durchführen kann ist für jedes Element der Collection einen Block von Anweisungen auszuführen. Andere Programmiersprachen brauchen hierfür spezielle Konstrukte (Iteratoren).
aCollection do: [ :einElement | auszuführendeArbeitFürDiesesElementMit: einElement ]Es hat sich eingebürgert, den Parameter als each zu bezeichnen, so dass direkt klar ist was hierbei gemeint ist. Bei Verwendung von mehreren Collections sollte man dem noch eine genaue Bezeichnung nachsetzten. Iteriert man bspw. über alle x und y Werte aus zwei unterschiedlichen Collections:
xWerte do: [:eachX | yWerte do: [:eachY | map addPoint: eachX withY: eachY
Programmbeispiel
Das klassische HelloWorld-Beispiel sieht wie folgt aus:
Transcript show: 'Hello World!'.Transcript ist eine in jeder Smalltalkumgebung vordefinierte globale Variable, die ein Objekt enthält, auf dem man Dinge protokollieren kann (ein Ausgabefenster).
Wir senden diesem Objekt die Message
show: aStringEin bereits etwas komplexeres Beispiel:
'Hello World' do: [ :eachChar|
Transcript show: eachChar ; cr.
].
gibt den Text "Hello World" vertikal aus. 'Hello World' ist ein String (Zeichenkette). Die Klasse dieses Objektes ist eine Unterklasse von Collection. Ein String ist also eine Collection von Zeichen. Indem wir dem Objekt String die Message
aString do: [ :eachChar | OperationenMitDiesemBuchstaben ]senden gehen wir alle Buchstaben (Elemente) des Strings einzeln durch.
Das Dictionary (in Perl Hash, in Java HashMap) ist eine in Smalltalk häufig verwendete Datenstruktur:
d := Dictionary new. d at: 'grün' put: 'green'. d at: 'blau' put: 'blue'. d at: 'rot' put: 'red'. Transcript show: (d at: 'blau').Alternativ können die Nachrichten auch wie bereits beschrieben verkettet werden:
d := Dictionary new.
d at: 'grün' put: 'green';
at: 'blau' put: 'blue';
at: 'rot' put: 'red'.
Transcript show: (d at: 'blau').
Auch das Dictionary ist eine Unterklasse von Collection.
Diese Datenstruktur entspricht dem assoziativen Array in anderen Programmiersprachen.Weblinks
- "Why Smalltalk?", eine Portalseite rund um Smalltalk
- Smalltalk Free Books, eine Sammlung von Büchern über Smalltalk zum Download
- Smalltalk User Groups:
Implementierungen
- Squeak, eine freie Multimedia-Smalltalk-Implementierung
- VisualWorks - Smalltalk Entwicklungsumgebung von Cincom, als nicht-kommerzielle Version frei erhältlich.
- IBM VisualAge for Smalltalk - Smalltalk-Umgebung von IBM
- Smalltalk/X - Smalltalk der Firma eXept Software, die für sehr viele verschiedene Plattformen verfügbar ist.
- Dolphin Smalltalk - Ein komfortables auf Windows spezialisierter Smalltalk-Dialekt
- Cincom Smalltalk - Smalltalk-Dialekt der Firma Cincom. Angeboten werden folgende Umgebungen:
- ObjectStudio - Entwicklungsumgebung für Microsoft Windows mit COM- und ODBC-Schnittstellen.
- VisualWorks Für Client-Server, Server und Web-basierte Entwicklung, auf mehreren Plattformen verfügbar: Microsoft Windows, PowerMac, Linux sowie diversen Unix-Derivaten
- Smalltalk MT bei Object Connect oder Smalltalk MT bei Genify – Ein C++-nahes Smalltalk-Derivat (C++ mit Smalltalk-Syntax), das zu nativen Code kompiliert.
- Ausführliche Liste von Smalltalk-Implemetierungen