\documentclass[11pt,a4paper]{article}
\usepackage[german]{babel}
\usepackage[utf8]{inputenc} % can use Umlauts now ü instead of "u
\begin{document}

\title{Kontrollstrukturen als Colon-Definitionen und ohne die Immediate-Eigenschaft ?}
\shorttitle{Kontrollstrukturen als Colon-Definitionen}
\author{Fred Behringer}
\date{~}

\maketitle


\begin{multicols}{2}

\section{Vorweg}

DOS, und wenn ja, welches? Ich habe forth.com (das Turbo-Forth-System) u.a.
auch in ein FAT16-Verzeichnis auf einem 1-GB-Stick gepackt. Dazu dann 
listing.txt (das für diesen Zweck extra so eingerichtete Listing des
vorliegenden Artikels - natürlich ohne die Zeilennummern des VD-Heftes). Und 
das Ganze dann unter XP mit dem Explorer per forth aufgerufen. Dann über die
Tastatur include listing.txt eingegeben. Ging alles bestens! Mit anderen
Worten, ich konnte damit alle hier vorgeschlagenen Forth-Worte ohne 
Schwierigkeit auf ihr Funktionieren hin überprüfen. 

Turbo-Forth-16 hat nur 25,5 KB und stellt eine Antwort auf eine Frage in
dclf nach einem 'kleinen' Forth dar!


\section{Voraussetzungen}

Es möge ein Colon-Compiler zur Verfügung stehen. Das braucht kein ausgereiftes
Forth-System zu sein. Ein geschrumpftes System genügt. Ulrich Hoffmann hat
in [UH91] einen Artikel über 'Ein Weg, wie man Forth klein macht' geschrieben. 
Man vergleiche auch [FB99]. In TF83 gibt es die Möglichkeit, das Forth-System 
so auf die jeweilige Anwendung zuzuschneiden, dass es nur noch die tatsächlich           
verwendeten Forth-Worte enthält. Man könnte auch in Richtung Einwort-Compiler 
[JF09] denken. Als Einwort-Primitive? Warum nicht? Ich gehe von Turbo-Forth-83 
in der 16-Bit-Ausführung (im Weiteren als TF83 bezeichnet) für den PC unter 
DOS aus. Zum Hochziehen eines neuen Forth-Systems sollen (nur) die Primitives 
von Willi Stricker [WS09] oder/und die jeweils daraus schon konstruierten
Colon-Definitionen zugelassen werden. Das Primitive-Wort +c aus [WS09] werde
durch das als Primitive gefasste d+ aus [FB11] ersetzt. Dass Konstanten beim
Compilieren schon von Anfang an eingebracht werden können, betrachte ich, wie 
auch in [WS09] geschehen, als selbstverständlich. Es waere auf jeden Fall gut,
die Überlegungen des vorliegenden Artikels in Bezug auf die gemachten
Voraussetzungen alle noch einmal rigoros durchzugehen.



\section{Ergebnisse}

Die drei Primitives lit branch ?branch aus [WS09] können eingespart und durch
Colon-Definitionen ersetzt werden. (lit aus [WS09] wird in TF83 als (lit)
bezeichnet.) Es wird ein Hilfswort ?branch2 zum Überspringen mit fester
Sprungweite 2 als Colon-Definition eingeführt. Damit gelingt es, die Worte
?dup min max abs dabs lshift rshift aus dem Kernel von [WS09] als
Colon-Definitionen ohne if-then zu schreiben.


\section{Vermutungen}

Einiges deutet darauf hin, dass der gesamte Kernel aus [WS09] schon mit den
hier besprochenen Mitteln, ohne Kontrollstruktur-Elemente und unter
Berücksichtigung der hier genannten Primitive-Einsparungen, geschrieben werden
kann. Vieles deutet darauf hin, dass sich neben den im Vorliegenden behandelten
Worten begin exit again auch die restlichen Kontrollstruktur-Worte if else then
until while repeat als Colon-Definitionen und ohne die Immediate-Eigenschaft
schreiben lassen. Die Konstrukte if-else-then, begin-until und
begin-while-repeat werden für die hier behandelten Kernel-Worte aus [WS09] 
auf Umwegen (über Ersatzkonstruktionen) auch schon im Vorliegenden erledigt 
(siehe Listing).


\section{Mein Interesse für minimale Primitive-Sätze}

wurde u.a. durch die Arbeiten [RA98], [BP98] und [WS09] geweckt. Ein paar
Gedanken sind mir dazu in [FB09] eingefallen. Anregungen in Bezug auf
Kontrollstrukturen als Colon-Definitionen ohne Immediate-Eigenschaft durfte
ich aus [CH93] schöpfen. Die Vermeidung von Assembler in Forth-Worten wurde 
kürzlich in [WS11] angeschnitten. Auf die Idee mit d+ als Primitive zum Ersatz 
von if-then-Abfragen [FB11] kam ich über eine Bemerkung von [AN06]. In 
Verbindung mit Compilation und Meta-Compilation habe ich viel mit [RZ87] und 
[ZP88] gearbeitet. Neuerdings kam mir dazu [JF09] zu Gesicht. Bei Fragen des
Forth-Standards habe ich vorwiegend unter [AF94] nachgeschlagen.


