image: smalltalk-logo.png needs_contrast: light

Smalltalk (1980)

Alan Kay, Adele Goldberg und Dan Ingalls

Smalltalk wur­de in den 1970er Jah­ren von Alan Kay, Adele Goldberg und Dan Ingalls am Xerox Palo Alto Research Center (PARC) ent­wick­elt und gilt als eine der ersten ob­jekt­orien­tierten Pro­gram­mier­spra­chen. Smalltalk wur­de ur­sprüng­lich für die Ent­wick­lung von grafischen Be­nut­zer­ober­flä­chen und inter­ak­ti­ven An­wen­dun­gen ver­wen­det.

Ein bekanntes Beispiel ist das erste grafische Benutzerinterface des Xerox Alto Com­puters. Heutzutage ist Smalltalk weniger verbreitet, aber immer noch relevant in bestimmten Nischen, insbesondere in der Forschung und Lehre zur ob­jekt­orien­tierten Pro­gram­mier­ung. Es wird auch in einigen spe­zia­li­sier­ten industriellen An­wen­dun­gen und von Enthusiasten ver­wen­det, die die Spra­che für ihre Ein­fach­heit und Eleganz schätzen.

1. Hello, world!

Smalltalk ist eine Skript­spra­che, was bedeutet, dass der Code zur Laufzeit interpretiert wird. Du hast zwei Möglichkeiten, Smalltalk-Code auszuführen:

  1. Du kannst Smalltalk-Code direkt in der Smalltalk-Shell ausführen.
  2. Du kannst Smalltalk-Code in einer Textdatei speichern und dann ausführen.

Möglichkeit 1: Smalltalk-Code in der Smalltalk-Shell ausführen

Öffne dazu ein Ter­mi­nal, indem du entweder StrgJ drückst oder das Panel-Symbol rechts oben drückst. Dein Fenster sollte jetzt ungefähr so aussehen:

Starte nun die Smalltalk-Shell, indem du gst eingibst und dann Enter drückst. Du solltest eine Ausgabe wie diese sehen:

Jetzt kannst du Smalltalk-Code direkt in der Shell eingeben und ausführen. Schreibe einfach Transcript show: 'Hello, World!'; cr. und drücke Enter. Du solltest die Ausgabe Hello, world! sehen.

Du kannst die Smalltalk-Shell wieder beenden, indem du ObjectMemory quit eingibst und Enter drückst oder einfach StrgD drückst.

Möglichkeit 2: Smalltalk-Code in einer Textdatei speichern und ausführen

Smalltalk-Pro­gramme werden in Textdateien mit der Endung .st geschrieben. Ein Smalltalk-Interpreter liest anschließend den Quelltext und führt ihn aus.

Stelle zuerst sicher, dass du keinen Ordner geöffnet hast. Um sicherzugehen, drücke einfach den Shortcut für »Ordner schließen«: StrgK und dann F. Dein Work­space sollte jetzt ungefähr so aussehen:

Quelltext schreiben

Klicke auf »New File« und wähle als Dateityp »Text File« (oder bestätige einfach mit Enter).

Schreibe nun den folgenden Code in die Datei:

1
Transcript show: 'Hello, World!'; cr.

Da Visual Studio Code noch nicht weiß, dass es sich um Smalltalk-Quelltext handelt, ist dein Programm momentan noch einfarbig, aber das wird sich gleich ändern. An dem weißen Punkt erkennst du, dass deine Änderungen noch nicht gespeichert sind.

Drücke nun StrgS, um die Datei zu speichern. Gib hello.st ein – der vollständige Pfad zu deiner Datei lautet dann /workspace/hello.st.

Achte darauf, dass du deine Datei nicht aus Versehen hello.st. (mit einem Punkt am Ende) nennst, da Visual Studio Code als Dateiname Transcript show: 'Hello, World!'; cr. vorschlägt.

Da Smalltalk standardmäßig nicht von Visual Studio Code un­ter­stützt wird, müssen wir noch eine passende Er­wei­te­rung installieren. Klicke dazu auf das Er­wei­te­rungs-Symbol in der Seitenleiste oder drücke StrgShiftX. Suche nach der Er­wei­te­rung »Pharo Language Support« und installiere sie.

Alternativ kannst du auch StrgP drücken und ext install badetitou.pharo-language-server eingeben, um die Er­wei­te­rung zu installieren.

Anschließend solltest du dein Smalltalk-Programm farbig sehen:

Skript ausführen

Um unser Programm auszuführen, müssen wir den Smalltalk-Interpreter aufrufen (in unserem Fall gst) und ihm den Da­tei­na­men unseres Programms übergeben.

Öffne dazu ein Ter­mi­nal, indem du StrgJ drückst und gib folgenden Befehl ein:

gst hello.st
Du musst nicht den vollständigen Da­tei­na­men schreiben. Schreib einfach gst he und drücke Tab, um den Da­tei­na­men automatisch zu hello.st vervollständigen zu lassen. Du kannst danach ganz normal weiterschreiben.

Das Programm sollte die Nachricht Hello, World! im Ter­mi­nal ausgeben:

Fehler finden und beheben

Wenn du einen Fehler im Code machst, wird Lisp eine Fehlermeldung ausgeben. Versuche zum Beispiel, statt show das Wort sho zu schreiben:

