<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">\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&gt; @ &gt;R ;
\end{verbatim} 
funktioniert, wÃ¤re also einsetzbar! Anders verhÃ¤lt es sich mit der Definition:
\begin{verbatim}
	: LIT R@ @ R&gt; 2 + &gt;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&gt; 2 + &gt;R ELSE R&gt; @ &gt;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 =&gt; 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</pre></body></html>