\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}