4xFORTH: Superschnelles FORTH für den ST

Für den ST werden mittlerweile über ein halbes Dutzend verschiedener FORTH Versionen angeboten. Der Anwender hat die Qual der Wahl. Nicht häufig ist beim Kauf letztlich der Preis ausschlaggebend, denn schließlich reicht die Preisspanne der angebotenen Systeme von kostenlos bis zu einigen Hundert Mark. 4xFORTH fällt in die letztere Kategorie. Ob es sein Geld wert ist, soll dieser Testbericht zeigen.

Einer der Vorzüge von FORTH liegt zweifelsohne in seiner Maschinenähe, die es erlaubt, die jeweilige Prozessorarchitektur effektiv auszunutzen, und der daraus resultierenden höhen Verarbeitungsgeschwindigkeit. Es wäre aber falsch, FORTH als eine assemblerähnliche Sprache zu bezeichnen, denn es enthält wiederum zahlreiche Elemente einer typischen Hochsprache, wie z. B. leistungsfähige Kontrollstrukturen (u. a. BEGIN ... UNTIL oder CASE OF), bzw. bietet dem Benutzer die Möglichkeit, eigene Datentypen zu definieren. Zwar weist es interaktive Eigenschaften auf (eingegebene Worte werden wie in BASIC unmittelbar nach ihrer Eingabe ausgeführt), gleichzeitig werden eingegebene Programme in einer Art Zwischenkode übersetzt, so daß man FORTH auch als eine kompilierende Sprache bezeichnen könnte. Schon an diesen beiden Beispielen wird deutlich, daß FORTH sich nur schwer kategorisieren läßt. FORTH „Profis" umgehen diesen Konflikt, indem sie FORTH als eine Programmierumgebung bezeichnen. Dieser Begriff, der auf den ersten Blick vielleicht ein wenig vage erscheinen mag, nimmt aber sehr schnell Kontur an, wenn man sich erst einmal näher mit FORTH beschäftigt.

Die wohl charakteristischste Eigenschaft von FORTH ist seine Erweiterbar-keit. Der Benutzer erhält ein System mit einer bestimmten Anzahl von „Kernwörtern" (ein typisches FORTH System auf einem 16 Bit Rechner enthält ca. 600 -1000 solcher Kernwörter, wobei allerdings mehr Quantität nicht unbedingt auch mehr Qualität bedeuten muß). Ein Wort in FORTH ist in etwa mit einer Prozedur in PASCAL oder C vergleichbar. Programmieren in FORTH heißt nun, den Kern um neue Wörter zu erweitern. Jedes neue Wort baut dabei auf bereits bestehende Wörter auf. Diese Vorgehensweise führt zu einem extrem modularen Programmaufbau, da ein FORTH Programm letztlich aus einem einzigen Wort besteht, welches bei Aufruf seine Komponentenwörter zur Ausführung bringt, welche wieder ihre Komponentenwörter zur Ausführung bringen usw. Da aber eine Sprache in der Praxis nicht vollständig durch sich selbst definiert sein kann, existieren neben den Kern-Wörtern noch sog. „Primitive", welche nicht durch FORTH Wörter, sondern durch Maschinenkode definiert sind.

Da einzelne Komponentenwörter auch unabhängig von dem sie aufrufenden Wort interaktiv getestet werden können, resultiert eine im Vergleich zu klassischen Kompilersprachen drastisch reduzierte Programmentwicklungszeit. Hat man FORTH erst einmal um neue Wörter erweitert, kann das komplette System abgespeichert werden, und man erhält so eine „neue" Sprache mit einem erweiterten Befehlssatz.

4xFORTH von der Dragon Group gehört zu den ersten Sprachen, die für den ST erhältlich waren. Schon kurz nach der Deutschlandpremiere im Frühjahr '85 wurde Version 1.0 angeboten. Mittlerweile steht eine drei vor der Versionsnummer und 4xFORTH ist inzwischen nicht nur um zahlreiche neue Wörter erweitert bzw. von einigen Bugs bereinigt worden, sondern es wurde auch intern völlig umgekrempelt. Der Benutzer bemerkt dies zunächst höchstens an der Verarbeitungsgeschwindigkeit, die noch einmal erheblich gesteigert werden konnte. Doch davon nachher mehr.

