FORTH - eine mehrteilige Einführungsserie Teil 1

FORTH - warum eigentlich nicht? Schließlich wird FORTH oft mit "richtigen" Programmiersprachen wie PASCAL, C oder MODULA-2 in einem Atemzug genannt. Und das zu recht: FORTH bietet einiges, was man in diesen Sprachen vergeblich sucht. Daher sollte die Kenntnis der Grundzüge von FORTH jedem, der sich ernsthaft mit Softwareentwicklung beschäftigt, zur Pflichtaufgabe gemacht werden. Denn FORTH ist mehr als nur eine weitere Programmiersprache: Eine eigene Programmierphilosophie.

Ihre prägenden Merkmale sind strukturiertes Design, Modularität, Einfachheit und Erweiterbarkeit. Man könnte es auch auf eine provokante Kurzformel bringen: FORTH Kann alles, was andere Sprachen auch können - meistens allerdings leichter. Die FORTH-Einführungsserie, die in dieser Ausgabe beginnt, will diesen Beweis antreten. STCOMPUTER-Lesern wird dabei der Einstieg besonders leicht gemacht: Die Serie orientiert sich an VOLKSFORTH, das über den PD-Service erhältlich ist. Alles, was Sie tun müssen, ist Diskette Nr. 3 und Nr. 4 anzufordern: Schon kann's losgehen.

Bis dahin noch ein paar einführende Worte über die Entstehung und die wichtigsten Eigenschaften von Forth.

Wie alles begann

FORTH ist eine Sprache mit bewegter Vergangenheit. Sie entstand Ende der sechziger Jahre und wurde zunächst fast ausschließlich zur Steuerung von Radioteleskopen und zur industriellen Prozeßsteuerung eingesetzt. Jahrelang blieb sie exklusives Programmierwerkzeug einiger weniger "Eingeweihter". Erst als sich in den siebziger Jahren die Forth Interest Group (FIG) gründete, die mit FIG-FORTH 1.0 (manchmal auch als FORTH-78 bezeichnet) eine Art Standard entwickelte und als Public-Domain zur Verfügung stellte, wurde FORTH auch in der Mikrocomputer-Szene heimisch. Mittlerweile ist für nahezu jeden denkbaren Prozessortyp eine FORTHImplementation erhältlich - eine Tatsache, die FORTH besonders für Systemprogrammierer interessant macht.

Obwohl von _Insidern" und einigen Fachredakteuren schon seit Jahren eine ständig wachsende Popularität beobachtet wird, hat es FORTH nicht geschafft, sich als "Massensprache" wie C oder TURBO PASCAL zu etablieren. Die Ursachen dafür sind vielschichtig und sollen an dieser Stelle auch nicht weiter erläutert werden. An der mangelnden Leistungsfähigkeit kann es sicher nicht liegen, denn FORTH weist Eigenschaften auf, die es von Sprachen wie C oder PASCAL Positiv unterscheidet.

Fragen Sie doch einmal einen FORTH-Freak, was denn eigentlichd das Besondere an dieser Sprache sei. Wahrscheinlich wird er Sie zunächst verständnislos anstarren und dann irgendetwas von indirekt verknüpftem Code und virtueller Maschine faseln. Daß sich damit jemand, der von FORTH keine Ahnung hat, nur schwer begeistern läßt, ist sonnenklar. Deshalb will ich versuchen, die wichtigsten Vor- und auch Nachteile von FORTH aufzulisten:

INFOKASTEN: Welche FORTH-Systeme gibt es für den ST?

