# Forth (Programmiersprache)

Forth ist eine imperative, stackbasierte Programmiersprache in umgekehrter polnischer Notation (UPN), der Postfixnotation. 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

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 Programmiersprache 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.
Die Eigentümlichkeit einer umfassenden Lösung aus Programmiersprache und Betriebssystem lässt sich gut aus der Entstehungsgeschichte 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.
Die Vorgehensweise einer sogenannten „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

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 kleiner Satz Register, die gegebenenfalls unabhängig von der Hardware simuliert werden, und das Dictionary, 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 Lochkarte­nstapel 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

Die Programmierung in Forth unterscheidet sich grundlegend von anderen Sprachen. In Forth gibt es keinen Unterschied zwischen integrierten und programmierten Funktionen (sog. Wörtern), wohl aber einen funktionalen Kern von Wörtern (Primitiva), die direkt in Maschinencode implementiert sind. 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 nur mit wenigen anderen Hochsprachen zu erreichen ist.

### Beispiel eines UPN-Ausdrucks

Für die Berechnung des Ausdrucks (5 + 3) * (7 + 2) wird in Forth die folgende Sequenz eingegeben:
Die Verarbeitung des Ausdrucks erfolgt bereits beim Lesen. Der Eingabestring wird von Leerzeichen in Wörter unterteilt. Das Wort „5“ ist normalerweise nicht im Wörterbuch vorhanden, es wird als Zahl interpretiert, das heißt, ihr Wert (hier 5) wird 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 entfernt 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 und im Wörterbuch gefunden; die zugehörige Funktion nimmt die beiden obersten Werte 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.

### Beispiel π

Die Kreiszahl Pi kann wie folgt verwendet werden:
10340 355 113 */ . → 32484
: *Pi 355 113 */ ;
10340 *Pi . → 32484
Die Näherung 355÷113 hat eine Genauigkeit von 7 Dezimalstellen.

### Online Forth Interpreter

Obige Beispiele können hier interaktiv ausprobiert werden.

### Wörter für Stack-Operationen

| Befehl | Stack | Stack | 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 |

### Implementierung und Hardwareschnittstelle

Beispiel fig-FORTH auf der 6502:
Es werden nur folgende vier Routinen benötigt
| Name | Stack | Stack | Stack | Beschreibung |
| (KEY) | | → | n1 | liest ein Zeichen von der Tastatur |
| (EMIT) | n1 | → | | gibt ein (Steuer-)Zeichen aus |
| (?TERMINAL) | | → | n1 | Test, ob eine Taste oder BREAK gedrückt ist |
| (CR) | | → | | gibt einen Zeilenumbruch aus (Carriage Return/Line Feed) |
Eine Anbindung an einen Massenspeicher kann optional eingerichtet werden, entweder zu einem realen, physikalischen Gerät oder virtuell im Hauptspeicher.

## Anwendungen

Forth ist im Gegensatz zu Assembler eine Hochsprache, die trotzdem hardwarenah und damit sehr schnell ausgeführt wird. Die Ausbaufähigkeit ist ein Grundprinzip von Forth; es müssen ohnehin die allermeisten Funktionen selbst programmiert werden. Es existieren mit dem RTX2010 sogar Chipsätze für Raumfahrt-Anwendungen, auf denen Forth direkt ausgeführt werden kann.
Forth eignet sich gut für die interaktive Entwicklung von Steuerungssystemen, wobei das Ergebnis der Lesbarkeit von Pseudocode nahekommen kann:
* Ventil öffnen
* Alarm einschalten
* Türen verriegeln
* 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. Mit einem Einsatz auf der Raumsonde Galileo war Forth 1989 eine der ersten Hochsprachen im Weltraum, bis dahin waren für solche Systeme überwiegend Assembler-Sprachen üblich. Auch die Raumsonde Philae, bekannt durch die Landung auf einem Kometen 2014, war in Forth programmiert.

## Forth-Implementierungen und abgeleitete Sprachen

Die Portierung von Forth auf den Apple II führte in den 1970er Jahren der Programmierer John T. Draper durch, damit entwickelte er die Textverarbeitung EasyWriter. Eine grafikfähige Erweiterung von Forth für den Apple II war GraFORTH. ASYST war eine Erweiterung von Forth zum Messen, Steuern und Regeln für PCs.
Factor ist eine auf Forth aufbauende Programmiersprache, die sich jedoch stärker an die Anwendungsentwicklung orientiert als an der maschinennahen Funktionalität von Forth. Eine neuere 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.
* 4tH Implementierung von Hans Bezemer, multiplattform
* amforth – für den Atmel-ATMega-Mikrocontroller (GPL)
* myforth für 8051 chips – Tethered Forth
* myforth für arduino
* C-128-Forth – 1986 vom westdeutschen Holtkötter-Verlag veröffentlichter Forth-Dialekt für den 8-Bit-Heimcomputer Commodore 128
* Fusion-Forth für den Atari ST
* kForth-32 – kleiner Forth-Interpreter, in C++ geschrieben (x86, 32-Bit)
* 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
* STOIC – von Jonathan Sachs für Minirechner entwickelt und später auf CP/M portiert.
* volksFORTH – ein System der Forth Gesellschaft e. V.
* Win32Forth – Public Domain/LGPL, für Windows (32 Bit)
* Delta Forth .NET – Forth Compiler für die .NET-Plattform
* 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 und 64 Bit)
* VFX Forth – professioneller, plattformübergreifender Forth Compiler
* RetroForth – für DOS, Linux, FreeBSD, Windows oder standalone
* pForth – PD portables Forth in 'C' für eingebettete Systeme oder Desktops
* DurexForth – modernes OpenSource Forth für den C64; ein Diskettenimage der jeweils aktuellen Version bekommt man hier.
* JForth – Demo für Amiga
* fig-FORTH