Forth (Programmiersprache)

Weiter
Paradigma Prozedural, stapelorientiert, reflektierend, übereinstimmend
Entworfen von Charles H. Moore
Erstmals erschienen 1970; Vor 52 Jahren
Disziplin tippen Typeless
Dateiname -Erweiterungen .fs, .fth, .4th, .f, .Forth
Webseite fortstandard.org
Haupt Implementierungen
Swiftforth (Forth, Inc.)
Gforth (GNU -Projekt)
VFX Forth (Mikroprozessor -Engineering)
Beeinflusst
Faktor, Freude, PostScript, Rpl, Rebol

Weiter ist ein prozedural, stapelorientiert Programmiersprache und interaktive Umgebung, die von entworfen wurde von Charles H. "Chuck" Moore und erstmals von anderen Programmierern 1970 verwendet. Obwohl keine AkronymDer Name der Sprache in den frühen Jahren wurde in allen Großbuchstaben oft als geschrieben Weiter.

Forth kombiniert einen Compiler mit einem integrierten Multitasking Befehlsschale, wo der Benutzer interagiert über Unterroutinen genannt Wörter. Wörter können definiert, getestet, neu definiert und debuggen, ohne das gesamte Programm neu zu kompilieren oder neu zu starten. Alle syntaktischen Elemente, einschließlich Variablen und Grundoperatoren, werden als Wörter definiert. EIN Stapel wird verwendet, um Parameter zwischen Wörtern zu übergeben, was zu a führt Polnische Notation umgekehrt Stil.

Für einen Großteil der Existenz von Forth bestand die Standardtechnik darin, zusammen zu kompilieren Thread -Code, was schneller interpretiert werden kann als Bytecode. Einer der frühen Vorteile von Forth war die Größe: Eine gesamte Entwicklungsumgebung-einschließlich Compiler-, Editor- und Benutzerprogramme-konnte in ein 8-Bit-oder ähnlich begrenztes System in den Speicher passen. Nicht mehr durch den Raum eingeschränkt, es gibt moderne Implementierungen, die generieren optimiert Maschinensprache Wie andere Sprachkompiler.

Forth wird in der verwendet Offene Firmware Bootlader, in Platz Anwendungen[1] so wie die Philae Raumschiff,[2][3] und in anderen eingebetteten Systemen, die Interaktion mit Hardware beinhalten. Die relative Einfachheit der Schaffung eines Basic -Forth -Systems hat zu vielen persönlichen und proprietären Varianten geführt, beispielsweise zu dem Custom Forth, der zum Implementieren des Bestseller -Videospiels von 1986 verwendet wurde Starflight aus Electronic Arts.[4] Die kostenlose Software Gforth Die Implementierung wird aktiv aufrechterhalten, ebenso wie mehrere kommerziell unterstützte Systeme.

Moore entwickelte später eine Reihe von Mikroprozessoren für die Ausführung des kompilierten formen Code direkt und experimentierte mit kleineren Sprachen basierend auf Forth-Konzepten, einschließlich CMforth und Coloreforth.

Verwendet

Forth hat eine Nische in astronomischen und Weltraumanwendungen[5] sowie eine Geschichte in eingebettete Systeme. Das Offene Firmware Boot -ROMs benutzt von Apfel, IBM, Sonne, und OLPC XO-1 eine vierte Umgebung enthalten.

Forth wurde oft verwendet, um neue Hardware anzusprechen. Forth war der erste Resident Software auf dem neuen Intel 8086 Chip im Jahr 1978 und Macforth war der erste Wohnungsentwicklungssystem für die Macintosh 128K 1984.[6]

Atari, Inc. verwendete eine aufwändige animierte Demo, die in Forth geschrieben wurde, um Funktionen der zu präsentieren Atari 400 und 800 Computer in Kaufhäusern.[7] Drei Heimcomputerspiele von Electronic Arts, veröffentlicht in den 1980er Jahren, wurden in Forth geschrieben: Würmer? (1983),[8] Starflight (1986),[4] und Herren der Eroberung (1986).

Das Canon Cat (1987) verwendet für seine Systemprogrammierung hervor.

Rockwell Produzierte Ein-Chip-Mikrocomputer mit Bewohnern von Kerneln: R65F11 und R65F12. ASYST war eine Forth -Expansion für die Messung und Kontrolle der PCs.[9]

Geschichte

Forth entwickelt sich aus Charles H. MooreDas persönliche Programmiersystem, das sich seit 1968 in der kontinuierlichen Entwicklung befand.[6] Forth wurde erstmals in den frühen 1970er Jahren anderen Programmierern ausgesetzt, beginnend mit Elizabeth eher in den Vereinigten Staaten National Radio Astronomy Observatory (Nrao).[6] Nach ihrer Arbeit bei NRAO bildeten sich Charles Moore und Elizabeth im Jahr 1973 lieber Forth, Inc., und verfeinerten und portierten Systeme auf Dutzende anderer Plattformen im nächsten Jahrzehnt.

Forth ist so genannt, weil 1968 die Datei, die den Dolmetscher hält IBM 1130 Das Betriebssystem eingeschränkte Dateinamen auf fünf Zeichen eingeschränkt. "[10] Moore sah als Nachfolger für die Kompilierung von Link-Go hervor Programmiersprachen der dritten Generation, oder Software für "vierte Generation" Hardware.

Forth, Inc.'s MicroForth wurde für die entwickelt Intel 8080, Motorola 6800, Zilog Z80, und RCA 1802 Mikroprozessoren ab 1976. Microfordh wurde später von Hobbyisten verwendet, um Systeme für andere Architekturen wie die zu erzeugen 6502 1978 wurde die Forth Interest Group 1978 gegründet.[11] Es förderte und verteilte seine eigene Version der Sprache, Fig. Forth, für die meisten Marken von Heimcomputer.

Forth war in den frühen 1980er Jahren beliebt,[12] Weil es gut für die begrenzte Erinnerung an geeignet war Mikrocomputer. Die einfache Implementierung der Sprache führte zu vielen Implementierungen.[13] Die Briten Jupiter Ace Home Computer hat in seinem Rom-Residenten Betriebssystem. InSoft Graforth ist eine Version von Forth mit Grafikweiterungen für den Apple II.[14]