Für den ATARI ST sind mittlerweile mehr als ein halbes Dutzend FORTH-Versionen erhältlich. Alle diese Versionen orientieren sich am FORTH-83-Standard. Leider gilt dieser Standard natürlich nur für die hardwareunabhängigen Worte des Sprachkerns. Beim Rest (und der macht in der Regel den größeren Teil des Sprachkerns aus, bleibt es dem Entwickler überlassen, wie er die entsprechenden Worte benennt. Glücklicherweise hat sich auch hier, zumindest beim Aufruf der Betriebssystemroutinen des ST, eine relativ einheitliche Syntax durchgesetzt. Die auf dem Markt angebotenen Systeme unterscheiden sich natürlich in erster Linie durch ihren Preis. Am oberen Ende rangieren Systeme wie 4xFORTH, die etwa soviel kosten wie ein guter C-Compiler. Am unteren Ende der Preisskala rangieren Systeme wie ST--FORTH oder das VOLKSFORTH. Die Vertreiber von 4xFORTH etwa bieten dem Kunden sehr viel, was über die reine Software hinausgeht u. a. etwa eine erstklassige technische Unterstützung, kostenlose Updates und eine User Zeitschrift. Die Preisunterschiede haben ihren Grund also nicht unbedingt in unterschiedlicher Qualität.

Für den Einstieg ist ein System wie VOLKSFORTH bestens geeignet. Es bietet alles, was zur Programmentwicklung notwendig ist. Beim über den PD Service angebotenen VOLKSFORTH Handelt es sich um Version 3.7. Sie wurde inzwischen von dem Autor überarbeitet. Bei der aktuellen Version 3.8 wurde u. a. das File Interface verbessert und ein vollständig in GEM eingebundener Editor integriert. Version 3.8 ist zusammen mit einer umfangreichen Dokumentation für 60 DM bei der FORTH-Gesellschaft in Hamburg (einer nicht kommerziellen Vereinigung von FORTH-Programmierern) erhältlich. Wer bereits Version 3.7 besitzt erhält nach Einsendung von 20 DM und leeren Disketten ein Update.
Adresse: FORTH-Gesellschaft e.V. Friedensallee 92, 2000 Hamburg 50

Programmentwicklung unter FORTH

Wer sich für eine neue Programmiersprache interessiert, wird wohl zunächst seinen Blick auf den Aufbau eines typischen Programmes richten. Die wohl markanteste Eigenschft von FORTH ist seine Erweiterbarkeit: Ein FORTHSystem (so wie Sie es z. B. über den PD-Service erhalten können) besteht u. a. aus einer bestimmten Anzahl von Worten (stellen Sie sich unter einem Wort zunächst einfach eine Procedure wie in Turbo Pascal oder noch einfacher ein Unterprogramm wie in BASIC vor), dem Sprachkern des Systems. Die Gesamtheit aller Worte eines Systems ist in einem Teil des Arbeitsspeichers untergebracht, der als Wörterbuch bezeichnet wird. Programmieren in FORTH heißt nun, neue Worte zu definieren. Jedes neu definierte Wort baut zwangsläufig auf bereits existierenden Worten auf. Ein einfaches Beispiel soll dies erläutern. Nehmen wir an, Sie sollten ein Programm für die Steuerung einer Verkehrsampel erstellen. Sinnvollerweise beginnt man dabei zunächst mit der Steuerung einer einzigen Ampel, um über die grundsätzliche Vorgehensweise Klarheit zu gewinnen.
Zunächst werden Worte benötigt, die die drei Lampen Rot, Gelb und Grün steuern. Genauer gesagt: Bei Aufruf eines dieser Worte soll eine der drei Lampen ein- bzw. ausgeschaltet werden. In FORTH würden diese Worte folgendermaßen aussehen:

:ROT_EIN SET PORT1 ON;  
:ROTT_AUS SET PORT1 OFF ;  
:GELB_EIN SET PORT2 ON ;  
:GELB_AUS SET PORT2 OFF ;   
:GRÜN_EIN SET PORT3 ON ;   
:GRÜN_AUS SET PORT3 OFF ;

Hier wird der charakteristische Aufbau eines FORTH-Wortes sichtbar. Es wird durch ':' eingeleitet, gefolgt von dem Namen, unter dem das Wort aufgerufen werden kann. Nun folgen die Worte, die bei Aufruf des gerade definierten Wortes ausgeführt werden sollen. Beendet wird die Wortdefinition durch ein Semikolon. Beim Aufruf etwa von ROT EIN werden der Reihe nach die Worte 'SET', 'PORTI' und 'ON' ausgeführt und bewirken, daß die rote Lampe eingeschaltet wird. (In der Praxis könnte man z. B. die Lampen an die serielle Schnittstelle des ST anschließen. 'SET PORT1 ON' würde dann einen Ausgang der Schnittstelle auf ' 1' setzen. Machen Sie sich über die Worte 'SET', 'PORT' und 'OFF' keine weiteren Gedanken. Es sind keine Worte des FORTH-Kerns, sondern sie wurden zuvor vom Benutzer definiert. Sie dienen hier lediglich zur Veranschaulichung.) Entsprechend verhalten sich die übrigen fünf Worte.

Legen Sie an dieser Stelle einmal eine kurze Pause ein und notieren Sie sich einen ebenso trivialen wie bedeutungsvollen Satz: Das Verhalten eines FORTH-Wortes bei seiner, Ausführung wird durch das Verhalten. seiner Komponentenwörter bestimmt. (Damit sind jene Wörter gemeint, die das jeweilige Wort beinhaltet.)
Unsere sechs Beispielworte sind also wiederum in FORTH geschrieben. Überhaupt ist ein großer Teil dieser Sprache durch sich selbst definiert. Dies kann natürlich nicht beliebig fortgesetzt werden, denn keine Sprache kann vollständig in sich selbst definiert sein. Irgendwann wird ein FORTH-Wort nicht mehr aus weiteren FORTHWorten, sondern direkt aus Maschinencode bestehen. Solche Wörter werden im weiteren Verlauf der Serie noch des öfteren auftauchen.

Zurück zu unserer Ampelsteuerung. Mit den sechs Worten zur Ansteuerung ist es alleine noch nicht getan. Skizzieren Sie sich einmal den Ablauf einer Ampelphase. Die einzelnen Phasen lauten: ROT - ROT/GELB GRÜN GELB. Dabei fällt zunächst auf, daß vorhin ein Wort vergessen wurde, dessen Definition an dieser Stelle nachgeholt werden soll:

:ROT/GELB_AUS  
GELB_AUS ROT_AUS ;

So einfach ist das. Anstatt die Worte 'GELB AUS' und 'ROT-AUS' der Reihe nach aufrufen zu müssen, wird durch das Wort 'ROT/GELB AUS' das gleiche erreicht. Wenn Sie jetzt allerdings auf die Idee kommen sollten, zu sagen "Alles klar" und ein Wort hinzuschreiben, das etwa wie folgt aussehen könnte:
:AMPEL ROT_EIN
GELB_EIN
ROT/GELB_AUS
GRÜN_EIN
GRÜN_AUS
GELB_EIN
GELB_AUS ;

und den Ablauf einer kompletten Phase beschreibt, so wäre dies nur fast richtig. Außer acht gelassen wurde bislang die Tatsache, daß zwischen den einzelnen Phasen natürlich auch Wartephasen liegen müssen. Da sie verschieden lang sind, wäre es denkbar, für jede Wartephase ein eigenes Wort zu definieren. Wesentlich flexibler wäre es allerdings, wenn man ein einziges Wort definieren würde, bei dem die jeweilige Wartezeit vor dem Aufruf als Parameter übergeben wird. Damit steht auch gleich ein weiterer Punkt an, von dem bislang noch nicht die Rede war - die Parameterübergabe. In Hochsprachen wie C oder PASCAL werden die einer Prozedur zu übergebenden Parameter in der Regel als lokale Variablen explizit definiert und vor jedem Prozeduraufruf übergeben. In FORTH geht dies viel einfacher. Hier wird generell ein Ort vereinbart, an dem vor dem Aufruf eines Wortes alle benötigten Parameter abgelegt werden. Bei diesem Ort handelt es sich um einen bestimmten Bereich des Arbeitsspeichers, der speziell für diese Bestimmung reserviert ist und als Parameterstack bezeichnet wird. Für den Zugriff auf diesen "Speicherbereich für lokale Variablen" gilt das Prinzip "Was zuletzt abgelegt wurde, wird als erstes wieder heruntergenommen". Ich werde in der nächsten Folge dieses einfache Prinzip an einigen Beispielen erläutern, damit auch die Funktion des Parameterstacks deutlicher wird. Um eine Zahl im Stack abzulegen, sind keine besonderen Worte nötig: Jede eingegebene Zahl wird grundsätzlich erst einmal im Stack abgelegt. Für den Anfang soll diese kurze Beschreibung genügen.

Mit diesem Wissen kann nun auch ein Wort definiert werden, das eine bestimmte Zeit wartet. Die genaue Dauer des Wartezustandes hängt von der Größe der Zahl ab, die zuvor auf dem Parameterstack abgelegt wurde.
WARTE O DO LOOP ;
Innerhalb von 'WARTE' läuft eine einfache Schleife vom Typ 'DO/LOOP', die von Null bis zu dem übergebenen Wert zählt. Damit sind alle Bausteine beisammen, die für die eingangs gestellte Aufgabe benötigt werden. Das komplette Wort könnte folgendes Aussehen haben:

:AMPEL
ROT/GELB/GRÜN_AUS
BEGIN
ROT_EIN 1000 WARTE
GELB_EIN 200 WARTE
ROT/GELB_AUS
GRÜN_EIN 1000 WARTE
GRÜN_AUS
GELB_EIN 200 WARTE
GELB_AUS
AGAIN 1

In das Wort 'AMPEL' wurde eine Wiederholungsanweisung vom Typ 'BEGIN/AGAIN' eingebaut, welche bewirkt, daß alle Anweisungen, die zwischen 'BEGIN' und 'AGAIN' auftauchen, theoretisch unendlich oft durchlaufen werden.

Damit wäre der Quellcode für unser erstes FORTH-Programm fertig, allerdings bislang nur auf dem Papier. Um den Quellcode zur Ausführung zu bringen, können wir ihn entweder über die Tastatur eintippen. Der FORTHInterpreter würde die gesamte Eingabe analysieren und das Wörterbuch um die neuen Wörter erweitern. Anschließend kann das Wort 'AMPEL' (genau wie jedes seiner Komponentenwörter) durch Eingabe des Wortnamens zur Ausführung gebracht werden. Der Nachteil dieses Verfahrens liegt auf der Hand - ein auf diese Weise eingegebener Quelltext kann nicht mehr modifiziert werden. Die Alternative wäre, den Quellcode zunächst mit Hilfe eines eingebauten Editors einzugeben und auf einem Massenspeicher (Diskettenlaufwerk oder Festplatte) abzuspeichern. Von dort kann er dann bei Bedarf geladen werden. Dieses "Laden" von Diskette (das in FORTH zuständige Wort heißt 'LOAD' erzielt exakt den gleichen Effekt wie die direkte Eingabe über Tastatur. Der FORTH-Interpreter behandelt von der Tastatur kommende Daten genau wie die von einer Massenspeichereinheit kommenden. Dieses im Grunde einfache aber dennoch leistungsfähige Konzept erlaubt dem FORTH-Programmierer, sich (ähnlich wie etwa in C) Bibliotheksmodule anzulegen, die bei Bedarf zum System hinzugeladen werden.

Damit soll die Übersicht für das erste beendet sein. Sinn dieses Beispiels war es nicht, einen Schnellkurs für FORTH in zehn Minuten durchzuführen, sondern, an einem anschaulichen Beispiel einige charakteristische Merkmale der Programmierung unter FORTH vorzuführen. Programmieren in FORTH heißt nicht etwa nur das Ineinanderschachteln einzelner Programmodule, denn dann könnte man besser bei BASIC, PASCAL oder vielleicht auch bei LOGO bleiben. Programmieren in FORTH heißt vielmehr, ein Problem auf die einfachste und eleganteste Weise zu lösen.

Zum Schluß noch ein Aspekt, der fairerweise auch einmal angesprochen werden sollte. Wie sieht es mit der Erlernbarkeit von FORTH aus? FORTH macht auf Neulinge, die Sprachen wie Turbo Pascal, BASIC oder gar FORTRAN gewöhnt waren einen eher merkwürdigen Eindruck. Dazu trägt nicht zuletzt die Verwendung der Umgekehrt Polnischen Notation zur Darstellung arithmetischer Ausdrücke und eine recht unkonventionelle Syntax bei. C-Programmierer haben es am Anfang ein wenig leichter, da auch in FORTH viele Befehle durch Bezeichner dargestellt werden, die aus einem oder zwei Zeichen bestehen. Auch hier gilt die Devise "Lernen durch Ausprobieren". Deswegen möchte ich Sie ermutigen, in dieser Einführungsserie auch weiter am Ball zu bleiben. Ich hoffe, bereits mit dieser Einleitung Vorfreude geweckt zu haben. Bis zum nächsten Mal - und vergessen Sie nicht, sich eine FORTH-Version aus dem PD-Service von ST-Computer zu besorgen!

INFOKASTEN: Wie schnell ist FORTH?

Über den Sinn und Unsinn von einfachen Benchmarktests ist schon viel geschrieben worden. Auch wenn man diese Tests nicht überbewerten sollte, geben sie doch einen ersten Aufschluß über die Leistungsfähigkeit eines Systems. Als Standard hat. sich das Sieb des Eratosthenes entwickelt (Listing in Heft 11/86). In der nachfolgenden Tabelle wurde die Ausführungsgeschwindigkeit der gängigsten Programmiersysteme gegenübergestellt.


Peter Momad jemi
Aus: ST-Computer 03 / 1987, Seite 108

Links

Copyright-Bestimmungen: siehe Über diese Seite