4xFORTH kommt mit einem umfangreichen Handbuch in einem soliden Plastikordner und einer Diskette, auf der sich das (relativ) kleine „Hauptprogramm", je ein Urlader für die 1 MB bzw. die in den USA noch verbreitetere 512 KB Version und ein umfangreicher Screenfile mit zahlreichen nützlichen Utilities befinden. Diese Utilities können beim Booten wahlweise hinzugeladen werden. Neben diesen Programmfiles befinden sich auf der Diskette noch vier Dokumentationsfiles, die für den Benutzer wichtige Informationen enthalten (diese zusätzlichen Informationen werden vor allem jene Anwender zu schätzen wissen, die ihr System ohne das originale Handbuch erhalten haben).

Beim Booten des Systems wird der Benutzer durch einen Drachen begrüßt, der über den Bildschirm „fliegt", und dessen Bewegungsdynamik bereits einen kleinen Vorgeschmack auf die Möglichkeiten von 4xFORTH bietet. Die Begeisterung über dieses eindrucksvolle Demo (wem das irgendwann einmal doch langweilig wird, der muß einfach in Screen# 14 die entsprechende Zeile entfernen) wird sicher noch gesteigert, wenn man sich den dazu gehörigen Quelltext anschaut. Das gesamte Demo besteht abgesehen von der kleinen „Datenwüste", die die Konturen des Drachens festlegt, aus ganzen 2 Screens. Mit den in der Grundversion zur Verfügung gestellten Wörtern lassen sich bereits ohne allzu großen Aufwand einige hübsche Animationen realisieren. Der Grafikbefehlswortschatz von 4xFORTH orientiert sich größtenteils am Befehlssatz des Tektroniks 4010, jenem Grafikterminal, welches bereits vor Jahren Standards in der Groß EDV setzte.

Sollte dieser Befehlssatz nicht ausreichen, so kann man sich relativ problemlos eigene Grafikbefehle definieren. Grundlagen für solche „Eigenkreationen" werden in den meisten Fällen die sog. A-Traps bilden, jene TOS Routinen, die indirekt durch das Auftreten eines „illegalen" $Axxx Maschinenbefehls aufgerufen werden. Die wichtigsten A-Traps sind bereits fertig implementiert, so daß man die entsprechenden Wörter nur noch aufzurufen braucht, ohne sich um TOS Details kümmern zu müssen. Abb. 1 zeigt ein paar Beispiele solcher, mit Hilfe von A-Traps realisierten Grafikwörter in 4xFORTH. Der Hauptvorteil der Verwendung solcher Grafikbefehle dürfte wohl in erster Linie in der enorm hohen Ausführungsgeschwindigkeit liegen.

Zu mehr Grafik konnten sich die Entwickler allerdings in der Level I Version nicht entschließen. Wer also gerne VDI oder AES Routinen in seine Programme einbauen möchte, wird zunächst enttäuscht sein, denn solche Aufrufe werden von Level I nicht unterstützt. Möglich sind sie dennoch. Der Programmierer ist allerdings gezwungen, ähnlich wie in einem „nackten" Assembler, der über keine Makrobibliothek verfügt, sozusagen bei Null anzufangen. Eine Menge unnötiger Arbeit, denn seit Mai dieses Jahres ist das lange im voraus angekündigte Level II erhältlich, welches komfortable VDI/AES Aufrufe ermöglicht. Besitzer von Level I können Level II gegen einen Aufpreis erhalten. Bei Level II handelt es sich um einen zusätzlichen Screen File (Umfang ca. 100 KB), der die notwendigen Basis-Wörter für den Aufruf von VDI bzw. AES Prozeduren enthält. Der komplette Quellkode steht somit dem Anwender zur Verfügung und kann bei Bedarf modifiziert oder erweitert werden. Mit dabei ist eine 25 Seiten umfassende Dokumentation, die allerdings zum Verständnis des Aufbaus des GEMs nicht ausreicht (eine umfangreichere Dokumentation wurde von der Dragon Group bereits angekündigt). Deswegen sollte man bei der Arbeit mit Level II unbedingt noch zusätzliche Literatur hinzuziehen. Die beiden Demoprogramme zeigen eindrucksvoll, wie einfach etwa eine Alarmbox auf dem Bildschirm dargestellt werden kann. Für jemanden, der sich bislang noch nicht an die GEM Programmierung herangetraut hat, vielleicht der ideale Einstieg.

