Forth ist eine interpretierte Programmiersprache, die als Kern einen interaktiven Bytecode-Compiler besitzt. Forth ist dabei zugleich ein Betriebssystem zum Ablauf und eine Entwicklungsumgebung zur Erstellung von Forth-Programmen. Daher nennt man ein tatsächlich implementiertes Forth auf einem Rechner ein Forth-System.
Entstehungsgeschichte
Charles H. Moore entwickelte Forth in den Jahren vor 1969 aus einem selbstgeschriebenen Mini-Interpreter. Dieser Interpreter enthielt bereits viele Features der späteren Programmiersprache, war aber auf ein darunterliegendes Betriebssystem angewiesen. Moore benutzte ihn als Makrosprache für Programme, die er in Fortran, Algol, PL/I und Assembler schrieb. Die Computertechnik dieser Zeit veränderte sich gerade von Großcomputern, die im Batchbetrieb arbeiteten hin zu Minicomputern, die auch interaktives Arbeiten zuließen. 1968 schrieb Moore neben seiner eigentlichen Arbeit für einen IBM 1130-Minicomputer schließlich ein Schachprogramm, dass er zuvor in Algol implementiert hatte, in seine Interpretersprache um. Das Schachprogramm war dadurch deutlich einfacher zu implementieren und Moore nannte seine Sprache nun das erste mal FORTH.
Die Eigentümlichkeit einer umfassenden Lösung aus Programmiersprache und Betriebssystem lässt sich gut aus der Entstehungsgeschichte[1] heraus erklären. Moore hatte zur Steuerung des Teleskops einer Sternwarte einen Rechner ohne Software gekauft. Er hatte sich vorgenommen, alle notwendigen Komponenten selbst zu programmieren, die für eine (komfortable) Programmierung und den (komfortablen) Betrieb des Rechners notwendig sind. Hierzu gehören ein Betriebssystem, eine Hochsprache und eine Entwicklungsumgebung. All diese Komponenten wurden innerhalb eines einzelnen Programms verwirklicht – dem Forth-System.
Die Vorgehensweise einer so genannten „All-in-One-Lösung“ ist jedoch ein Sonderweg von Forth geblieben. Selbst Programmiersprachen wie Smalltalk oder Self gehen (in der Regel) nicht so weit, auch das Betriebssystem zu ersetzen. Obwohl dies möglich wäre, wünscht man sich meist Portabilität. Auch die Programmiersprache Oberon, die im Rahmen des Ceres-Systems entwickelt wurde, ist unabhängig von diesem erhältlich. Normalerweise werden die oben genannten Komponenten getrennt voneinander konzipiert und entwickelt.
Forth-System
Ein vollständiges Forth-System kann in wenigen Kilobyte Hauptspeicher implementiert werden. Diese Eigenschaft war zur Zeit der Entstehung außerordentlich wichtig, da die Rechner damals nur sehr wenig RAM zur Verfügung hatten. Außerdem ist der eigentliche Kern des Forth-Systems, der in der jeweiligen Maschinensprache des Computers geschrieben sein muss, sehr klein, der Rest des Systems ist bereits selbst in Forth implementiert. Eine Portierung des Forth-Kerns auf andere Prozessoren ist dadurch sehr einfach möglich. Forth-Anwenderprogramme müssen hingegen nicht einmal neu kompiliert werden, der Bytecode ist unverändert auf jedem Forth-System ausführbar. Diese positive Eigenschaft hat Forth in den 1970er Jahren eine relativ große Verbreitung beschert.
Heutzutage macht dies Forth zu einer interessanten Hochsprache für verschiedenste Mikrocontroller. Zur Entwicklung werden nun aber kombinierte Systeme benutzt, bei denen der Bytecode auf einem PC vorkompiliert und lediglich das Ergebnis im Mikrocontroller abgelegt wird. Dadurch können einige interaktive Funktionen des Forth-Systems entfallen und der Quellcode kann intensiv kommentiert werden.
Das Forth-System ist als virtuelle Maschine realisiert. Die wesentlichen Datenstrukturen sind in Forth die beiden Stapel (Value-Stack und Return-Stack) und das Dictionary, eine Sprungtabelle, die die Bytecode-Token mit den aufzurufenen Funktionen verknüpft. Alle Anweisungen und mathematischen Ausdrücke werden in Forth in der umgekehrten polnischen Notation (UPN) formuliert. Dies ergibt sich einfach daraus, dass das Forth-System für jeden Eingabewert zunächst prüft, ob dieser im Dictionary vorhanden ist. Ist dies der Fall, wird die entsprechende Funktion aufgerufen, die dann auf alle bisher getätigten Eingaben zugreifen kann. Wenn der Wert nicht im Dictionary vorhanden ist, wird er als Zahlenwert oder Zeichenkette interpretiert. Nachfolgende Eingaben sind in beiden Fällen zu diesem Zeitpunkt noch nicht gelesen und haben daher auf den Programmablauf noch keine Auswirkung. Man kann daher den Eingabedatenstrom auch sehr leicht durch ein sequentielles Medium, z.B. einen Lochkartenstapel oder ein Magnetband realisieren. Auch dies hat mit der Entstehung von Forth zu tun.
Forth hat zwei wesentliche Eigenschaften, die es von vielen anderen Programmiersystemen seiner Zeit unterscheiden:
- Forth war von Beginn an Open Source
- Forth erlaubt dem Anwender Zugriff auf den Compiler; dadurch können beliebige eigene Datenstrukturen implementiert werden
Beispiel eines UPN Ausdrucks
Für die Berechnung des Ausdrucks (5 + 3) * (7 + 2)
wird in Forth die folgende Sequenz eingegeben:
5 3 + 7 2 + * .
Die Verarbeitung des Ausdrucks erfolgt bereits beim Lesen. Der Eingabestring wird von Leerzeichen in Worte unterteilt. Das Wort „5“ ist normalerweise nicht im Wörterbuch vorhanden, es wird als Zahl interpretiert, der entsprechende Wert auf den Value-Stack gelegt. Gleiches gilt für das Wort „3“. Das nun folgende Wort „+“ ist hingegen im Wörterbuch vorhanden. Es wird daher die entsprechende Funktion aufgerufen. Diese Funktion nimmt die obersten beiden Werte vom Stapel, addiert sie und legt das Ergebnis zurück auf den Stapel. Die kleine „+“-Funktion ist üblicherweise in der jeweiligen Maschinensprache realisiert. Auf dem Stapel liegt nun die Zahl 8. Das nächste Wort ist „7“, es wird die Zahl 7 auf den Stapel gelegt. Danach folgt das Wort „2“, hier landet die Zahl 2 auf dem Stapel. Als nächstes wieder das Wort „+“, wodurch erneut die Additionsfunktion aufgerufen wird. auf dem Stapel liegt nun zuoberst die Zahl 9, darunter die Zahl 8. Danach wird das Wort „*“ gelesen, das im Wörterbuch mit der Multiplikationsfunktion verknüpft ist. Diese Funktion nimmt die beiden obersten Zahlen vom Stapel und legt ihr Produkt darauf. Die Multiplikationsfunktion kann je nach Forth-System als Maschinencode oder ihrerseits bereits in Forth implementiert sein. Das nächste gelesene Wort ist nun „.“. Dieses Wort nimmt den obersten Wert (nun die Zahl 72) vom Stapel und gibt ihn auf dem Anzeigegerät aus.
Wörter für Stack-Operationen
Befehl | Stack | Beschreibung | ||
---|---|---|---|---|
DUP | n1 n2 | → | n1 n2 n2 | dupliziert das oberste Stack-Element |
SWAP | n1 n2 n3 | → | n1 n3 n2 | vertauscht die obersten beiden Stack-Elemente |
ROT | n1 n2 n3 n4 | → | n1 n3 n4 n2 | holt das dritte Stack-Elemente nach oben |
OVER | n1 n2 n3 | → | n1 n2 n3 n2 | kopiert das zweite Stack-Element |
PICK | n1 n2 n3 2 | → | n1 n2 n3 n1 | kopiert das angegebene (hier: 2 entspr. dritte) Stack-Element |
DROP | n1 n2 n3 n4 | → | n1 n2 n3 | entfernt das oberste Stack-Element |
Forth eignet sich für das interaktive Entwickeln von Steuerungssystemen. Da sind dann Programmpassagen möglich wie:
- Ventil öffnen
- Hupe einschalten
- usw.
Die frühesten bekannten Anwendungen waren Steuerungen für Observatorien, denn die eingangs genannte Teleskopsteuerung wurde von vielen anderen Observatorien übernommen.
Forth-Implementierungen und abgeleitete Sprachen
Factor ist eine auf Forth aufbauende Programmiersprache, die sich jedoch stärker an die Anwendungs-Entwicklung orientiert als an der Low-Level-Funktionalität von Forth. Eine moderne Anwendung für Forth ist das Konzept der Open Firmware (IEEE-1275).
- amrFORTH — 8051 Tethered Forth für Windows/OSX/Linux/*BSD
- Reva — Pentium (Linux und Windows)
- pbForth — für den Hitachi H8 in LEGO Mindstorms Robotics Invention System als Alternative
- PFE — Portable Forth Environment
- Gforth — GNU Forth Language Environment
- bigFORTH — x86 native code Forth mit MINOS GUI
- kForth — Kleiner Forth-Interpreter, in C++ geschrieben
- SP-Forth (SPF) — OpenSource Forth für Win32
- Informationen über Forth für 8-bit Home-Computer (Atari, Apple, ZX-80, …)
- RetroForth — Public Domain, für DOS, Linux, FreeBSD, Windows oder standalone -- hat ein wiki
- pForth — PD portables Forth in 'C' für Embedded Systeme oder Desktops.
- PostScript — Seitenbeschreibungssprache von Adobe
- herkforth — Ein colorForth für Linux/PPC
- Computer Intelligence Forth — ein in Assembler geschriebenes ISO-Forth
- eForth von C.H.Ting
- Mops — Ein objektorientierter Forth-Dialekt für den Apple-Macintosh, basiert auf dem früher kommerziellen Neon
- GraFORTH — Forth für den Apple ][ mit AV Primitiven (ShrinkIt archive)
- Win32Forth — Forth für Microsoft Windows 95/2000/XP
- MVP Forth Quelltext verfügbar, von Mountain View Press
- colorForth für den PC, Floppy-Image-Extracter/Source-Reader.
- amforth für den Atmel ATMega-Mikrocontroller (GPL).
- Holon — eine Forth-basierte integrierte Entwicklungsumgebung.
- SwiftFORTH und SwiftX — professionelles FORTH für PC und Mikrocontroller
Weblinks
- Forth-Gesellschaft e.V. (Deutschland)
- Instant Programming Tool Holonforth
- ROBOprogy — Spielzeugroboter mit Forth programmieren
- Chuck Moore's colorForth, VLSI design tools and 25x Forth Multicomputer chip
- Forth - die etwas andere Programmiersprache
- http://www.intellasys.net/ Forth-Hardware