\documentclass[a4paper,twocolumn]{article}

\usepackage[utf-8]{inputenc}
% \usepackage[latin1]{inputenc}
\usepackage[german]{babel}
\usepackage{url}
\usepackage{alltt}
\usepackage{multicol}

\parskip4pt

%llncs float params
\setcounter{topnumber}{3}
\def\topfraction{.9}
\setcounter{bottomnumber}{1}
\def\bottomfraction{.3}
\setcounter{totalnumber}{3}
\def\textfraction{.15}
\def\floatpagefraction{.85}
\setcounter{dbltopnumber}{3}
\def\dbltopfraction{.85}
\def\dblfloatpagefraction{.85}

\renewcommand{\code}[1]{\texttt{#1}}
%\wfig{content}{label}{caption}
\renewcommand{\wfig}[3]{
\begin{figure*}\hrule\vspace{1ex}
\centerline{#1}\vspace{1ex}
\hrule
\caption{#3}
\figlabel{#2}
\end{figure*}
}
%\nfig{content}{label}{caption}
\renewcommand{\nfig}[3]{
\begin{figure}\hrule\vspace{1ex}
\centerline{#1}\vspace{1ex}
\hrule
\caption{#3}
\figlabel{#2}
\end{figure}
}
\renewcommand{\figlabel}[1]{\label{fig-#1}}
\renewcommand{\figref}[1]{\ref{fig-#1}}
\renewcommand{\fig}[1]{Abb.~\figref{#1}}
\renewcommand{\Fig}[1]{\figurename~\figref{#1}}
\renewcommand{\sectref}[1]{\ref{sect-#1}}
\renewcommand{\sect}[1]{Section~\sectref{#1}}
\renewcommand{\Sect}[1]{Section~\sectref{#1}}

\title{Der Forth-Stammbaum}%[Der Forth-Stammbaum]
\author{M.~Anton Ertl}

\begin{document}
\maketitle

In der Mitte des Hefts ist ein Stammbaum von Forth-Systemen und
Forth-Standards zu sehen.  Der Stammbaum enthält zwei Arten von
Knoten:

\begin{description}

\item[Systeme] (normale Schrift) Ausführbare Forth-Systeme.

\item[Standards] (fett gedruckt) Spezifikationen der Sprache Forth.

\end{description}

Der Stammbaum enthält drei Arten von Kanten:

\begin{description}

\item[Abstammen] (schwarz voll) Ein System (das Kind) enthält
beträchtliche Mengen Code eines anderen Systems (des Elternsystems),
oder zumindest war das am Anfang der Entwicklung des Kindes so.  Bei
Standards wird Text oder zumindest Forth-Wörter vom Eltern-Standard
übernommen.

\item[Erfüllen] (schwarz strichliert) Ein System erfüllt einen
Standard; man kann auch sagen, das System implementiert den Standard.

\item[Inspiriert] (grau voll) Wörter oder Konzepte von einem
Forth-System wurden in ein anderes Forth-System übernommen, ohne Code
zu übernehmen.  Nur die wichtigsten Inspirationskanten werden gezeigt,
um eine weitere Überfrachtung der Graphik zu vermeiden.

\end{description}


\subsection{Aber das Forth-System X fehlt!}

Das liegt daran, dass mir noch niemand Daten über X geschickt hat.
Nicht aufregen, einfach die Information senden (siehe unten).

\subsection{Aktualisierung und Online-Version}

Dieser Stammbaum ist nicht endgültig, sondern er wird erweitert, wenn
neue Daten dazukommen.  Die jeweils aktuelle Version findet man auf
\url{http://www.complang.tuwien.ac.at/forth/family-tree/}.  Dort
findet sich neben dem Stammbaum auch noch eine Timeline: eine Variante
des Stammbaums, auf der die Forth-Systeme und Forth-Standards nach dem
Zeitpunkt des Erscheinens auf einer Zeitlinie angeordnet sind (die
Timeline ist aber leider für dieses Heft zu breit und daher nicht
abgedruckt).  Die Online-Version hat außerdem auch noch Tooltips mit
Zusatzinformationen (z.B. über Autoren oder Features) und Links auf
Informationen zu vielen der Systeme oder ihrer Geschichte (einfach auf
den Namen des Systems oder des Standards klicken).


\subsection{Wie schicke ich Information ein?}

Am einfachsten schickst Du mir die Information einfach als
Textbeschreibung (aber schon so, dass mir klar ist, was Abstammung ist
und was Inspiration etc.), und ich schreibe dann den entsprechenden
Code.  Meine Email-Adresse ist \url{anton@mips.complang.tuwien.ac.at}.


\subsection{Wie verstehe ich \code{tree.fs}?}

Die Quelldatei der beiden Graphen ist \path{tree.fs}.  Falls Du sie
verstehen oder selbst damit experimentieren willst:

Zunächst muss man die Knoten (Systeme/Standards) definieren, und zwar
wie folgt:

\begin{verbatim}
<Jahr> s" <En>" name-implementation <Kn>
<Jahr> s" <En>" standard <Kn>
\end{verbatim}

Das Jahr ist dabei das (erste) Erscheinungsjahr.  \path{<En>} steht
für den (Eigen-)Namen der Implementation oder des Standards, der in
der Graphik angezeigt wird.  \path{<Kn>} steht für den Knotennamen,
der in den Kantendefinitionen verwendet wird.

Für den Eigennamen ist die Syntax sehr frei; dagegen darf ein
Knotenname nur so ausschauen wie ein Name in C, er darf also nur aus
Buchstaben, Ziffern, und \path{_} bestehen, aber nicht mit einer
Ziffer anfangen.  Wenn der Eigenname eines Systems schon diesen
Kriterien entspricht, kann man die Definition auch abkürzen:

\begin{verbatim}
<Jahr> implementation <Kn>
\end{verbatim}

\noindent Beispiele:

\begin{verbatim}
2002 s" 4IM" name-implementation fourIM
1994 s" ANS Forth" standard Forth94
1996 Implementation Gforth
\end{verbatim}

Man kann eine URL und eine Kurzinformation (für den Tooltip)
hinzufügen, indem man unmittelbar \emph{vor} der Knotendefinition
Folgendes schreibt:

\begin{verbatim}
\U <URL>
\I <tooltip text>
\end{verbatim}

Diese Informationen werden in der Online-Version benutzt.  Übrigens
braucht man eine URL, damit der Tooltip-Text angezeigt wird.

Wenn man die Knoten definiert hat, kann man sie auch verwenden, um
Kanten zu definieren.

\begin{verbatim}
<Kn1> begot <Kn2>       \ Abstammen
<Kn2> conforms-to <Kn1> \ Erfüllen
<Kn1> inspired <Kn2>    \ inspiriert
\end{verbatim}

\noindent Beispiel:

\begin{verbatim}
\U http://www.jwdt.com/~paysan/gforth.html
\I Free, portable and fast
1996 Implementation Gforth
Gforth conforms-to Forth94
BigForth begot Gforth
figForth inspired Gforth
F83 inspired Gforth
\end{verbatim}

Weitere Informationen sind, wenn vorhanden, in Kommentaren
untergebracht.
\addtocounter{page}{2}
\subsection{Wie funktioniert es?}

Die Quelldatei ist \path{tree.fs}, ein Forth-Programm, das mittels
Gforth ausgeführt wird und \path{tree.dot} ausgibt; Letzteres ist die
Eingabe für \path{dot} (ein Programm aus der Graphviz-Suite zur
graphischen Darstellung von gerichteten Graphen); \path{Dot} kann
Graphiken für den Graphen in mehreren Formaten ausgeben,
u.a. Postscript.  Weiters gibt \path{dot} Y-Koordinaten für die Knoten
aus, die dann in einem weiteren Lauf von \path{tree.fs} verwendet
werden, um \path{timeline.neato} zu erzeugen; das ist im Prinzip die
gleiche Datei wie \path{tree.dot}, nur sind die Knotenpositionen
festgelegt: die X-Koordinate durch das Erscheinungsjahr, und die
Y-Koordinate durch die Position im tree-Graphen.  \path{Neato} (ein
weiteres Graphviz-Werkzeug) verarbeitet dann \path{timeline.neato} und
produziert die Timeline.  Weiters erzeugen \path{dot} und \path{neato}
noch andere Formate, insbesondere \path{.gif} und \path{.map}
(client-side image map) für die Web-Version, und eine auf mehrere
Seiten aufgeteilte Version der Timeline.  Aus den Postscript-Versionen
wird PDF erzeugt.


\subsection{Heimwerken}

Wenn Du selbst an dem Stammbaum herumbasteln oder einen eigenen
Stammbaum erzeugen willst, kannst Du Dir den Quellcode von der oben
angegebenen Adresse holen, \path{tree.fs} editieren und \path{make}
aufrufen.  An Werkzeugen brauchst Du GNU make, Gforth, graphviz,
Ghostscript, awk und die netpbm-Werkzeuge, wenn man das aktuelle
Makefile verwendet (weniger, wenn man nicht alle Formate erzeugen
will).

\subsection*{Danksagung}

Viele Leute haben mir Informationen geschickt, die in dem Stammbaum
dargestellt sind.  Ich habe leider nicht alle notiert, die dazu
beigetragen haben, aber darunter sind: Astrobe, John Doty, Marcel
Hendrix, Doug Hoffman, George Hubert, Guy Macon, Alex McDonald, Ward
McFarland, Krishna Myneni, Stephen Pelc, Friederich Prinz, Elizabeth
Rather und Klaus Schleisiek.

Eine weitere Quelle war der Artikel über die Geschichte von Forth
\cite{rather+96}, der sehr empfehlenswert und
online\footnote{\url{http://www.forth.com/resources/evolution/}}
verfügbar ist.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\bibliographystyle{alpha}
%\bibliography{../d}

\begin{thebibliography}{RCM96}

\bibitem[RCM96]{rather+96}
Elizabeth~D. Rather, Donald~R. Colburn, and Charles~H. Moore.
\newblock The evolution of {Forth}.
\newblock In {\em History of Programming Languages}, pages 625--658. ACM
  Press/Addison-Wesley, 1996.

\end{thebibliography}

\end{document}