Doch zurück zu Level I. Neben den erwähnten Grafikwörtern befindet sich auf dem Screenfile u. a. ein komplettes „Mathepaket" für das Rechnen mit 64

Abb. 1: Wichtige A-Traps:

INIT.GRAPHICS  
SHOW.MOUSE  
MOUSE.X  
+ SPRITE  
PUT.PIX  
POLYGON  
DRAW.LINE  
HIDE.MOUSE  
MOUSE.Y  
-SPRITE  
GET.PIX  
MOUSE.BUTTONS

Bit Integerarithmetik. Damit werden Operationen möglich, bei denen als Ergebnis teilweise 128 Bit Zahlen entstehen. Auch wenn ein 64 Bit Prozessor noch nicht in Sicht ist und auch sonst wahrscheinlich niemand so schnell in die Verlegenheit kommen wird, auf 64 Bit oder gar 128 Bit zurückgreifen zu müssen, ist es doch ganz interessant, eine solche Zahl einmal auf dem Bildschirm zu sehen (oder wissen Sie auf Anhieb, welches die größte mit 64 Bit darstellbare Zahl ist?). So erhält man etwa durch Eingabe von

134215680 DUP M* D.  
18428730229246656512 < CR >

das zwanzigstellige Ergebnis. Eine sicher nicht alltägliche Zahl.

Das A und O für Anwender, die eigene Programme mit 4xFORTH entwickeln wollen, und das dürfte ja wohl die überwiegende Mehrheit sein, ist der Editor. Zwar sind die Zeiten, in denen man sich im Fenster mit einem zeilenorientierten Editor herumärgern mußte, glücklicherweise vorbei, doch der 4xFORTH Editor scheint auch noch nicht der Weisheit letzter Schluß zu sein. Zwar handelt es sich um einen Füll Screen Editor, der eine komfortable Eingabe des Quellcodes ermöglicht und sogar als ein primitives Textverarbeitungsprogrammn „mißbraucht" werden kann, allerdings fehlen dem Editor ein paar Features, die man bei Systemen der gehobeneren Preisklasse eigentlich erwarten sollte. Dazu gehören auf alle Fälle Such- und Austauschfunktionen, die bei größeren Applikationen (mehr als 100 Screens) beinahe unentbehrlich sind. Sozusagen als Trostpflaster enthält 4xFORTH dafür Wörter, die man bei anderen Systemen in der Regel vergeblich sucht. Da wäre z. B. LOCATE. Durch LOCATE < Name > wird der Screen angezeigt, in welchem das Wort < Name > definiert wurde. Ferner besteht die Möglichkeit, sog. Helpscreens einzurichten. Jedes Wort korrespondiert mit einem solchen Helpscreen und enthält Kommentare und Hinweise zu diesem Wort. Mit HELP <Name> kann der zu <Name> entsprechende Screen abgerufen werden. Dies sind alles Möglichkeiten, an die früher bei einem 8 Bit System etwa unter CP/M wegen des begrenzten Arbeitsspeichers nicht zu denken war, die sich aber auf einem System mit 512 oder gar 1 MByte Arbeitsspeicher und entsprechendem externen Speicher spielend realisieren lassen.

