Nachdem die erste Folge bereits einen ersten Überblick über einige wichtige Eigenschaften von FORTH gab, soll es nun richtig losgehen. Wenn Sie sich inzwischen das VOLKSFORTH aus dem PD-Service besorgt haben oder Besitzer eines anderen FORTH-Systems sind, steht einem erfolgreichen Einstieg in FORTH nichts mehr im Weg.
Nachdem Sie VOLKSFORTH durch Anklicken des „FORTHKER.PRG“-Ikons gestartet haben, erscheint auf dem Bildschirm eine kurze Mitteilung, die über Herkunft und Version des Systems Auskunft gibt. Bei der im PD-Service erhältlichen Version handelt es sich jetzt um die wesentlich leistungsfähigere Version 3.8.
Danach passiert gar nicht mehr viel. FORTH wartet vielmehr auf die Eingabe des Benutzers. In dieser Beziehung steht es also als Interpretersprache BASIC um nichts nach. Bestätigen Sie ruhig die Return-Taste: FORTH meldet sich geduldig mit einem nüchternen ’ok’. Um FORTH ein wenig aus der Reserve zu locken, tippen Sie einfach einmal ein, was Ihnen im Moment einfällt . FORTH wird wahrscheinlich mit einem saloppen ’Haeh?’ antworten. Dies ist allerdings keine Standard-Systemmeldung, sondern eher die persönliche Note des VOLKS-FORTH-Autors. Andere FORTH-Systeme melden sich ein wenig seriöser, etwa mit ’Can’t find’ o. ä.. In jedem Fall gibt FORTH damit bekannt, daß es mit Ihrer Eingabe nichts anfangen konnte. Damit Sie auf Ihr erstes Erfolgserlebnis nicht zu lange warten müssen, sollten Sie es einmal mit der Eingabe von ’WORDS’ probieren -und plötzlich sehen Sie eine riesige Menge von Worten auf dem Bildschirm. 4xFORTH-Besitzern ist dieses Erlebnis allerdings nicht vergönnt, denn die Konstrukteure konnten sich aus irgendeinem Grund nicht dazu entschließen, dieses Wort zu implementieren. Vielleicht hatten Sie es auch einfach vergessen.
Nun wird es dringend erforderlich, ein wenig mehr Systematik in unsere Vorgehensweise zu bringen. Sonst haben Sie am Ende mehr als ein Dutzend verschiedener Worte ausprobiert und sind so schlau wie zuvor!
Probieren wir zunächst einmal aus, wie FORTH auf die Eingabe von Zahlen reagiert. Besitzer von VOLKSFORTH sollten vorher ’DECEMAL’ eingeben, um sicherzustellen, daß FORTH im Dezimalsystem rechnet. Nach der Eingabe der Zahl ’17’ und anschließendem Betätigen der Return-Taste (dies soll in Zukunft nicht mehr gesondert erwähnt werden) meldet sich FORTH wieder mit einem ’ok’. Was ist aber mit der Zahl passiert? Der Textinterpreter - eine kleine Routine, die eingegebene Zeichen auswertet — bringt alle Zahlen grundsätzlich in einem speziellen Bereich des Arbeitsspeichers unter. Dieser spezielle Bereich wird Parameterstack genannt; er wurde bereits in der Einführungsfolge kurz vorgestellt. In FORTH ist es der zentrale Ort für die Zwischenspeicherung von Zahlen jeglicher Art.
Das besondere an diesem Stack ist das Prinzip, nach dem er verwaltet wird. Dieses Prinzip könnte man als „Was zuletzt abgelegt wurde, muß als erstes wieder heruntergenommen werden“ oder kurz als LiFo-Prinzip (engl. Fast in First Out) bezeichnen. Das bedeutet, daß eine Zahl nach der Eingabe an oberster Stelle im Stack (im FORTH-Jargon ’TOS’ für ’Top Of Stack’ genannt) abgelegt wird. Soll eine Zahl vom Stack genommen werden, so wird dementsprechend immer diese oberste Zahl genommen.
Im Moment befindet sich nur eine Zahl im Stack, nämlich die '17'. Bei der Eingabe einer weiteren Zahl, z. B.
25 ok
wird diese Zahl an oberster Stelle im Stack abgelegt. Die ’17’ „rutscht“ um eine Position tiefer. Tatsächlich, und das soll ruhig vorweggenommen werden, rutschen natürlich keine Zahlen, sondern es wird lediglich ein bestimmter Zeiger verändert. Um die oberste Zahl im Stack auszugeben, stellt FORTH ein Wort zur Verfügung, welches durch einen schlichten ’.’ dargestellt wird:
. 25 ok
Dieser ’.’ entspricht also in etwa dem PRINT in BASIC - mit dem Unterschied, daß sich mit ’.’ nur Zahlen ausgeben lassen. Beachten Sie, daß bei der Ausgabe mit ’.’ die ausgegebene Zahl auch gleichzeitig vom Stack genommen wird. Demnach verbleibt nur noch die ’17’ im Stack. Auch davon kann man sich leicht überzeugen:
. 17 ok
Nun ist der Stack leer. Jeder weitere Versuch, mit ’.’ eine Zahl auszugeben, führt zu einer Fehlermeldung.
Nicht immer ist es jedoch erwünscht, daß eine ausgegebene Zahl damit auch vom Stack verschwindet. Um diesen Effekt zu umgehen, stellen viele FORTH-Systeme das Wort ’.S’ zur Verfügung (streng genommen ist ’.S’ nämlich kein FORTH-83-Standard-Wort), das den momentanen Inhalt des gesamten Stacks ausgibt. Nach Eingabe von:
11 22 33 ok
befinden sich im Stack drei Zahlen, wovon man sich durch Eingabe von ’.S’ leicht überzeugen kann:
.S 33 22 11 ok
Die Ablage von Zahlen auf dem Parameterstack ist Voraussetzung dafür, überhaupt Operationen mit Zahlen durchführen zu können. Im einfachsten Fall wird es sich dabei um arithmetische Operationen handeln. Für Rechenoperationen in FORTH gilt allerdings eine Besonderheit, die Anfängern erfahrungsgemäß einige Schwierigkeiten bereiten kann: Alle Rechenoperationen werden in FORTH nach den Regeln der „Umgekehrt Polnischen Notation“ durchgeführt (siehe Infokasten 1).
So wird beispielsweise nach Eingabe von ’ + ’ die Summe aus den obersten beiden Zahlen gebildet und das Ergebnis wieder an oberster Stelle im Stack abgelegt. Um das Ergebnis zu erhalten, könnte man es sich mit ausgeben lassen. Unter Umständen kann es aber günstiger sein, die oberste Zahl im Stack zuvor mit ’DUP’ zu kopieren. Auch dazu ein Beispiel:
34 55 * ok
Das Ergebnis befindet sich nun im TOS. Durch
DUP ok
wird es kopiert und kann mit ausgegeben werden:
. 1870 ok
Das Ergebnis kann nun für weiter Operationen verwendet werden.
Neben ’DUP’ existieren in FORTH noch zahlreiche weitere sog. „Stackmanipulationsworte“ wie ’DROP’, welches das oberste Element im Stack löscht, ’OVER’, welches das zweitoberste Element im Stack löscht, ’OVER’, welches das zweitoberste Element im Stack in die Spitze kopiert, oder ‘ROT’, welches die obersten drei Elemente des Stacks eine Position rotieren läßt. Probieren Sie diese Worte ruhig einmal aus.
Solche Stackmanipulationen sind natürlich eine Besonderheit von FORTH und in den meisten anderen Sprachen nicht zu finden. Dort wird ein Stack allenfalls zur Zwischenspeicherung von Systemadressen verwendet und ist ein wohlgehütetes Geheimnis, dem Programmierer in der Regel also nicht direkt zugänglich. In FORTH, und das soll noch einmal betont werden, läuft die gesamte Parameterübergabe über den Stack. Soll also irgendein Wort mit Parametern aufgerufen werden, so müssen diese zuvor auf dem Stack abgelegt werden.
Der Stack spielt die Rolle eines Zwischenspeichers für lokale Variablen. Geschickte Programmierer können daher ganz auf Variable und Konstanten verzichten, indem sie sämtliche Parameter, die während eines Programmablaufs anfallen, auf dem Stack verwalten. Ob dies freilich die Lesbarkeit eines programmes erhöht, sei dahingestellt.
Auch auf eine weitere Besonderheit soll kurz hingewiesen werden. Stan-dard-FORTH-83 rechnet grundsätzlich nur mit 16 bzw. 32 Bit breiten Integerzahlen. Wundern Sie sich also nicht, wenn Sie bei der Division ein scheinbar unverständliches Ergebnis erhalten:
22 7 / . 3 ok
Auch diesen Umstand verdankt FORTH seinen (sicher nicht gerechtfertigten) Ruf als „Exot“ unter den Programmiersprachen. Tatsächlich wird durch die ausschließliche Verwendung von Integerzahlen eine weitere Steigerung der Arbeitsgeschwindigkeit erreicht, ohne daß unbedingt die Genauigkeit darunter zu leiden hätte. Zudem sind für die meisten FORTH Systeme sog. „Gleitkommapakete“ erhältlich, auf die bei Bedan zurückgegriffen werden kann.
Doch zurück zur praktischen Anwendung. Nachdem die Rolle des Parameterstacks geklärt ist, müssen wir uns einem weiteren wichtigen Aspekt zuwenden: Wie werden in FORTH Programme geschrieben? Bekanntlich liegt die Stärke einer Programmiersprache darin, eine bestimmte Folge von Anweisungen (auch Programm genannt) im Grund beliebig oft ablaufen zu lassen.
Um FORTH dazu zu bringen, sich eine bestimmte Folge von Anweisungen zu merken, müssen diese Anweisungen in eine sog. „Doppelpunktdefinition“ eingebunden werden. Was das heißt, wird schnell an einem Beispiel klar. Angenommen, Sie wollen ein Programm schreiben, das von einer Zahl die Quadratzahl berechnet und das Ergebnis anschließend ausgibt. In BASIC wäre die Angelegenheit innerhalb einer Minute erledigt und würde etwa so aussehen:
10 INPUT A
20 B = A * A
30 PRINT A
In FORTH muß zunächst mit Hilfe eines Doppelpunktes der Beginn einer Doppelpunktdefinition eingeleitet werden. Auf den Doppelpunkt folgt der Name, unter dem die Definition von nun an aufgerufen werden kann. Also etwa ’ : QUADRAT’. Nun müssen wir uns überlegen, wo der Wert herkommt, der quadriert werden soll. Da wir davon ausgehen, daß dieser zuvor auf dem Stack abgelegt wurde, wäre dieses Problem bereits gelöst. Auch das Quadrieren ist einfach, da durch ’DUP’ die Zahl im Stack kopiert wird und mit ’ ★ ’ diese beiden Zahlen miteinander multipliziert werden. Schließlich muß das Ergebnis noch ausgegeben werden, das erledigt bekanntlich Beendet wird die Doppelpunktdefinition durch ein womit das Programm, oder genauer gesagt das Won 'QUADRAT’, fertig wäre. Hier noch einmal das komplette „Listing“:
: QUADRAT
DUP * . ;
Ignorieren Sie zunächst das Wort compiling’, das während der Eingabe einer Doppelpunktdefinition in VOLKSFORTH erscheint. Wir werden seine Bedeutung später klären.
Bevor Sie 'QUADRAT’ aufrufen, müssen Sie daran denken, daß die Zahl, die quadriert werden soll, zuvor auf dem Stack abgelegt werden muß. Dann kann eigentlich nichts mehr schiefgehen:
9 ok (Zahl wird auf dem Stack abgelegt)
QUADRAT 81 ok
oder in einer einzigen Zeile:
QUADRAT 81 ok
Haben Sie dieses Beispiel verstanden, dann haben Sie auch eine wesentliche Grundlage der Programmierung in FORTH verstanden. Halten wir noch einmal fest:
Programme werden in FORTH durch die Definition neuer Worte geschrieben.
Jedes neue Wort wird in das Wörterbuch, einen Bereich des Arbeitsspeichers, der den Wortschatz des FORTH-Systems erhält, eingetragen. Dieses Wörterbuch spielt also die Rolle eines Programmspeichers, der mit jeder neuen Definition wächst. Bei der Verarbeitung einer Eingabe sucht der Text-Interpreter zunächst in diesem Wörterbuch nach einem übereinstimmenden Wort, das dann zur Ausführung gebracht wird. Findet er kein Wort im Wörterbuch, das mit der Eingabe übereinstimmt, versucht er, die Eingabe in eine Zahl umzuwandeln. Führt auch dies nicht zum Erfolg, so bricht der Textinterpreter mit der bekannten Fehlermeldung ab.
Doch zurück zu unserer ersten Definition. Im Grunde ist die Ausgabe noch ein wenig nüchtern. Wie wäre es, wenn das Ergebnis mit einem kleinen Kommentar ausgegeben wird? Da die Definition von 'QUADRAT’ bereits bei der Eingabe umgesetzt wurde, gibt es keine Möglichkeit, den Quelltext dieser Definition nachträglich zu verändern. Ich werde daher in der nächsten Folge eine weit komfortablere Eingabemöglichkeit vorstellen. Uns bleibt im Moment daher nichts anderes übrig, als die (jetzt allerdings erweiterte) Definition von 'QUADRAT’ erneut einzugeben:
: QUADRAT
DUP *
."Das Ergebnis ist :". ;
Der Textinterpreter wird sich jetzt mit der Mitteilung „QUADRAT exists“ melden: Eine Definition mit dem Namen 'QUADRAT' existiert tatsächlich. Beim Aufruf von 'QUADRAT' wird nun die neueste Version dieses Wortes aufgerufen:
12 QUADRAT Das Ergebnis ist 144
Wagen wir uns an ein wenig anspruchsvolleres Projekt heran. Es sollen alle Quadrate der Zahlen ’1' bis '10' ausgegeben werden. Dazu bedarf es keiner allzugroßen Anstrengung mehr, denn der größte Teil des Problems wurde bereits gelöst. Was fehlt, ist eine Schleifenanweisung vom Typ 'FOR...NEXT'. Auch so etwas gibt es in FORTH. Diese ’DO...LOOP’-Schleife läßt sich mit der 'FOR...NEXT'-Schleife in BASIC vergleichen, mit der Besonderheit, daß Anfangs- und der Endwert zuvor auf dem Stack abgelegt werden müssen. Wie das neue Wort 'ZEHNMAL' aussehen könnte, zeigt Abb. 1.
Nach Aufruf von 'ZEHNMAL' sollten die Quadratzahlen der Zahlen eines bis zehn ausgegeben werden. Beachten Sie, daß diesesmal keine Parameterübergabe notwendig ist, da die Parameter innerhalb des Wortes 'ZEHNMAL' erzeugt werden.
Sollten Sie bei der Eingabe der Definition in Abb. 1 etwa einen Tippfehler gemacht haben, so können Sie gleich noch einmal von vorne anfangen. FORTH unterbricht in diesem Fall die Doppelpunktdefinition (genauer gesagt, ruft der Textinterpreter eine sog. „Abort“ Routine auf, welche einen Warmstart durchführt) und eine bis dato eingetippte Definition ist verloren. Dieser Umstand liegt in der Natur des FORTH-Textinterpreters.
Daß diese Eigenschaft insbesondere bei größeren Definitionen niemandem zugemutet werden kann, ist klar. Deswegen werde ich in der nächsten Folge zeigen, wie man mit Hilfe des VOLKS-FORTH-Editors Programme erstellen kann.
: ZEHN-MAL / Einleitung der Doppelpunktdefinition
10 0 / Übergabe des End- und des Startwertes
/ Beachten Sie die Reihenfolge!
DO / Beginn der Schleife
I / Dieses Wort holt den aktuellen Schleifenzähler
/ in den Stack
QUADRAT / die Wirkung kennen Sie ja bereits
LOOP / Ende der Schleife
; / Ende der Wortdefinition
Was bedeutet UPN?
Bei der „Umgekehrt Polnischen Notation“ (benannt nach dem polnischen Mathematiker Lukasiewicz) handelt es sich um eine spezielle Rechenvorschrift für arithmetische Ausdrücke. Anders als bei der gebräuchlicheren Infix-Notation werden zunächst die Operanden und anschließend der Operand aufgeführt. Dem Infix Ausdruck '3 * 2 + 1 =’ entspräche gemäß der UPN der Ausdruck '3 2 * 1 +’. Die UPN, die ohne Klammern und Operatorhierachien auskommt, weist bei der Auswertung durch einen Computer erhebliche Vorteile gegenüber der Infix-Notation auf und führt deswegen zu einem teilweise beträchtlichen Geschwindigkeitsgewinn. Alle Operationen in FORTH werden nach den Regeln der UPN ausgeführt.
Die Freunde der Sprache Forth, wird diese Nachricht sicher sehr interessieren: Von Volksforth 83 gibt es eine neue Version, welche über unseren Public-Domain-Service zu erhalten ist. Diese Version hat sich in vielen Punkten verändert. Zum einen ist sie relokatibel geworden. Man spart also den Lader, wodurch die Bedienung wesentlich einfacher wird. Weiterhin kann man durch das Fileinterface normale TOS-Files bearbeiten. Auch die Bedienungsfreundlichkeit hat durch den neuen Editor, der voll GEM-gesteuert ist, um einiges zugelegt. Aufgrund dieser Änderungen benötigt sie drei Disketten. Da die alte Version auf zwei Disketten untergebracht war, konnten wir diese (3 und 4) nicht aktualisieren. Die neue Version erhalten Sie auf den Disketten 49, 50 und 51. Ein ausführliches Handbuch (> 200 Seiten) erhalten Sie zum Preis von DM 39,80 bei:
Dietrich Weineck, Fleetrade 40, 2800 Bremen