Die allgemeine Praxis wurde in den De-facto-Standards für 79 kodifiziert[15] und Forth-83[16] In den Jahren 1979 bzw. 1983. Diese Standards wurden von vereinheitlicht Ansi 1994, allgemein als ANS bezeichnet.[17][18]

Ab 2018 wurde die Quelle für die ursprüngliche Version von 1130 von Forth wiederhergestellt und wird nun aktualisiert, um auf einem restaurierten oder emulierten 1130 -System auszuführen.[19]

Überblick

Forth betont die Verwendung kleiner, einfacher Funktionen, die genannt werden Wörter. Wörter für größere Aufgaben erfordern viele kleinere Wörter, die jeweils eine bestimmte Unteraufgabe erfüllen. Ein großes Programm ist eine Hierarchie von Wörtern. Diese Wörter, die unterschiedliche Module sind, die implizit über einen Stapelmechanismus kommunizieren, können unabhängig voneinander prototypisiert, gebaut und getestet werden. Die höchste Ebene des Forth-Code kann einer englischsprachigen Beschreibung der Anwendung ähneln. Forth wurde a genannt Meta-Anwendungssprache: Eine Sprache, die zum Erstellen verwendet werden kann Problemorientierte Sprachen.[20]

Forth beruht auf explizite Verwendung von a Datenstapel und Polnische Notation umgekehrt das wird üblicherweise in Taschenrechnern von verwendet Hewlett Packard. In RPN wird der Bediener nach seinen Operanden im Gegensatz zu den gemeinsameren platziert Infixnotation wo der Bediener zwischen seinen Operanden platziert wird. Die Postfix -Notation erleichtert die Sprache leichter analysiert und erweitert. Forths Flexibilität macht eine statische Bnf Grammatik unangemessen, und es hat keinen monolithischen Compiler. Um den Compiler zu erweitern, muss nur ein neues Wort geschrieben werden, anstatt eine Grammatik zu ändern und die zugrunde liegende Implementierung zu ändern.

Mit RPN kann man das Ergebnis des mathematischen Ausdrucks erhalten (25 * 10 + 50) Hier entlang:

 25 10 * 50 + Cr .  300 OK 
Stack1.svg

Zuerst werden die Zahlen 25 und 10 auf den Stapel gesetzt.

Forthstack1 5.svg


Das Wort * Nimmt die beiden Top -Zahlen aus dem Stapel, multipliziert sie und legt das Produkt wieder auf den Stapel.

Forthstack2.svg

Dann wird die Nummer 50 auf den Stapel platziert.

Forthstack3.svg


Das Wort + Fügt die beiden oberen Werte hinzu und drückt die Summe. Cr (Kutschenrückkehr) Startet die Ausgabe auf einer neuen Linie. Endlich, . druckt das Ergebnis. Da alles erfolgreich abgeschlossen ist, druckt das Forth -System OK.[21]