Wie bereits angedeutet, fällt 4xFORTH angenehm durch seine Verarbeitungsgeschwindigkeit auf. Dies gilt auch für die Geschwindigkeit, mit der auf Diskette liegende Screens in den Speicher geladen und interpretiert werden. So dauert das Laden und Interpretieren von 10 Screens weniger als 5 Sekunden. Diese ohnehin erfreulich kurze Zeitspanne (man denke nur einmal an die Dauer eines Compile-Link Vorganges eines durchschnittlichen C-oder MODULA-2 Compilers) kann durch Installation einer RAM Disk noch weiter verkürzt werden. Durch 'n SET.RAMDISK' wird eine RAM Disk in 4xFORTH installiert, wobei n die max. Anzahl an Blocks angibt.

Die Entwickler von 4xFORTH haben sich das Ziel gesetzt, dem Benutzer nicht nur ein FORTH System anzubieten, welches dem weithin anerkannten FORTH-83 Standard entspricht, sondern haben darüber' hinaus einige fortschrittliche Features implementiert. Hier seien neben der Möglichkeit, weitere Terminals anzuschließen und so einen Multi-User Betrieb zu realisieren bzw. ein einfaches Multitasking durchzuführen, vor allem die Änderung in der internen Struktur der „FORTH Maschine" erwähnt. Entsprach .jede Hochkodedefinition (darunter versteht man im allgemeinen eine Definition, die durch einen Doppelpunkt eingeleitet wird) dem klassischen FORTH Modell, indem sie aus einer Liste von Adressen bestand, durch die sich der Adressinterpreter „hindurchfädeln" mußte, so wird bei Version 3.0 vor jede dieser Adresse ein „Jump to Subroutine" Befehl gesetzt. Jedes FORTH Wort besteht nun aus einer Folge von Unterprogrammaufrufen, die beim Abarbeiten des jeweiligen Wortes der Reihe nach ausgeführt werden. Der innere Interpreter wurde sozusagen wegrationalisiert. Die Idee dieser direkten Verknüpfung (in der Fachsprache wird diese neue Konstruktion als ein „Call list Interpreter" bezeichnet) ist sicher nicht neu, es ist jedoch schön, daß sich ein Anbieter einmal dazu entschließen konnte, diesen Weg zu gehen. Nach außen hin stellt sich dem Benutzer FORTH genauso dar, wie er es von anderen Systemen her gewohnt ist. Lediglich bei der Maschinenspracheprogrammierung sind ein paar kleine Besonderheiten zu beachten. Der Hauptvorteil liegt neben der Geschwindigkeitssteigerung (s. Benchmarktabelle Abb. 2) vor allem in der Tatsache, daß es nun erheblich leichter geworden ist, Softwaremodule anderer Programmiersysteme (etwa die Libraries eines C Compilers) in FORTH Programme einzubinden. Und dies ist für professionelle Programmentwicklung mitunter unentbehrlich.

In anderen Bereichen konnte man sich allerdings nur halbherzig entschließen, vertraute Konzepte über Bord zu werfen. Heute wie vor zehn Jahren wird der zur Verfügung stehende Massenspeicher in Blöcken organisiert. Ein Block hat einen Umfang von 1024 Bytes. Der gesamte Quellkode eines Anwenderprogramms wird in solchen Blöcken auf Diskette gespeichert. Dieses Konzept stammt noch aus jenen Tagen, in denen Speicher teuer waren und FORTH daher sein eigenes Betriebssystem mitbrachte. Aufgrund der etwas eigenwilligen Speicherkonzeption von FORTH ist es nicht so ohne weiteres möglich, Quellkode zu verarbeiten, der beispielsweise mit einem Textverarbeitungsprogramm erstellt wurde. Die Entwickler von 4xFORTH haben Abhilfe geschaffen, indem sie wahlweise auch die Verarbeitung solcher „Streamfiles" ermöglichen und zusätzlich einen Editor zur Verfügung stellen, der sich nicht an dem etwas antiquierten Blockkonzept orientiert.

