\section{Kommentar zum Artikel „Kontrollstrukturen als Colon-Definitionen und ohne die Immediate-Eigenschaft“ in der VD 4/2011 von Fred Behringer} Zunächst möchte ich auf den Versuch eingehen, die drei Forth-Basisbefehle \verb|LIT|, \verb|BRANCH| und \verb|?BRANCH| als High-Level Befehle zu definieren: Sie stellen im Forth-System eine Besonderheit dar, da sie einen einkompilierten direkten Parameter benötigen, anders als fast alle weiteren Forth-Befehle. Außerdem werden sie vom Compiler benutzt, um Literale und Strukturen zu kompilieren. Dabei wird der Befehl \verb|LIT| vom Befehl \verb|LITERAL|, der Befehl \verb|?BRANCH| (bedingter Sprung) von den Strukturbefehlen \verb|IF|, \verb|WHILE| und \verb|UNTIL| und der Befehl \verb|BRANCH| (unbedingter Sprung) von den Strukturbefehlen \verb|ELSE|, \verb|AGAIN| und \verb|REPEAT| benutzt. Die Strukturbefehle \verb|BEGIN| und \verb|THEN| dienen dem Compiler lediglich als Sprungmarken. Die genannten Literal- und Strukturbefehle sind deswegen als „Immediate-Befehle“ programmiert. Ob es möglich ist, wie von Fred Behringer versucht, sie als „Nicht-Immediate-Befehle“ zu definieren, kann ich nicht beurteilen, bin aber sehr skeptisch. Der Artikel zeigt aber die zwangsläufig auftretenden Schwierigkeiten beim Versuch, den benötigten Basis- (oder Minimal-) Befehlssatz für ein Forth-System immer weiter zu reduzieren: Die Definition: \begin{verbatim} : BRANCH R> @ >R ; \end{verbatim} funktioniert, wäre also einsetzbar! Anders verhält es sich mit der Definition: \begin{verbatim} : LIT R@ @ R> 2 + >R ; \end{verbatim} sie funktioniert zwar im Prinzip, benutzt jedoch für die Literale \verb|2| sich selbst. Das geht also nicht! Das Gleiche passiert, wenn man versuchen würde, den Befehl \verb|?BRANCH| zu definieren: \begin{verbatim} : ?BRANCH IF R> 2 + >R ELSE R> @ >R THEN ; \end{verbatim} Auch hierbei wäre der \verb|?BRANCH| im \verb|IF|-Befehl als bereits vorhanden vorausgesetzt! Man dreht sich damit gewissermaßen im Kreis, da eine Rekursion in diesem Fall nicht möglich ist. Die Aussage, dass der (in Forth definierte) Befehl \verb|D+| ebenso als Basisbefehl dienen kann, wie der von mir definierte (in Forth unbekannte) Befehl \verb|+C|, ist prinzipiell richtig. Für die Benutzung von \verb|+C| gibt es jedoch formale und insbesondere auch einen technischen Grund: Bei der Addition zweier n-Bit-Zahlen kann das Ergebnis maximal n+1 Bits betragen. Das überzählige Bit wird bei Mikroprozessoren üblicherweise als Carry-Bit in einem Flag-Register gespeichert. Da Forth, wie alle anderen Programmiersprachen auch, kein Flag-Register kennt, ist es sinnvoll, das Bit in einem zusätzlichem n-Bit-Wort abzulegen. Damit wird aus der Addition zweier n-Bit Worte ein (n+n)-Bit Ergebnis. Das Gleiche wird bei der Multiplikation praktiziert, siehe Forth-Befehl \verb|UM*| (n Bits * n Bits => 2n Bits). Damit ist das Ergebnis immer eindeutig! Außerdem besteht dann die Möglichkeit, die Addition auf Zahlen beliebiger Bitbreiten zu erweitern und der Anwender kann selbst entscheiden, ob er das überzählige Bit braucht oder nicht, z.\,B.: \begin{verbatim} : + +C DROP ; \end{verbatim} Formal ist der Befehlssatz ohnehin nur für Single-Befehle gedacht, Double-Befehle betrachte ich lediglich als Erweiterung des Single-Befehlssatzes. Der technische Grund für den Befehl \verb|+C| ist folgender: Der STRIP-Forth-Prozessor kann (wie alle mir bekannten Stack-Prozessoren) pro Befehl auf maximal 2 Eingangs-Parameter zugreifen und maximal 2 Ausgangs-Parameter ausgeben (jeweils die obersten 2 Stackworte). Der Befehl \verb|D+| braucht aber 4 Eingangs-Parameter (2 für jeden Summanden). Anmerkung: Aus dem gleichen Grund sind auch Befehle wie \verb|ROT| oder \verb|OVER| dort nicht als Hardware-Befehle realisierbar. \hfill Willi Stricker