Die strukturellen Merkmale von SaVer Forth basieren auf Stack. Zum Beispiel:

 : Boden 5 (n - n ')  DUP 6 < WENN FALLEN 5 ANDERS 1 - DANN ; 

Der Dickdarm zeigt den Beginn einer neuen Definition an, in diesem Fall ein neues Wort (erneut, Wort wird der Begriff für eine Unterroutine verwendet) genannt Boden 5. Der Text in Klammern ist ein Kommentar, der darauf hingewiesen wird, dass dieses Wort eine Nummer im Stapel erwartet und eine möglicherweise geänderte Nummer (auf dem Stapel) zurückgibt.

Die Unterroutine verwendet die folgenden Befehle: DUP Dupliziert die Nummer auf dem Stapel; 6 drückt eine 6 auf den Stapel; < Vergleicht die beiden obersten Zahlen auf dem Stapel (6 und die DUPED-Eingabe) und ersetzt sie durch einen wahren oder fehlenden Wert; WENN nimmt einen wahren oder fälschlichen Wert an und entscheidet sich dafür, Befehle unmittelbar danach auszuführen oder zum Sprung in die ANDERS; FALLEN verwaltet den Wert auf dem Stapel; 5 drückt eine 5 auf den Stapel; und DANN beendet die bedingte.

Das Boden 5 Wort entspricht dieser Funktion, die in der geschrieben wurde C Programmiersprache Verwendung der ternärer Operator '?:'

int Boden 5(int v) {   Rückkehr (v < 6) ? 5 : (v - 1); } 

Diese Funktion ist prägnanter geschrieben als:

 : Boden 5 (n - n ') 1- 5 Max ; 

Dies kann wie folgt ausgeführt werden:

 1 Boden 5 Cr .  5 OK  8 Boden 5 Cr .  7 OK 

Zunächst wird eine Zahl (1 oder 8) auf den Stapel gedrückt, Boden 5 wird aufgerufen, die die Nummer wieder aufgibt und das Ergebnis drückt. Cr Verschiebt die Ausgabe in eine neue Zeile (wiederum ist dies nur hier zur Lesbarkeit). Schließlich ein Anruf bei . Pops das Ergebnis und Drucke.

Einrichtungen

Forth's Grammatik hat keine offizielle Spezifikation. Stattdessen wird es durch einen einfachen Algorithmus definiert. Der Interpreter liest eine Eingabezeile vom Benutzereingabegerät, das dann für ein Wort unter Verwendung von Leerzeichen als a analysiert wird Abgrenzer; Einige Systeme erkennen zusätzliche Whitespace Figuren. Wenn der Dolmetscher ein Wort findet, sieht es das Wort in der Wörterbuch. Wenn das Wort gefunden wird, führt der Interpreter den dem Wort zugeordneten Code aus und kehrt dann zurück, um den Rest des Eingabestreams zu analysieren. Wenn das Wort nicht gefunden wird, wird angenommen, dass das Wort eine Zahl ist und es versucht, es in eine Zahl zu konvertieren und auf den Stapel zu schieben. Bei Erfolg wird der Dolmetscher den Eingangsstrom fortsetzt. Andernfalls druckt der Interpreter das Wort, gefolgt von einer Fehlermeldung, die angibt, dass das Wort nicht erkannt wird, den Eingabestream spült und auf neue Benutzereingaben wartet.[22]

Die Definition eines neuen Wortes wird mit dem Wort begonnen : (Dickdarm) und endet mit dem Wort ; (Semikolon). Zum Beispiel,

 : X DUP 1+ . . ; 

wird das Wort kompilieren Xund macht den Namen im Wörterbuch findbar. Bei der Ausführung durch Eingabe 10 x Bei der Konsole wird dies drucken 11 10.[23]

Die meisten vierten Systeme umfassen eine Assembler Wörter mit den Einrichtungen des Prozessors zu schreiben. Forth -Assembler verwenden häufig eine umgekehrte polnische Syntax, bei der die Parameter einer Anweisung der Anweisung vorausgehen. Ein typischer Reverse Polish Assembler bereitet die Operanden auf dem Stapel vor und die Mnemonische kopiert den gesamten Befehl als letzter Schritt in den Speicher. Ein Forth -Assembler ist von Natur aus ein Makro -Assembler, so dass es leicht ist, einen Alias ​​für Register gemäß ihrer Rolle im vierten System zu definieren: z. "DSP" für das Register, das als Datenstapelzeiger verwendet wird.[24]

Betriebssystem, Dateien und Multitasking

Die meisten vierten Systeme laufen unter einem Host -Betriebssystem wie z. Microsoft Windows, Linux oder eine Version von Unix Verwenden Sie das Dateisystem des Host -Betriebssystems für Quell- und Datendateien. Der ANSI -Forth -Standard beschreibt die Wörter, die für E/A verwendet werden. Alle modernen Forth -Systeme verwenden normale Textdateien für die Quelle, auch wenn sie eingebettet sind. Ein eingebettetes System mit einem ansässigen Compiler erhält seine Quelle über eine Serienlinie.

Klassische Forth -Systeme verwenden traditionell auch keine Betriebssystem Noch Dateisystem. Anstatt Code in Dateien zu speichern, wird Quellcode in Festplattenblöcken gespeichert, die in physikalische Festplattenadressen geschrieben wurden. Das Wort BLOCK wird verwendet, um die Anzahl eines 1K-Größe des Festplattenraums in die Adresse eines Puffers zu übersetzen, der die Daten enthält, die automatisch vom Forth-System verwaltet wird. Der Blockgebrauch ist seit Mitte der neunziger Jahre selten geworden. In einem gehosteten System werden auch diese Blöcke in einer normalen Datei auf jeden Fall zugewiesen.

Multitasking, am häufigsten Kooperative Round-Robin-Planung, ist normalerweise verfügbar (obwohl Multitasking -Wörter und -unterstützung nicht vom ANSI -Forth -Standard abgedeckt werden). Das Wort PAUSE wird verwendet, um den Ausführungskontext der aktuellen Aufgabe zu speichern, die nächste Aufgabe zu finden und ihren Ausführungskontext wiederherzustellen. Jede Aufgabe verfügt über eigene Stapel, private Kopien einiger Kontrollvariablen und einen Kratzbereich. Die Tauschaufgaben sind einfach und effizient; Infolgedessen sind Multitasker auch sehr einfach erhältlich Mikrocontroller, so wie die Intel 8051, Atmel Avr, und Ti Msp430.[25]

Andere nicht standardmäßige Einrichtungen umfassen einen Mechanismus für die Ausstellung Anrufe zum Host OS oder Fenstersystemeund viele bieten Erweiterungen, die die vom Betriebssystem bereitgestellte Planung verwenden. Normalerweise haben sie größere und unterschiedliche Wörter aus den eigenständigen Vorgutchen PAUSE Wort für die Erstellung von Aufgaben, Suspension, Zerstörung und Änderung der Priorität.

Selbstverbindung und Kreuzkompilierung

Ein System mit vollem Funktionsumfang mit allen Quellcode kompiliert sich selbst, eine Technik, die üblicherweise als Meta-Kompilierung bezeichnet wird oder Selbsthosting, von Forth Programmers (obwohl der Begriff nicht genau übereinstimmt Meta-Kompilierung wie es normalerweise definiert ist). Die übliche Methode besteht darin, die Handvoll von Wörtern neu zu definieren, die kompilierte Bits in das Gedächtnis. Die Wörter des Compilers verwenden speziell benannte Versionen von Fetch und Speicher, die in einen Pufferbereich im Speicher umgeleitet werden können. Der Pufferbereich simuliert oder greift auf einen Speicherbereich zu, der an einer anderen Adresse beginnt als der Codepuffer. Solche Compiler definieren Wörter, um sowohl auf den Speicher des Zielcomputers als auch auf den Speicher des Hosts (Kompilierens) zugreifen zu können.[26]

Nachdem der Abruf- und Speichervorgang für den Coderaum neu definiert wurde, werden der Compiler, Assembler usw. unter Verwendung der neuen Definitionen von Fetch und Speicher neu kompiliert. Dies wiederverwendet den gesamten Code des Compilers und des Interpreters effektiv wieder. Dann wird der Code des Forth -Systems kompiliert, aber diese Version wird im Puffer gespeichert. Der Puffer im Speicher wird auf die Festplatte geschrieben, und es werden Möglichkeiten zur Verfügung gestellt, ihn zum Testen vorübergehend in den Speicher zu laden. Wenn die neue Version zu funktionieren scheint, wird sie über die vorherige Version geschrieben.

Es gibt zahlreiche Variationen solcher Compiler für verschiedene Umgebungen. Zum eingebettete Systeme, der Code kann stattdessen auf einen anderen Computer geschrieben werden, eine Technik als Cross Compilation, über einen seriellen Anschluss oder sogar einen einzigen Ttl Bit, während die Wortnamen und andere nicht ausgeführte Teile des Wörterbuchs im ursprünglichen Kompiliercomputer. Die minimalen Definitionen für einen solchen vierten Compiler sind die Wörter, die ein Byte abrufen und speichern, und das Wort, das ein neues Wort ausführt. Oft ist der zeitaufwändigste Teil beim Schreiben eines Remote-Ports darin, das erste Programm zur Implementierung von Fetch, Speichern und Ausführung zu konstruieren. Viele moderne Mikroprozessoren haben jedoch integrierte Debugging-Funktionen (wie die Motorola CPU32) Das beseitigt diese Aufgabe.[27]

Struktur der Sprache

Die grundlegende Datenstruktur von Forth ist das "Wörterbuch", das "Wörter" an ausführbare Code oder benannte Datenstrukturen abbildet. Das Wörterbuch wird in Erinnerung als Baum von ausgelegt verlinkte Listen mit den Links, die von der neuesten (zuletzt) ​​definierten Nachricht bis zum ältesten bis a Sentinel -Wert, normalerweise ein Nullzeiger, wird gefunden. Ein Kontextschalter führt dazu, dass eine Listensuche in einem anderen Blatt beginnt. Eine verknüpfte Listensuche wird fortgesetzt, während der Zweig in den Hauptstamm führt, der schließlich zum Sentinel, der Wurzel, zurückkehrt. Es kann mehrere Wörterbücher geben. In seltenen Fällen wie Meta-Kompilation kann ein Wörterbuch isoliert und eigenständig sein. Der Effekt ähnelt der Nistennamespaces und kann je nach Kontext Schlüsselwörter überlasten.

Ein definiertes Wort besteht im Allgemeinen aus Kopf und Karosserie mit dem Kopf bestehend aus dem Namensfeld (NF) und die Linkfeld (Lf) und Körper bestehend aus dem Codefeld (Vgl.) Und die Parameterfeld (PF).

Kopf und Körper eines Wörterbucheintrags werden separat behandelt, da sie möglicherweise nicht angrenzend sind. Wenn beispielsweise ein Forth -Programm für eine neue Plattform neu kompiliert wird, kann der Kopf auf dem kompilierenden Computer bleiben, während der Körper auf die neue Plattform geht. In einigen Umgebungen (wie z. eingebettete Systeme) Die Köpfe belegen das Gedächtnis unnötig. Einige Cross-Compiler können jedoch die Köpfe in das Ziel setzen, wenn das Ziel selbst eine interaktive Fortschritte unterstützen soll.[28]

Eintrag im Wörterbuch

Das genaue Format eines Wörterbucheintrags wird nicht vorgeschrieben und die Implementierungen variieren. Bestimmte Komponenten sind jedoch fast immer vorhanden, obwohl die genaue Größe und Reihenfolge variieren kann. Als Struktur beschrieben, könnte ein Wörterbucheintrag so aussehen:[29]

 Struktur  Byte:  Flagge  \ Länge des Wortnamens  Char-Array: Name  Die Laufzeitlänge \ NAME ist nicht zur Kompilierungszeit bekannt  die Anschrift:  früher  \ Link -Feld, rückwärts PTR zum vorherigen Wort  die Anschrift:  Codewort  \ ptr zum Code, um dieses Wort auszuführen  Any-Array:  Parameterfeld \ unbekannte Daten, Wörter oder Opcodes  Endstruktur Fortwordung 

Das Feld Name beginnt mit einem Präfix, das die Länge des Wortnamens enthält. Die Charakterdarstellung des Wortnamens folgt dann dem Präfix. Abhängig von der jeweiligen Umsetzung von Forth kann es eine oder mehrere NUL ('\ 0') Bytes für die Ausrichtung geben.

Das Linkfeld enthält einen Zeiger auf das zuvor definierte Wort. Der Zeiger kann eine relative Verschiebung oder eine absolute Adresse sein, die auf das nächstälteste Geschwister hinweist.

Der Codefeldzeiger ist entweder die Adresse des Wortes, mit dem der Code oder die Daten im Feld Parameter oder den Beginn des Maschinencodes ausgeführt werden, den der Prozessor direkt ausführt. Für Colon definierte Wörter verweist der Codefeld Zeiger auf das Wort, das den aktuellen Forth -Befehlszeiger (IP) auf dem Rückgabestapel speichert und die IP mit der neuen Adresse lädt, aus der die Ausführung von Wörtern fortgesetzt werden kann. Dies ist das gleiche wie das, was die Anruf-/Rücksendungsanweisungen eines Prozessors tun.

Struktur des Compilers

Der Compiler selbst ist kein monolithisches Programm. Es besteht aus hervorragenden Wörtern, die für das System sichtbar sind und von einem Programmierer verwendet werden können. Dies ermöglicht es einem Programmierer, die Wörter des Compilers für besondere Zwecke zu ändern.

Das Flag "Time Compile Time" im Feld Name wird für Wörter mit "Kompilierzeit" -Vorform gesetzt. Die meisten einfachen Wörter führen den gleichen Code aus, unabhängig davon, ob sie in eine Befehlszeile eingegeben oder in Code eingebettet sind. Wenn der Compiler diese kompiliert, platziert er einfach Code oder einen Thread -Zeiger auf das Wort.[23]

Die klassischen Beispiele für Kompilierungszeitwörter sind die Kontrollstrukturen wie zum Beispiel WENN und WÄHREND. Fast alle Kontrollstrukturen von Forth und fast alle seiner Compiler werden als Kompilierzeitwörter implementiert. Abgesehen von einigen selten benutzten Steuerfluss Wörter, die nur in wenigen Implementierungen gefunden wurden, z. B. eine bedingte Rückkehr, alle Forths Steuerfluss Wörter werden während der Zusammenstellung ausgeführt, um verschiedene Kombinationen primitiver Wörter zusammen mit ihren Ast -Adressen zu erstellen. Zum Beispiel, WENN und WÄHREND, und die Wörter, die mit diesen übereinstimmen, setzen sich auf ZWEIG (bedingungsloser Zweig) und ?ZWEIG (Stecken Sie einen Wert aus dem Stapel und verzweigen Sie, wenn er falsch ist). Gezählte Schleife Steuerfluss Wörter funktionieren ähnlich, stellen jedoch Kombinationen von primitiven Wörtern auf, die mit einem Zähler und so weiter funktionieren. Während der Kompilierung wird der Datenstapel verwendet, um die Ausgleiche, Verschachtelung und Backpatching von Zweigadressen zu unterstützen. Der Ausschnitt:

 ... DUP 6 < WENN FALLEN 5 ANDERS 1 - DANN ... 

würde in einer Definition mit der folgenden Sequenz zusammengestellt werden:

 ... DUP ZÜNDETE 6 < ?ZWEIG 5  FALLEN ZÜNDETE 5  ZWEIG 3  ZÜNDETE 1 - ... 

Die Zahlen danach ZWEIG Relative Sprungadressen darstellen. ZÜNDETE ist das primitive Wort, um eine "wörtliche" Nummer auf den Datenstapel zu drücken.

Kompilierungszustand und Interpretationszustand

Das Wort : (Colon) analysiert einen Namen als Parameter, erstellt einen Wörterbucheintrag (a Dickdarmdefinition) und in den Kompilierungszustand eintreten. Der Dolmetscher leitet weiterhin speicherdelimitierte Wörter vom Benutzereingabegerät. Wenn ein Wort gefunden wird, führt der Dolmetscher die aus Kompilierungssemantik mit dem Wort verbunden anstelle der Interpretationssemantik. Die Standardkompilierungssemantik eines Wortes besteht darin, seine Interpretationssemantik an die aktuelle Definition anzuhängen.[23]

Das Wort ; (Semikolon) beendet die aktuelle Definition und kehrt zum Interpretationszustand zurück. Es ist ein Beispiel für ein Wort, dessen Zusammenstellung Semantik vom Standardwert unterscheidet. Die Interpretationssemantik von ; (SEMI-COLON), die meisten Kontrollflusswörter und mehrere andere Wörter sind in ANS nicht definiert, was bedeutet, dass sie nur in Definitionen und nicht in der interaktiven Befehlszeile verwendet werden dürfen.[23]

Der Interpreter -Zustand kann manuell mit den Wörtern ändert [ (linksübergreifende) und ] (Rechtsspurung), die den Interpretationszustand bzw. des Kompilierungszustands eingeben. Diese Wörter können mit dem Wort verwendet werden Wörtlich Berechnung eines Werts während einer Kompilierung und um den berechneten Wert in die aktuelle Dickdarmdefinition einzufügen. Wörtlich Hat die Kompilierungssemantik ein Objekt aus dem Datenstapel und die Anhänge von Semantik an die aktuelle Dickdarmdefinition, um dieses Objekt auf den Datenstapel zu platzieren.

In ANS kann der aktuelle Zustand des Dolmetschers aus dem gelesen werden Flagge ZUSTAND welches den Wert enthält, wenn es in Kompilierungszustand ist, und ansonsten falsch. Dies ermöglicht die Implementierung von sogenannten State-Smart-Wörter mit Verhalten, das sich entsprechend dem aktuellen Zustand des Dolmetschers ändert.

Unmittelbare Worte

Das Wort SOFORT markiert die jüngste Dickdarmdefinition als Sofortiges Worteffektiv ersetzt seine Kompilierungssemantik durch seine Interpretationssemantik.[30] Sofortige Wörter werden normalerweise während der Zusammenstellung ausgeführt, nicht kompiliert. Dies kann jedoch vom Programmierer in beiden Bundesstaaten überschrieben werden. ; ist ein Beispiel für ein unmittelbares Wort. In Ans das Wort VERSCHIEBEN Nimmt einen Namen als Parameter an und findet die Kompilierungssemantik des benannten Wortes an die aktuelle Definition an, auch wenn das Wort sofort gekennzeichnet war. Forth-83 definierte getrennte Wörter KOMPILIEREN und [KOMPILIEREN] Um die Zusammenstellung von nicht-dicht bzw. unmittelbaren Wörtern zu erzwingen.

Unbenannte Wörter und Ausführungszeichen

In Ans können unbenannte Wörter mit dem Wort definiert werden :KEIN NAME was die folgenden Wörter bis zum nächsten kompiliert ; (Semikolon) und hinterlässt eine Ausführungs -Token auf dem Datenstapel. Der Ausführungs -Token bietet einen undurchsichtigen Griff für die kompilierte Semantik, ähnlich wie die Funktionszeiger des C Programmiersprache.

Ausführungszeichen können in Variablen gespeichert werden. Das Wort AUSFÜHREN Nimmt ein Ausführungs -Token aus dem Datenstapel und führt die zugehörige Semantik aus. Das Wort KOMPILIEREN, (Compile-comma) nimmt ein Ausführungs-Token aus dem Datenstapel und wendet die zugehörige Semantik an die aktuelle Definition an.

Das Wort ' (Tick) nimmt den Namen eines Wortes als Parameter an und gibt den Ausführungs -Token zurück, der diesem Wort auf dem Datenstapel zugeordnet ist. Im Interpretationszustand, 'Random-Wort Execute ist äquivalent zu Zufallswort.[31]

Wörter und Kommentare analysieren

Die Wörter : (Doppelpunkt), VERSCHIEBEN, ' (Tick) sind Beispiele von Wörter analysieren Dadurch werden ihre Argumente vom Benutzereingabegerät anstelle des Datenstapels entnommen. Ein anderes Beispiel ist das Wort ( (Paren), das die folgenden Wörter bis hin zu der nächsten rechten Klammer liest und ignoriert und verwendet wird, um Kommentare in eine Dickdarmdefinition zu platzieren. Ebenso das Wort \ (Backslash) wird für Kommentare verwendet, die bis zum Ende der aktuellen Zeile fortgesetzt werden. Richtig analysiert werden, ( (Paren) und \ (Backslash) muss durch Whitespace vom folgenden Kommentartext getrennt werden.

Struktur des Codes

In den meisten vierten Systemen besteht der Körper einer Code -Definition aus beiden Maschinenspracheoder eine Form von Thread -Code. Das ursprüngliche Forth, das dem informellen Feigenstandard (Forth Interest Group) folgt, ist eine Flucht (Threaded Interpretive Sprache). Dies wird auch als indirektem Code bezeichnet, aber in der Neuzeit sind auch Direktsthread- und Unterroutine-Fäden populär geworden. Die schnellsten modernen Forths wie Swiftforth, VFX Forth und Iforth kompilieren zum nativen Maschinencode.

Datenobjekte

Wenn ein Wort eine Variable oder ein anderes Datenobjekt ist, verweist der CF auf den Laufzeitcode, das dem definierenden Wort zugeordnet ist, das es erstellt hat. Ein definierendes Wort hat ein charakteristisches "Definieren von Verhalten" (Erstellen eines Wörterbucheintrags plus möglicherweise, die Datenraum zuweisen und initialisieren) und legt auch das Verhalten einer Instanz der Klasse von Wörtern fest, die durch dieses definierende Wort konstruiert sind. Beispiele beinhalten:

VARIABLE
Benennt einen nicht initialisierten Speicherort mit einem Zellen. Instanzverhalten von a VARIABLE Gibt seine Adresse auf dem Stapel zurück.
KONSTANTE
Nennt einen Wert (als Argument für angegeben KONSTANTE). Das Instanzverhalten gibt den Wert zurück.
SCHAFFEN
Nennt einen Ort; An diesem Ort kann Platz zugewiesen werden oder so eingestellt werden, dass eine Zeichenfolge oder einen anderen initialisierten Wert enthalten ist. Das Instanzverhalten gibt die Adresse des Beginns dieses Raums zurück.

Forth bietet auch eine Einrichtung, mit der ein Programmierer neue anwendungsspezifische definierende Wörter definieren kann und sowohl ein benutzerdefiniertes Defizierungsverhalten als auch das Instanzverhalten angeben kann. Einige Beispiele sind kreisförmige Puffer, benannte Bits an einem E/A -Port und automatisch indizierte Arrays.

Datenobjekte, die von diesen und ähnlichen Wörtern definiert sind, sind global im Bereich. Die von lokalen Variablen in anderen Sprachen bereitgestellte Funktion wird durch den Datenstapel in Forth bereitgestellt (obwohl Forth auch reale lokale Variablen hat). Forth Programmierstil verwendet sehr wenige benannte Datenobjekte im Vergleich zu anderen Sprachen. Typischerweise werden solche Datenobjekte verwendet, um Daten zu enthalten, die von einer Reihe von Wörtern oder Aufgaben verwendet werden (in einer multitaskierten Implementierung).[32]

Forth erzwingt keine Konsistenz von Datentyp Verwendungszweck; Es liegt in der Verantwortung des Programmierers, geeignete Operatoren zum Abrufen und Speichern von Werten oder anderen Vorgängen für Daten zu verwenden.

Beispiele

"Hallo Welt!"

 : HALLO  ( -)  Cr . " Hallo Welt!" ; 
Hallo <cr> Hallo, Welt!

Das Wort Cr (Wagenrendite) führt dazu, dass die folgende Ausgabe auf einer neuen Linie angezeigt wird. Das Parsingwort . " (DOT-Quote) liest eine doppelt quantelgrenzte Zeichenfolge und findet Code an die aktuelle Definition an, sodass die analysierte Zeichenfolge bei der Ausführung angezeigt wird. Der Raumcharakter trennt das Wort . " Aus der Saite Hallo Welt! ist nicht als Teil der Zeichenfolge enthalten. Es wird benötigt, damit der Parser erkennt . " Als viertes Wort.

Ein Standard -Forth -System ist ebenfalls ein Interpreter, und der gleiche Ausgang kann erhalten werden, indem das folgende Codefragment in die Forth -Konsole eingeben:

 Cr .( Hallo Welt!) 

. ( (dot-paren) ist ein unmittelbares Wort, das eine Klammern von Klammern analysiert und sie anzeigt. Wie mit dem Wort . " der Raumcharakter trennt . ( aus Hallo Welt! ist nicht Teil der Zeichenfolge.

Das Wort Cr Kommt vor dem zu druckenen Text. Nach Übereinkommen beginnt der Forth Interpreter nicht in einer neuen Linie. Auch nach Übereinkommen wartet der Dolmetscher nach einem auf die Eingabe am Ende der vorherigen Zeile OK prompt. Es gibt keine implizite "Flush-Buffer" Cr, wie manchmal in anderen Programmiersprachen.

Mischungszustände des Zusammenstellens und Interpretierens

Hier ist die Definition eines Wortes Emit-q was beim Auslegen des einzelnen Charakters emittiert Q:

 : Emit-q  81 (Der ASCII -Wert für das Zeichen 'q') EMITTIEREN ; 

Diese Definition wurde geschrieben, um die zu verwenden ASCII Wert der Q Charakter (81) direkt. Der Text zwischen den Klammern ist ein Kommentar und wird vom Compiler ignoriert. Das Wort EMITTIEREN Nimmt einen Wert aus dem Datenstapel und zeigt das entsprechende Zeichen an.

Die folgende Neudefinition von Emit-q verwendet die Wörter [ (linke Klammer), ] (Rechtsspurung), VERKOHLEN und Wörtlich Berechnen Sie den ASCII -Wert des Q Charakter, Rückkehr zum Kompilierungszustand und fügen Sie den berechneten Wert an die aktuelle Dickdarmdefinition an:

 : Emit-q  [ VERKOHLEN Q ]  Wörtlich  EMITTIEREN ; 

Das Parsingwort VERKOHLEN Nimmt ein spaspreisdelimitiertes Wort als Parameter und legt den Wert seines ersten Zeichens auf den Datenstapel. Das Wort [VERKOHLEN] ist eine unmittelbare Version von VERKOHLEN. Verwendung [VERKOHLEN], die Beispieldefinition für Emit-q könnte so umgeschrieben werden:

 : Emit-q  [VERKOHLEN] Q  EMITTIEREN ; \ Emitieren Sie das einzelne Zeichen 'q' 

Diese Definition wurde verwendet \ (Backslash) für den beschriebenen Kommentar.

Beide VERKOHLEN und [VERKOHLEN] sind in Ans vordefiniert. Verwendung SOFORT und VERSCHIEBEN, [VERKOHLEN] hätte so definiert werden können:

 : [VERKOHLEN]  VERKOHLEN  VERSCHIEBEN Wörtlich ; SOFORT 

Ein komplettes RC4 -Chiffre -Programm

In 1987, Ron Rivest entwickelte die RC4 Cipher-System für RSA Data Security, Inc. Der Code ist äußerst einfach und kann von den meisten Programmierern aus der Beschreibung geschrieben werden:

Wir haben eine Reihe von 256 Bytes, alle unterschiedlich. Jedes Mal, wenn das Array verwendet wird, ändert sich es durch Tausch von zwei Bytes. Die Swaps werden von Zählern gesteuert i und j, jeweils anfangs 0. um ein neues zu bekommen i, fügen Sie 1. um einen neuen zu bekommen jFügen Sie das Array -Byte beim neuen hinzu i. Tauschen Sie die Array -Bytes unter i und j. Der Code ist das Array -Byte in der Summe der Array -Bytes bei i und j. Dies ist mit einem Byte des Klartextes zu verschlüsseln oder zu entschlüsseln. Das Array wird initialisiert, indem es zuerst auf 0 bis 255 festgelegt wird i und j, das neue bekommen j Indem Sie ihm das Array -Byte hinzufügen i und ein wichtiges Byte und tauschen Sie die Array -Bytes bei i und j. Endlich, i und j sind auf 0 eingestellt. Alle Ergänzungen sind modulo 256.

Die folgende Standard -FOR -Version verwendet nur Kern- und Kernerweiterungswörter.

0 Wert II  0 Wert JJ 0 Wert Keyaddr  0 Wert Keylen schaffen Sarray  256 zuteilt  \ State Array von 256 Bytes : KeyArray  Keylen Mod  Keyaddr ; : get_byte  + c@ ; : set_byte  + c! ; : As_Byte  255 und ; : reset_ij  0 ZU II  0 ZU JJ ; : i_update  1 +  As_Byte ZU II ; : J_UPDATE  II Sarray get_byte +  As_Byte ZU JJ ; : SWAP_S_IJ  JJ Sarray get_byte  II Sarray get_byte  JJ Sarray set_byte  II Sarray set_byte ; : rc4_init (KeyAddr -Keylen -)  256 Mindest ZU Keylen  ZU Keyaddr  256 0 TUN  i i Sarray set_byte  SCHLEIFE  reset_ij  START  II KeyArray get_byte  JJ +  J_UPDATE  SWAP_S_IJ  II 255 < WÄHREND  II i_update  WIEDERHOLEN  reset_ij ; : RC4_Byte  II i_update  JJ J_UPDATE  SWAP_S_IJ  II Sarray get_byte  JJ Sarray get_byte +  As_Byte Sarray get_byte  xor ; 

Dies ist eine von vielen Möglichkeiten, den Code zu testen:

verhexen schaffen Ein Schlüssel  61 c, 8A c, 63 c, D2 c, FB c, : Prüfung  Cr  0 TUN  RC4_Byte . SCHLEIFE  Cr ; Ein Schlüssel 5 rc4_init 2C F9 4C EE DC  5 Prüfung  \ output sollte sein: f1 38 29 c9 de 

Implementierungen

Da Forth einfach zu implementieren ist und keine Standardreferenzimplementierung hat, gibt es zahlreiche Versionen der Sprache. Neben der Unterstützung der Standardsorten von Desktop -Computersystemen (Posix, Microsoft Windows, Mac OS) viele dieser vierten Systeme zielen auch auf eine Vielzahl von eingebettete Systeme. Hier sind einige der Systeme aufgeführt, die dem Standard -Standard von 1994 entsprechen.

  • ASYST, ein ganzes System zur Datenerfassung und -analyse [33]
  • Gforth, eine tragbare Implementierung aus der GNU -Projekt
  • Offene Firmware, a Bootloader und Firmware Standard basierend auf ANS Forth
  • Pforth, tragbar in c
  • Sp-forth, Und die Umsetzung der russischen Interessengruppe (RUFIG)
  • Swift weiter, Maschinencode Generierung von Implementierung von Forth, Inc.
  • Vfx vorh, optimieren nativer Code für

Siehe auch

  • RTX2010, eine CPU, die nativ hervorgeht

Verweise

  1. ^ NASA -Anwendungen von Forth (Original NASA -Server nicht mehr ausgeführt, kopieren Sie von archive.org)
  2. ^ "Intersils RTX -Prozessoren und Forth -Software kontrollierten die erfolgreiche Philae Landing" (PDF). Mikroprozessor Engineering Limited. 13. Oktober 2014.
  3. ^ "Hier kommt Philae! Angetrieben von einem RTX2010". Das CPU Shack Museum. 12. Oktober 2014. Abgerufen 23. Mai, 2017.
  4. ^ a b Maher, Jimmy (28. Oktober 2014). "Starflight". Der digitale Antiquar. Abgerufen 23. Mai, 2017.
  5. ^ "Raumbezogene Anwendungen von Forth". Archiviert von das Original Am 2010-10-24. Abgerufen 2007-09-04.
  6. ^ a b c Eher Elizabeth d.; Colburn, Donald R.; Moore, Charles H. (1996) [1993]. "Die Entwicklung von Forth". In Bergin, Thomas J.; Gibson, Richard G. (Hrsg.). Geschichte der Programmiersprachen - II ii. Verband für Rechenmaschinen. S. 625–670. doi:10.1145/234286.1057832. ISBN 0201895021.
  7. ^ "Atari-Demonstrationsprogramm im Laden". Atari Mania.
  8. ^ Maynard, David S. "David Maynard: Softwarekünstler".
  9. ^ Campbell et al., "UP -Laufen mit ASYST 2.0", Macmillan Software Co., 1987
  10. ^ Moore, Charles H (1991). "Forth - die frühen Jahre". Archiviert von das Original am 2006-06-15. Abgerufen 2006-06-03.
  11. ^ "Ans 1994 Spezifikation, Anhang C (" Perspektive ")". taygeta.com.
  12. ^ "Die vierte Sprache", Byte Magazine, 5 (8), 1980
  13. ^ M. Anton Ertl. "Forth Stammbaum und Zeitleiste".
  14. ^ Lutus, Paul (1982). "Graforth Sprachhandbuch". archive.org. Insoft.
  15. ^ "Der Forth-79-Standard" (PDF). Archiviert (PDF) vom Original am 2019-04-12.
  16. ^ "Der Forth-83-Standard".
  17. ^ "Programmiersprachen: Forth". ANSI Technischer Ausschuss X3J14. 24. März 1994. Abgerufen 2006-06-03.
  18. ^ "Standard-Forth (ANSI Incits 215-1994) Referenz" (PDF). Quartus Handheld -Software. 13. September 2005. Abgerufen 2013-04-14.
  19. ^ Claunch, Carl (2018-03-02). "Wiederherstellung des ursprünglichen Quellcodes für Forth auf der IBM 1130". Rettung1130. Abgerufen 30. Juli, 2018.
  20. ^ Brodie, Leo. "Anfangen". Forth dot com. Forth, Inc. Abgerufen 14. Juli, 2020.
  21. ^ Brodie 1987, p. 20
  22. ^ Brodie 1987, p. 14
  23. ^ a b c d Brodie 1987, p. 16
  24. ^ Rodriguez, Brad. "B.Y.O.Assembler". Archiviert von das Original am 2006-06-23. Abgerufen 2006-06-19.
  25. ^ Rodriguez, Brad. "Multitasking 8051 Camelforth" (PDF). Archiviert von das Original (PDF) am 2006-06-22. Abgerufen 2006-06-19.
  26. ^ Rodriguez, Brad (Juli 1995). "Fortschreiten". Archiviert von das Original am 2006-06-23. Abgerufen 2006-06-19.
  27. ^ Shoebridge, Peter (1998-12-21). "Motorola Hintergrund Debugging -Modus -Treiber für Windows NT". Archiviert von das Original Am 2007-06-06. Abgerufen 2006-06-19.
  28. ^ Martin, Harold M. (März 1991). "Einbindungsmodell entwickeln". ACM Sigforth Newsletter. ACM -Presse. 2 (3): 17–19. doi:10.1145/122089.122091. S2CID 26362015.
  29. ^ Brodie 1987, S. 200–2
  30. ^ Brodie 1987, p. 273
  31. ^ Brodie 1987, p. 199
  32. ^ "Unter der Haube". Brodie 1987. p. 241. Zusammenfassend gibt es drei Arten von Variablen: Systemvariablen enthalten Werte, die vom gesamten Forth -System verwendet werden. Benutzervariablen enthalten Werte, die für jede Aufgabe eindeutig sind, obwohl die Definitionen von allen Aufgaben im System verwendet werden können. Regelmäßige Variablen können entweder systemweit oder nur innerhalb einer einzelnen Aufgabe zugänglich sein, je nachdem, ob sie innerhalb definiert sind OPERATOR oder innerhalb einer privaten Aufgabe.
  33. ^ Gary, David; Oshio, Koichi; Flanagan, Steven D. (1987). "Die ASYST -Software für wissenschaftliches Computer". Wissenschaft. 236 (4805): 1128–32. Bibcode:1987Sci ... 236.1128H. doi:10.1126/science.236.4805.1128. JStor 1699106. PMID 17799670. S2CID 30463062.

Weitere Lektüre

  • Biancuzzi, Federico; Warden, Shane (2009). "4. [Ein Gespräch mit Chuck Moore]". Masterminds der Programmierung, Gespräche mit den Schöpfer wichtiger Programmiersprachen. O'Reilly. ISBN 978-0-596-51517-1.
  • Brodie, Leo (1987). Anfangen (2. Aufl.). Prentice-Hall. ISBN 978-0-13-843079-5.
  • Brodie, Leo (2007). Marcel Hendrix (Hrsg.). Anfangen. Marlin Ouverson (Web Ed.). Forth, Inc. Abgerufen 2007-09-29.
  • Brodie, Leo (2004). Paysan, Bernd (Hrsg.). Weiterdenken (PDF Online -Buch). ISBN 978-0-9764587-0-8. Abgerufen 2008-09-15.
  • Conklin, Edward K.; Eher Elizabeth d.; et al. (8. September 2007). Forth Programmer's Handbook (3. Aufl.). Bücherlas -Veröffentlichung. p. 274. ISBN 978-1-4196-7549-2.
  • Eher Elizabeth D. (2000). Forth Applicationstechniken (Spiralgrenze). Forth Inc. p. 158. ISBN 978-0-9662156-1-8.
  • PELC, Stephen F. (2005). Programmieren (Spiralgrenze). Mikroprozessor Engineering Ltd. p. 188.
  • Kelly, Mahlon G.; Spione, Nicholas (1986). Forth: Ein Text und eine Referenz. Prentice-Hall. ISBN 978-0-13-326331-2.
  • Koopman, JR, Philip J. (1989). Stack Computers: Die neue Welle. Ellis Horwood. ISBN 978-0-7458-0418-7.
  • Pountain, Dick (1987). Objektorientiertes Ergebnis: Implementierung von Datenstrukturen. Harcourt Brace Jovanovich. ISBN 978-0-12-563570-7.
  • Payne, William (19. Dezember 1990). Eingebetteter Controller für die 8051 -Familie.Elsevier.p.528. ISBN 978-0-12-547570-9.
  • Winfield, Alan (1983). Das vollständige vorh. John Wiley. ISBN 978-0471882350.
  • Baglioni, Gio Federico (1983). Forth pro Vic20 E CBM64.Jackson. ISBN 978-88-7056-141-8.