Transcript sho: 'Hello, World!'; cr.

Speichere die Datei und führe das Skript erneut aus:

gst hello.st
Nutze die Pfeiltaste hoch , um den letzten Befehl erneut einzugeben. So kannst du schnell dein Programm testen, nachdem du es verändert hast.

Smalltalk sollte eine Fehlermeldung ausgeben, die dir hilft, den Fehler zu finden:

Es lohnt sich, die Fehlermeldungen genau zu lesen, um den Fehler zu finden und zu beheben. Achte auf die Zeilennummer (in diesem Beispiel 1) und den Text, der dir sagt, was falsch ist. Denke daran, den Fehler wieder zu beheben, bevor du das nächste Beispiel ausprobierst.

Shebang #!

Bisher musst du, um dein Skript auszuführen, immer den Smalltalk-Interpreter explizit aufrufen. Wenn du dein Skript wie ein normales Programm ausführen möchtest, kannst du ein sogenanntes Shebang am Anfang deiner Datei hinzufügen. Das Shebang besteht aus einer Raute # gefolgt von einem Ausrufezeichen ! und dem Pfad zum Smalltalk-Interpreter. In unserem Fall sieht das so aus:

#!/usr/bin/env gst

Füge diese Zeile ganz oben in deinem Skript ein und speichere die Datei. Bevor wir das Skript ausführen können, müssen wir es noch ausführbar machen. Das machen wir mit dem Befehl chmod:

chmod +x hello.st

Jetzt können wir das Skript direkt ausführen:

./hello.st

2. Primfaktorzerlegung

Im zweiten Beispiel wollen wir eine Zahl in ihre Primfaktoren zerlegen. An diesem Beispiel kannst du sehen, wie man in Smalltalk Be­nut­zer­ein­ga­ben verar­bei­tet und Schleifen ver­wen­det. Erstelle eine neue Datei mit StrgAltN und schreibe den folgenden Code hinein:

1
2
3
4
5
6
7
8
9
10
11
| number factors |
Transcript show: 'Enter a number: '.
number := stdin nextLine asNumber.
Transcript show: 'Factors: '.
2 to: number do: [:i |
    [(number \\ i) = 0] whileTrue: [
        Transcript show: i asString, ' '.
        number := number // i
    ]
].
Transcript cr.

Speichere die Datei unter dem Namen factor.st und führe sie aus:

gst factor.st

Falls du keine Fehlermeldung erhältst, kannst du das Programm ausführen und testen:

Das Programm hat die Zahl 123 in ihre Primfaktoren zerlegt und ausgegeben. Anders als andere Pro­gram­mier­spra­chen kann Smalltalk auch Zahlen wie 3000000000 und 123456789123456789 in Sekundenbruchteilen zerlegen, allerdings beendet sich das Programm nicht (probier es gern aus, du kannst das Programm mit StrgC abbrechen). Falls du einen sachdienlichen Hinweis hast, schreib bitte eine E-Mail an specht@gymnasiumsteglitz.de.

3. Bubblesort

Im dritten Beispiel wollen wir eine Liste von 10 Zufallszahlen sortieren. Dafür verwenden wir den Bubblesort-Al­go­rith­mus, der zwar nicht besonders effizient ist, aber sehr einfach zu verstehen und zu implementieren. Der Bubblesort-Al­go­rith­mus funktioniert, indem er die Liste mehrmals durchläuft und benachbarte Elemente vertauscht, wenn sie in der falschen Reihenfolge sind.

An diesem Beispiel kannst du sehen, wie man in Smalltalk Arrays ver­wen­det, Funk­tio­nen ver­wen­det und Schleifen verschachtelt.

Erstelle eine neue Datei und schreibe den folgenden Code hinein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|item swap itemCount hasChanged|
item := #(1 4 5 6 10 8 7 61 0 -3) copy.

Transcript show: 'Original array: '.
item do: [:each | Transcript show: each printString, ' '].
Transcript cr.

swap :=
    [:indexOne :indexTwo|
    |temp|
    temp := item at: indexOne.
    item at: indexOne put: (item at: indexTwo).
    item at: indexTwo put: temp].

itemCount := item size.
[hasChanged := false.
itemCount := itemCount - 1.
1 to: itemCount do:
    [:index |
    (item at: index) > (item at: index + 1) ifTrue:
        [swap value: index value: index + 1.
        hasChanged := true]].
hasChanged] whileTrue.

Transcript show: 'Sorted array: '.
item do: [:each | Transcript show: each printString, ' '].
Transcript cr.

Speichere das Skript unter dem Namen bubblesort.st und führe es aus:

Das Programm hat eine Liste von 10 Zufallszahlen sortiert. Versuche, den Quelltext so zu verändern, dass statt 10 Zahlen 100 oder mehr Zahlen sortiert werden.

4. Zusammenfassung

In diesem Kapitel hast du an drei Beispielen gesehen, wie man ein einfaches Smalltalk-Skript schreiben und ausführen kann. Das ist natürlich nur ein erster Eindruck. Um Smalltalk wirklich zu beherrschen, musst du noch viel mehr lernen – am besten, indem du eigene Skripte schreibst und ausprobierst. Die Buchhandlungen, Bib­lio­theken und Youtube sind voll von Material für dich. Viel Spaß beim Pro­gram­mier­en!