Forth (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Forth
Paradigmen: stapelorientiert
Erscheinungsjahr: ca. 1970
Entwickler: Charles H. Moore
Typisierung: typenlos
Dialekte: FORTH-79, FORTH-83, ANS FORTH
Beeinflusst von: Burroughs large systems, Lisp, APL, Assembler
Beeinflusste: Factor, PostScript, RPL, REBOL

Forth ist eine imperative, stackbasierte Programmiersprache. Ein Forth-System beinhaltet 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 Versionen generieren heute, so wie in anderen Programmiersprachen auch, hochoptimierten Maschinencode.

Entstehungsgeschichte[Bearbeiten]

Charles H. Moore entwickelte Forth in den Jahren vor 1969 aus einem selbstgeschriebenen Mini-Interpreter. Dieser Interpreter enthielt bereits viele Eigenschaften 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 kodiert hatte, in seine Interpretersprache um. Das Schachprogramm war dadurch deutlich einfacher zu portieren und Moore nannte seine Sprache nun das erste Mal FORTH. Ursprünglich sollte die Sprache FOURTH heißen, weil sie eigentlich für die Computer der vierten Generation vorgesehen war, welche erwartungsgemäß als Mikrocomputer vertrieben wurden. Das Betriebssystem, auf dem Moore programmierte, ließ jedoch nur Dateinamen mit einer Länge von fünf Buchstaben zu, weshalb er sich für das Homophon FORTH entschied.[1]

Die Eigentümlichkeit einer umfassenden Lösung aus Programmiersprache und Betriebssystem lässt sich gut aus der Entstehungsgeschichte[2] 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 (Tektronix 4002A) auf dem die Astronomen die aufgezeichneten Daten analysieren und als Hardcopy ausdrucken 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.

Populäre Bücher über Forth aus der Zeit des ZX81 und des Spectrum

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. Ähnlich wie Forth hatte nur noch das Programmiersprache/Betriebssystem-Paket EUMEL und ELAN verfahren. Normalerweise werden die oben genannten Komponenten getrennt voneinander konzipiert und entwickelt.

Forth-System[Bearbeiten]

Ein vollständiges Forth-System kann bereits mit wenigen Kilobyte Speicherbelegung realisiert werden. Diese Eigenschaft war zur Zeit der Entstehung außerordentlich wichtig, da die Rechner damals verhältnismäßig wenig RAM zur Verfügung hatten. Außerdem ist der eigentliche Kern des Forth-Systems sehr klein und der Rest des Systems bereits selbst in Forth definiert. Eine Portierung des Forth-Systems auf andere Prozessoren ist dadurch erheblich einfacher. Diese positive Eigenschaft hat Forth in den späten 1970er Jahren eine relativ große Verbreitung beschert.

Heute macht dies Forth zu einer Hochsprache, die besonders zur Programmierung verschiedenster Mikrocontroller geeignet ist. Zur Entwicklung werden dabei aber kombinierte Systeme benutzt, bei denen der Zwischencode auf einem Host-PC vorkompiliert und lediglich das Ergebnis im Mikrocontroller des Clients abgelegt wird. Dadurch können einige interaktive Funktionen des Forth-Systems entfallen und der Quellcode kann dabei umfassender kommentiert werden.

Die wesentlichen Elemente der internen Forth-Architektur sind die beiden Stapel (Data-Stack und Return-Stack), ein Satz Register und das Dictionary, welche unabhängig von der Hardware simuliert werden und eine Sprungtabelle, die den Token mit der jeweils aufzurufenden Funktion verknüpft. Das auf dem Stapel abgelegte Datenwort wird als Zelle bezeichnet, wobei diese 16, 32 oder 64 Bit groß sein kann. Überdies kann das Dictionary in mehrere Vocabularies nach Bedarf aufgeteilt werden. Das Forth-System selbst ist als virtuelle Maschine realisiert. Alle Anweisungen und mathematischen Ausdrücke werden in umgekehrter polnischer 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 eingelesen und haben daher auf den Programmablauf noch keine Auswirkung. Man kann daher auch, wie zum Zeitpunkt der Entstehung üblich, den Eingabedatenstrom leicht durch ein sequentielles Medium, wie z. B. einen Lochkartenstapel oder ein Magnetband, realisieren.

Forth hat zwei wesentliche Eigenschaften, die es von vielen anderen Programmiersystemen seiner Zeit unterscheiden:

  • Forth war von Beginn an Public Domain
  • Forth ist selbstkompilierend und erlaubt dabei dem Anwender direkten Zugriff auf den Compiler, wodurch die Befehlsstruktur beliebig erweitert werden kann

Programmierung in Forth[Bearbeiten]

Die Programmierung in Forth unterscheidet sich grundlegend von anderen Sprachen. In Forth gibt es keinen Unterschied zwischen integrierten und programmierten Funktionen (s. g. Wörtern). Es laufen auch keine unmittelbaren Routinen ab, stattdessen wird die Sprache um zusätzliche Wörter erweitert. Der Start eines Programms entspricht in Forth dem Aufruf eines Wortes, das somit die Hauptroutine des Programms darstellt. Da auch der Compiler dadurch erweitert wird, indem man Wörter definiert, die in der Entwicklungsumgebung ablaufen und damit den Zwischencode unmittelbar manipulieren, führt das zu einer Flexibilität, die mit keiner anderen Hochsprache bisher erreicht wurde.

Beispiel eines UPN-Ausdrucks[Bearbeiten]

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[Bearbeiten]

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 die interaktive Entwicklung von Steuerungssystemen, die verschiedene Abläufe ermöglichen, wie:

  1. Ventil öffnen
  2. Alarm einschalten
  3. Türen verriegeln
  4. usw.

Die frühesten bekannten Anwendungen waren Steuerungen für Radioteleskope und Observatorien für Astronomie und Raumfahrt, andere Anwendungen im technisch-wissenschaftlichen Bereich kamen erst später hinzu.

Forth-Implementierungen und abgeleitete Sprachen[Bearbeiten]

Die Portierung von Forth auf den Apple II-Personal Computer führte in den 1970er Jahren der Programmierer John T. Draper durch, damit entwickelte er die Textverarbeitung EasyWriter. Eine graphikfähige Erweiterung von Forth für den Apple II war GraFORTH.[3] ASYST war eine Erweiterung von Forth zum Messen, Steuern und Regeln für PCs.[4]

Factor ist eine auf Forth aufbauende Programmiersprache, die sich jedoch stärker an die Anwendungsentwicklung 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
  • Reverse Polish LISP (RPL) - für HP48/49-Taschenrechner
  • herkforth – ein colorForth für Linux/PPC
  • Computer Intelligence Forth – ein in Assembler geschriebenes ISO-Forth
  • PFE – Portable Forth Environment
  • Mops – eine Entwicklungsumgebung für den Apple-Macintosh, basierend auf Forth
  • Reva – für x86-Prozessoren (32 Bit, multiplattformfähig)
  • SP-Forth – OpenSource Forth für Win32 u. Linux
  • MVP Forth - Quelltext verfügbar, von Mountain View Press
  • volksFORTH – ein System der Forth Gesellschaft e.V.
  • Win32Forth – Public Domain, für Windows (32 Bit)
  • Delta Forth .NET – Forth Compiler für die .NET Plattform
  • eForth - Lernsystem für Informatik
  • SwiftFORTH und SwiftX – professionelles FORTH für PC und Mikrocontroller
  • iForth - Shareware, multiplattformfähiger Compiler für 32 u. 64 Bit
  • colorForth - für den PC, Floppy-Image-Extracter/Source-Reader.
  • bigFORTH – x86 native code Forth mit MINOS GUI
  • Gforth – GNU Forth, multiplattformfähiger Interpreter (32 Bit)
  • VFX Forth - professioneller, plattformübergreifender Forth Compiler
  • RetroForth – Public Domain, für DOS, Linux, FreeBSD, Windows oder standalone
  • pForth – PD portables Forth in 'C' für Embedded Systeme oder Desktops.
  • jonesforth - Minimaler Forth-Compiler und Tutorial

Siehe auch[Bearbeiten]

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. Charles Moore: Forth - The Early Years. 1991, abgerufen am 29. Januar 2012.
  2. Entstehungsgeschichte von Forth
  3. GraFORTH II Langauge Reference (PDF; 4,5 MB)
  4. Campbell et al, "Up and Running with Asyst 2.0", MacMillan Software Co., 1987