\section{Meta-Compilation?}

Liest man im Quelltext von TF83 über dessen erste Hochziehung nach, so sieht
man, dass das Ganze auf eine schrittweise immer wieder neu angesetzte
inkrementelle Meta-Compilation hinauslief. Was aber heißt Meta-Compilation?
Blättert man im Quelltext des Meta-Compilers PHENIX von TF83 [ZP89] nach, so
wird man an die Wand gedrückt: Ein gar nicht so kleiner Meta-Forth-Quelltext,
der zu seiner Compilation ein ausgereiftes TF83-Forth-System benötigt. Zudem
erscheinen auch schon im zu compilierenden Quelltext des hochzuziehenden
eigentlichen Forth-Systems einzelne Meta-Compiler-Anweisungen. Ein ziemlicher
Aufwand! Eigentlich ist doch der Colon-Compiler schon Compiler genug - und
sollte für die inkrementelle Compilation ausreichen (?)


\section{Cross-Metacompilation?}

Allerdings muss man zugeben, dass die Trennung von Meta-Compilation und
Compilation auch ihre Vorteile hat. Beim Aufbau meines Transputer-Forth-Systems
F-TP 1.0 (liegt u.a. auf dem amerikanischen FTP-Server taygeta.com) habe ich
mich Anfang der Neunziger jedenfalls über diese Trennung gefreut. Sie machte
es mir leichter, die angestrebte Meta-Compilation gleich auf eine
Cross-Meta-Compilation auszudehnen: Mit Hilfe eines auf dem PC unter DOS
laufenden 16-Bit-TF83, das den Metacompiler beherbergte, wurde ein
32-Bit-Forth-System für einen ganz anderen Prozessor, nämlich für den
INMOS-Transputer T800, hochgezogen. Dass das nicht ohne gelegentliche
Einsprengsel von Elementen des Metacompilers in den vom Metacompiler eigentlich
'automatisch' zu übersetzenden Quelltext des hochzuziehenden Forth-Systems
abging, störte mich damals weniger.


Einzelheiten zu den Vorschlägen
finden sich (auch) im Listing.



\section{Literatur}


[AF94] ANS-Forth-Standard: The American National Standard
        for the Forth language (ANSI X3J14:1994).

[RA98] Allwright, Ray: From the Net: Minimal Word Sets.
        Forthwrite (FIGUK) 95, 3/1998.

[FB99] Behringer, Fred: So kriegt man Forth auch klein.
        Vierte Dimension 1/1999.

[FB09] Behringer, Fred: Drei Primitives weniger in Willi Strickers
        Forth-Minimalbasis. Vierte Dimension 4/2009.

[FB11] Behringer, Fred: Über Flags in Forth. 
        Vierte Dimension 1/2011, S.33-34.

[JF09] Fox, Jeff: Man suche in Google unter 'A one-word metacompiler'.

[CH93] Haak, Coos: 'Lusstructuren maken zonder IMMEDIATE'.
        Vijgeblad 43 (1993), S.10. Auch unter
        http://www.forth.hccnet.nl/vijgebladarchief/ - 118k .

[UH91] Hoffmann, Ulrich: Ein Weg, wie man Forth klein macht.
        Vierte Dimension 1/1991.

[AN06] Nijhof, Albert: E-Mail an [FB11], wiedergegeben in Übersetzung.
        Vierte Dimension 1/2006, S.10.

[BP98] Paysan, Bernd: Beitrag 'Aus dem Netz', besprochen in [RA98].

[WS09] Stricker, Willi: Minimaler Basis-Befehlssatz für ein Forth-System.
        Vierte Dimension 3/2009, S.15-17.

[WS11] Stricker, Willi: Forth-Compiler-Hilfsbefehle als High-Level-Befehle.
        Vierte Dimension 3/2011, S.20-21.

[RZ87] Zech, Ronald: Forth 83, Franzis-Verlag 1987.

[ZP88] Zupan, M. et M. Petremann: Méta-Compilateur Turbo-Forth PHENIX 1.0 (1988)
        [= Paramétrable, Homologique, Elliptique, Néoténique, Intégral, X-tra].

\end{multicols}

\section{Listing}

\begin{quote}
  \begin{small}
    \listinginput[1]{1}{2011-04/Behringer_KontrollStrukturen_Listing.frt}
  \end{small}
\end{quote}

\end{document}