\section{Residente Programme}

\label{refResident}
Compiler und Linker des \mtwoamiga-Systems 
unterst"utzen die Erzeugung residentf"ahiger
Programme, wenn der Programmierer bestimmte Voraussetzungen beachtet,
die wir im folgenden erkl"aren wollen.

\subsection{\near{} und \far{}}

\label{refNearFar}
M2Amiga kennt zwei Arten globaler Variablen. Jedes Modul kann
nur eine dieser beiden Arten deklarieren.
\begin{description}
\item{\far-Variablen} werden standardm"assig erzeugt. Sie werden
vom Prozessor "`absolut lang"' adressiert und unterliegen
keinerlei Ein"-schr"an\-kun\-gen.
\item{\near-Variablen} werden erzeugt, wenn im Modul die Compiler-Option
"`{\tt LargeVars:=FALSE}"' oder von der Kommandozeile
die Option \hbox{"`{\tt -y}"'}
angegeben wird. Diese Variablen werden relativ zum Register A4 adressiert,
was gegen"uber der absoluten Adressierung der \far-Variablen einen
Geschwindigkeitsvorteil bedeutet. Die \near-Va\-ria\-blen unterliegen
allerdings zwei Einschr"ankungen:
\begin{enumerate}
\item Pro Modul d"urfen maximal 32 KByte globale Varia\-blen deklariert
werden.
\item Pro Programm d"urfen maximal 64 KByte globale \near-Va\-ria\-blen
vorhanden sein.
\end{enumerate}
\end{description}

Wenn ein Modul \near-Variablen deklariert, sprechen wir auch davon, es
sei im "`\near-Modus"' kompiliert, im anderen Fall vom "`\far-Modus"'.
Weitergehende Informationen sind im Abschnitt \ref{refNear} zu finden.

\subsection{Resident und Reentrant}

Zun"achst wollen wir einige Begriffe erkl"aren:

\begin{description}
\item[resident] (ans"assig) bedeutet, dass ein Programm permanent im
Hauptspeicher des Amiga gehalten wird, also nicht bei jedem Programmstart
von der Diskette oder Festplatte geladen werden muss. Dadurch wird
enorm Zeit gespart und der Diskettenverschleiss vermindert.
Durch den CLI-Befehl "`{\tt RESIDENT \cmsltt Name}"' wird das
Programm "`{\cmsltt Name}"' in
den Hauptspeicher geladen und in einer systemeigenen Liste vermerkt.
Wenn das CLI oder die SHELL daf"ur eingerichtet ist, kann sie nun
bei einem Programmaufruf zun"achst in dieser Liste nachsehen und
das Programm dann direkt aus dem Speicher starten.

Ein Programm ist genau dann residentf"ahig, wenn der folgende und weitere
Aufrufe zu den gleichen Ergebnissen f"uhren. Es darf also keinesfalls
seinen eigenen Code ver"andern oder von einem bestimmten Inhalt seiner
Variablen ausgehen.

\item[reentrant] (wiedereintrittsf"ahig) ist eine Steigerung von
 "`residentf"ahig"'. Ein Programm ist reentrant, wenn es {\em gleichzeitig\/}
mehrfach gestartet werden kann. Hierbei wird f"ur die verschiedenen
"`Inkarnationen"' jeweils derselbe, resident im Speicher gehaltene
Code ausgef"uhrt, aber die beim Programmlauf ver"anderlichen Daten
(Variablen) m"ussen bei jedem Aufruf neu angelegt und bei Programmende
wieder freigegeben werden. Hierdurch arbeitet jeder so gestartete
Prozess mit seinen eigenen Daten, wodurch eine gegenseitige
Be\-ein\-flus\-sung der Prozesse verhindert wird.

Dies ist nicht zu verwechseln mit wiedereintrittsf"ahigen {\em Prozeduren\/}
(die notwendig werden, wenn ein M2Amiga-Programm eigene Tasks oder
Prozesse starten will),
wir reden hier nur von Programmen! Um eine einzelne Prozedur reentrant
zu kodieren ist unter Umst"anden weit mehr Denkarbeit erforderlich.

\end{description}

\noindent
Beide Eigenschaften werden vom Laufzeitsystem Arts unterst"utzt:

Bei "`normalen"' und residentf"ahigen Programmen wird bei jedem
Programmstart der Speicher der \near-Variablen mit Nullen initialisiert.
Wenn {\em nur\/} \near-Variablen im Programm vorhanden sind, ist
das Programm folglich residentf"ahig.

F"ur Programme, die reentrant sind, wird vom Betriebssystem Speicher
angefordert und die initialisierten Daten 
dort hineinkopiert.
Damit ein Programm reentrant sein kann, d"urfen einzig Variablen
vom Typ \near{} vorhanden sein.

Zus"atzlich zur Speicher-Allokation "uberpr"uft das Laufzeitsystem
bei wiedereintrittsf"ahigen Programmen auch die Gr"osse des vorhandenen
Stapels (Stack).
Ist dieser kleiner als eine Mindestgr"osse, die beim Linken angegeben
werden kann, so wird auch f"ur den Stack ein eigener Speicher reserviert.
Deshalb ist es beispielsweise m"oglich, dass der Compiler, der in Extremf"allen
20 KByte und mehr Stack ben"otigt, auch von einem CLI gestartet werden
kann, dessen STACK auf 4000 Byte eingestellt ist.

Da der Schritt von residentf"ahig nach reentrant relativ klein ist
und im fertigen Programm durch ein unterschiedliches Laufzeitsystem
lediglich einige Byte kostet, werden wir im folgenden davon
ausgehen, dass residentf"ahige Programme als reentrant gelinkt werden
und beide Begriffe synonym verwenden.

Der Programmierer kann sich immer darauf verlassen, dass die globalen
Variablen des Programmes mit dem Wert Null initialisiert sind, wenn
es seinem Typ entsprechend (nichtresidentf"ahig, residentf"ahig,
reentrant) eingesetzt wird.

\subsection{Fazit}

Um ein Programm reentrant zu machen, m"ussen alle Moduln im
\near-Modus kompiliert werden (Option \hbox{\tt -y}). Alle
mitgelieferten Bibliotheksmoduln --- Profiler ausgenommen ---
sind im \near-Modus kompiliert.

Selbst wenn ein Programm nicht resident gehalten werden soll, ist
es kompakter, schneller und sicherer\footnote{wegen der garantierten
Stackgr"osse}, wenn es
reentrant compiliert und gelinkt wird.

