- Forth (Informatik)
-
Forth Paradigmen: stapelorientiert Erscheinungsjahr: ca. 1970 Entwickler: Charles H. Moore Typisierung: typenlos Dialekte: FORTH-79, FORTH-83, ANS FORTH,
Open FirmwareEinflüsse: Burroughs large systems, Lisp, APL, Assembler Beeinflusste: Factor, PostScript, RPL, REBOL Forth ist eine Programmiersprache, die als Kern einen interaktiven Bytecode-Compiler besitzt. Forth bildet 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. Viele Implementationen generieren heute, so wie in anderen Programmiersprachen auch, hochoptimierten Maschinencode.
Inhaltsverzeichnis
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, das 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 11-Meter-Radioteleskops des National Radio Astronomy Observatory (NRAO) auf dem Kitt Peak in Arizona zwei Honeywell-Rechner ohne geeignete Software zur Verfügung, einen 16 kB DDP-116 und einen 32 kB H316. Er hatte sich vorgenommen, alle notwendigen Komponenten selbst zu programmieren, die für eine komfortable Programmierung und den sicheren Betrieb der Rechner notwendig sind. Hierzu gehören ein Betriebssystem, eine Hochsprache und eine Entwicklungsumgebung. All diese Komponenten wurden innerhalb eines einzelnen Programms verwirklicht – dem Forth-System. Beide Computer waren für die Steuerung des Teleskops und seiner wissenschaftlichen Instrumente verantwortlich, sie überwachten die Positionierung und die Nachführung, das Sammeln und Aufzeichnen der Daten auf Magnetband, und unterstützten ein interaktives Grafikterminal auf dem die Astronomen die aufgezeichneten Daten analysieren konnten. Der Multitasking-Charakter des Systems erlaubte den gleichzeitigen Ablauf dieser Funktionen, ohne dass dabei Störungen oder Laufzeitkonflikte auftraten. Insgesamt funktionierte das System so gut, dass Astronomen aus der ganzen Welt sich dafür interessierten und eine Kopie haben wollten. Seine Anwendung verbreitete sich schnell, und 1976 war Forth als Standardsprache durch die Internationale Astronomische Union angenommen.
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 aufzurufenden 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, zum Beispiel 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
Programmierung in Forth
Die Programmierung in Forth unterscheidet sich grundlegend von anderen Sprachen. In Forth gibt es keinen Unterschied zwischen eingebauten Funktionen (=Wörtern) und programmierten Funktionen. In Forth laufen keine Programme ab, es wird stattdessen die Sprache um Wörter erweitert. Der Start eines Programms entspricht in Forth dem Aufruf eines Wortes, das quasi die Hauptroutine des Programms darstellt. Da sich so auch der Compiler erweitern lässt, indem man Wörter schreibt, die zur Compilezeit ablaufen und direkt den Bytecode manipulieren, führt das zu einer Flexibilität, die mit keiner anderen Hochsprache erreichbar ist.
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-Element 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).
Eine Weiterentwicklung von Forth ist InterPress von Xerox, woraus sich wiederum die Seitenbeschreibungssprache Adobe PostScript entwickelte. Das später ebenfalls von Adobe entwickelte PDF lehnt sich zwar stark an PostScript an (und könnte somit als Urenkel von Forth angesehen werden), ist jedoch im Gegensatz zu PostScript und Forth keine vollständige Programmiersprache.
- amforth für den Atmel-ATMega-Mikrocontroller (GPL)
- amrFORTH – 8051 Tethered Forth für Windows/OSX/Linux/*BSD
- kForth – Kleiner Forth-Interpreter, in C++ geschrieben
- PropForth für den Parallax-Propeller-Mikrocontroller
- RPL - die Programmiersprache der HP48/49-Taschenrechner
- GraFORTH – Forth für den Apple ][ mit AV Primitiven (ShrinkIt archive)
- herkforth – Ein colorForth für Linux/PPC
- Computer Intelligence Forth – ein in Assembler geschriebenes ISO-Forth
- PFE – Portable Forth Environment
- Mops – Ein objektorientierter Forth-Dialekt für den Apple-Macintosh, basiert auf dem früher kommerziellen Neon
- Reva – Pentium (Linux und Windows)
- SP-Forth (SPF) – OpenSource Forth für Win32
- MVP Forth Quelltext verfügbar, von Mountain View Press
- volksFORTH – ein System der Forth Gesellschaft e.V.
- Win32Forth – Forth für Microsoft Windows 95/2000/XP
- Delta Forth .NET – Forth Compiler für die .NET Plattform
- eForth von C.H.Ting
- SwiftFORTH und SwiftX – professionelles FORTH für PC und Mikrocontroller
- pbForth – für den Hitachi H8 in LEGO Mindstorms Robotics Invention System als Alternative
- Holon – eine Forth-basierte integrierte Entwicklungsumgebung
- colorForth für den PC, Floppy-Image-Extracter/Source-Reader.
- bigFORTH – x86 native code Forth mit MINOS GUI
- Gforth – GNU Forth Language Environment
- VFX Forth - professioneller, plattformübergreifender Forth Compiler
- 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.
Siehe auch
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
- Forth-Hardware
- Forth – Audiocast bei Hackerfunk.ch, Zürich
- Starting FORTH by Leo Brodie
- Thinking Forth Project
Quellen
Wikimedia Foundation.