4xFORTH arbeitet sehr schnell. Wem die Ausführungsgeschwindigkeit allerdings immer noch nicht ausreicht, der kann besonders zeitkritische Programmteile direkt in Maschinenkode schreiben. Zu solchen zeitkritischen Programmen gehören neben der Steuerung und Auswertung von Präzisionsinstrumenten in der Industrie sicher Grafikwörter (etwa zur Erzeugung von 3-D-Grafiken oder den neuerdings recht beliebten Fraktalen). Aber auch komplexere Arithmetikoperationen (z. B. Matrizenberechnungen) lassen sich vorteilhafter in Maschinenkode definieren. Dazu steht dem Anwender ein kleiner In-Line-Assembler zur Verfügung. Wer aber bereits glaubte, die Assemblermnemonics im Schlaf zu beherrschen, wird noch einmal umlernen müssen. Denn zum einen kommt die FORTH typische, umgekehrt Polnische Notation auch bei der Assemblerprogrammierung zur Anwendung, und zum anderen ist die Implementation des Assemblers den 4xFORTH Entwicklern nicht besonders gut gelungen. So wird beispielsweise aus der Assembleranweisung MOVE.W DO, Dl in 4xFORTH '0 DR l DR MOVE.W.' Wenn dies auch noch zu akzeptieren wäre, wird es bei der folgenden Assembleranweisung 'LINK A6,#$-4' schon schwieriger, der in 4xFORTH der Folge '-46 LINK' entspricht. Gerade für einen Anfänger, der sich ein wenig mit dem Standardsmnemonics zurecht gefunden hat, ist die Umstellung nicht ganz einfach, und auch für den erfahrenen Assemblerprogrammierer stellt die ungewohnte Schreibweise am Anfang eine Quelle ständigen Ärgernisses dar. Daß es auch anders geht, beweisen schließlich die hervorragenden Implementationen des LMI FORTH oder des ST-FORTHs. Auch das ansonsten recht ausführliche und gut lesbare Handbuch hilft in diesem Punkt leider nur wenig weiter. Hilfreicher ist dagegen ein auf der Diskette enthaltener Textfile 'ASM.EXM', auf welchem die wichtigsten Anweisungen des Motorola Standards Assemblers den entsprechenden 4xFORTH Anweisungen gegenübergestellt sind. Positiv ist vielleicht noch die Tatsache zu vermerken, daß es möglich ist, den Assembler, ebenso wie den Editor, aus dem System zu verbannen und gegebenenfalls durch eine bessere Version auszutauschen.

Benchmark Tabelle

Benchmark für 10 Durchläufe des Siebs des Eratosthanes (ein Primzahlenprogramm, welches alle Primzahlen bis 8192 ermittelt):

IBM PC     ABasic (Auflösung 200x300)   1932 sec.
MAC        MacFORTH                     20,5 sec.
AMIGA      ABasic (Auflösung 200x300)    880 sec.
C64        LMI FORTH                     267 sec.
ATARI ST   ST-BASIC                     1080 sec.
ATARI ST   4xFORTH Vers. 2.0            19,9 sec.
ATARI ST   4xFORTH Vers. 3.0            11,1 sec.

Noch ein paar Worte zum einen Kapitel, das in den wenigsten Testberichten Erwähnung findet, obwohl ihm beinahe eine ebenso große Bedeutung zukommt, wie dem Programm selber. Die Rede ist von der Anwenderunterstützung. Hier muß man der Dragon Group bescheinigen, daß sie sich beinahe vorbildlich verhält und dem 4xFORTH Anwender Unterstützung bietet, die weit über den Kauf hinausgeht. Deshalb ist es jedem Benutzer zu empfehlen, die im Handbuch beigelegte Registrierkarte an die Dragon Group zu schicken. Das Porto für die Briefmarke macht sich spätestens dann bezahlt, wenn eines Morgens eine Diskette mit dem neuesten Update im Briefkasten liegt, die jedem Benutzer kostenlos (!) zugestellt wird. Darüber-hinaus wird jeder registrierte Benutzer automatisch Mitglied in der unabhängigen 4xFORTH User Group und kommt so in den Genuß der ca. alle 4-6 Wochen erscheinenden Newsletters. Über Softwarepiraterie ist viel geschrieben worden. Ein Weg, die Attraktivität eines Softwareproduktes (insbesondere eines nicht kopiergeschützten) zu erhöhen und gleichzeitig Raubkopierern das Geschäft zu verderben, ist zweifelsohne, Unterstützung zu bieten, die über den Kauf hinausgeht. Hieran könnte sich auch so manches große Softwarehaus ein Beispiel nehmen.

