This page (revision-4) was last changed on 03-Feb-2023 15:21 by Carsten Strotmann 

This page was created on 01-Apr-2010 20:00 by Carsten Strotmann

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
4 03-Feb-2023 15:21 348 bytes Carsten Strotmann to previous
3 01-Apr-2010 20:05 3 KB Carsten Strotmann to previous | to last
2 01-Apr-2010 20:01 3 KB Carsten Strotmann to previous | to last
1 01-Apr-2010 20:00 3 KB Carsten Strotmann to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 1 changed one line
!!!Stack Operations
!!!Stack-Operations
At line 3 changed 34 lines
(translation pending)
Herkömmliche Programmiersprachen enthalten mehr oder weniger ausgeprägt das Konzept der PROZEDUREN: Für bestimmte Programmfunktionen notwendige Operatoren werden in benannten Programmteilen zusammengefaßt, um diese Programmfunktionen an mehreren Stellen innerhalb eines Programmes über ihren Namen aktivieren zu können. Da FORTH ohne jede Einschränkung prozedural ist, macht FORTH auch keinen Unterschied zwischen Prozeduren und Funktionen oder seinen Operatoren. Alles wird als ein WORT bezeichnet.
FORTH als Programmier-SPRACHE besteht also aus Wörtern. Somit können FORTH-Wörter sein:
# Datenbereiche
# Algorithmen (Befehle)
# Programme
Um Prozeduren sinnvoll benutzen zu können, kennen die meisten Sprachen auch PARAMETER:
Dies sind Daten, die einer Prozedur bei ihrem Aufruf zur Bearbeitung übergeben werden. Daten, die ausschließlich innerhaib einer Prozedur benötigt werden, heißen LOKAL zu dieser Prozedur; im Gegensatz dazu nennt man Daten, die außerhalb von bestimmten Prozeduren zur Verfügung stehen und auf die von allen Prozeduren aus mit allen Operatoren zugegriffen werden kann, GLOBAL.
Die erste Möglichkeit der Parameterübergabe zwischen Prozeduren ist die Vereinbarung von benannten GLOBALEN Variablen. Diese globalen Variablen sind für die gesamte Laufzeit des Programmes statisch existent und können von allen Proze­duren manipuliert werden.
Eine andere Möglichkeit der Parameterübergabe besteht im Einrichten eines Spei­cherbereiches, in dem während des Aufrufes eines Wortes namentlich benannte Parameter dynamisch verwaltet werden. Diesen Mechanismus für benannte lokale Variable stellt Standard-FORTH nicht zur Verfügung, weil die Organisation dieser lokalen Variablen mit einem Verlust sowohl der lokalen Daten nach der Ausführung des Wortes als auch einem Verlust in der Ausführungsgeschwindigkeit des Wortes verbunden sind.
Für das volks4TH wurde in der VD 1/88 eine Implementierung benannter lokaler Variablen vorgestellt.
FORTH benutzt zur gegenseitigen Übergabe von Parametern an Wörter hauptsächlich den STACK, einen bestimmten Speicherbereich, in dem die Wörter ihre Parameter er­warten. Diese Parameter erhalten keine Namen, sondern ihre interpretation ergibt sich aus der Position innerhalb des Stack-Speicherbereiches. Daraus resultiert die Vielzahl von Operatoren zur Anderung der Stack-Position eines Wertes, für die FORTH berühmt/berüchtigt ist.
Damit deutlich wird, welche und wieviele Parameter ein Wort benötigt, werden all­gemein STACK-KOMMENTARE verwendet:
Der öffnenden runden Klammer folgt eine Aufzählung der Parameter. Dabei steht der Parameter, der als oberstes Stack-Element erwartet wird, ganz rechts. Dann folgt ein "--", das die Ausführung des Wortes symbolisieren soll. Anschließend wird der Zustand des Stacks nach der Ausführung des Wortes dargestellt, wobei das oberste Stackelement wieder ganz rechts steht. Die schließende runde Klammer beendet den Stack-Kommentar.
Ein Wort SQRT, das die Quadratwurzel einer Integerzahl liefert, würde in FORTH so benannt und beschrieben:
{{{
sqrt ( number -- sqrt )
}}}
Wird dieses neue Wort aufgerufen, so werden alle darin enthaltenen Wörter ausgeführt, eventuell bereitgestellte Parameter bearbeitet und daraus resultferende Ergebnisse auf dem Stack übergeben.
Der Aufruf von Prozeduren erfolgt in FORTH implizit durch die Nennung des Namens, ebenso wie auch die Datenübergabe zwischen Wörtern meist impUzit erfolgt.
* [drop]
* [2drop|two-drop]
* [dup]
* [?dup|question-dup]
* [2dup|two-dup]
* [swap]
* [2swap|two-swap]
* [nip]
* [over]
* [2over|two-over]
* [under]
* [rot]
* [-rot|minus-rot]
* [roll]
* [-roll|minus-roll]
* [pick]
* [.s|dos-s]
* [clearstack]
* [depth]
* [s0|s-zero]
* [sp!|s-p-store]
* [sp@|s-p-fetch]