Fazit:

4xFORTH 3.0 stellt sich als ein kompaktes Programmentwicklungssystem dar, welches die Möglichkeiten des ST effektiv ausnützt. Beeindruckend ist vor allem die hohe Verarbeitungsgeschwindigkeit, die sich sicher noch weiter steigern liese, und mit der sich 4xFORTH 3.0 deutlich von Konkurenzprodukten abhebt. Trotz einiger kleiner Mängel erhält man ein System, welches kaum noch Wünsche offen läßt. Ein leistungsfähiges, dem IEEE Standard entsprechendes Flieskommapaket (vielleicht sollte noch einmal erwähnt werden, daß FORTH von Haus aus nur mit Integerarithmetik arbeitet) ist seit langem angekündigt und wird registrierten Benutzern kostenlos zugeschickt werden. Mit den bereits vorhandenen bzw. noch angekündigten Erweiterungen (z. B. in Richtung auf Multi User Betrieb in einem Netzwerk) läßt sich 4xFORTH ohne weiteres zu einem System ausbauen, welches professionellen Anforderungen entspricht. Die Qualität von 4xFORTH wird auch dadurch bewiesen, daß bereits mehrere kommerzielle Applikationen für den ST mit Hilfe von 4xFORTH erstellt worden sind. Darunter ST-Talk, ein Kommunikationsprogramm, und sogar ein BASIC für den ST wurden vollständig in 4xFORTH geschrieben.

Abb. 3: Ein Mini „Datenbankprogramm" in FORTH zur Abspeicherung von max 25 Namen, die bis zu 80 Zeichen lang sein können:

CREATE NAMENSFELD 2000 ALLOT Erzeugen des benötigten Arbeitsspeichers  
: INPUTNAME (n -)  
." ?"-80 * NAMENSFELD + DUP 1+ 79 EXPECT SWAP SPAN W SWAP !   
." Name gespeichert" ;  
: PRINTNAME (n -)   
80 * NAMENSFELD + COUNT - TRAILING TYPE ;

n gibt beide Male die Nummer des Namens in der Liste an.

Ein Beispiel:

l INPUTNAME <CR> ? HUBER,KARL <CR> ." Name abgespeichert"  
l PRINTNAME <CR> HUBER,KARL <CR>

Um die Tabelle auf Diskette abspeichern zu können, muß zunächst ein File kreiert und und eröffnet werden:

143 LOAD FCLOSE SFILE NAME NAMEN.TXT" NAME 0 2 FCREATE l NAME 2 FOPEN NAMENSFELD 25 80 * l READ/WRITE FCLOSE / Laden der Diskutility / Schließen des FORTH Files / Festlegen des Filenamens / Anlegen des Files / Öffnen des Files / Startadresse des Feldes / Länge des Feldes / Abspeichern des Feldes / Schließen des Files

Das wäre alles. Um nun die abgespeicherten Daten wiederzuerhalten, muß zunächst der File wiedereröffnet werden:

l NAME 2 FOPEN

Mit

NAMENSFELD 25 80 * 0 READ/WRITE

werden die ersten 2000 Bytes aus dem File in das Feld NAMENSFELD gelesen, wovon man sich beispielsweise durch Ausgabe des Feldes mit

NAMENSFELD 2000 TYPE

überzeugen kann. Das Diskettenhandling ist d . ch die Verwendung von Kanalnummern zwar ein wenig umständlich, für einfachere Anwendungen reicht es allerdings vollkommen aus.

Positiv:

Negativ:



Aus: ST-Computer 12 / 1986, Seite 20

Links

Copyright-Bestimmungen: siehe Über diese Seite