% Studienarbeit von Marc Weikard
%
% Universitaet Hamburg
% Fachbereich Informatik
% Arbeitsbereich DBIS
%
% Kapitel: Tycoon-System


\chapter{Das Tycoon-System}
\label{Kap. TycoonSystem}

Die Programmierumgebung Tycoon \cite{Matt93} bietet einen geeigneten Rahmen zur effizienten Implementierung moderner Informationssysteme \cite{MSS96}. Ihre offene und skalierbare Architektur er"offnet vielf"altige Einsatzm"oglichkeiten,  von der Einzelplatzinstallation bis hin zur Nutzung  in verteilten heterogenen Mehrbenutzerumgebungen.

Die persistente, polymorphe Programmiersprache TL (\s{Tycoon Language}) mit ihrem Typsystem h"oherer Ordnung erm"oglicht die Beschreibung und Integration generischer Dienste in einem einheitlichen Kontext. Sie kombiniert Vorteile und Leistungsmerkmale integrierter Datenbankprogrammiersprachen wie DBPL \cite{SM92}, z.B. orthogonale Kombinierbarkeit elementarer Konzepte zur Persistenzabstraktion, typvollst"andige Datenrepr"asentation und Iterationsabstraktion, mit der orthogonalen Persistenz von Systemen wie Napier88 \cite{DCBM89} oder P-Quest \cite{Mull91}.

Die Integration verschiedener existierender Diensterbringer, z.B. relationaler Datenbanken oder grafischer Benutzerschnittstellen, durch polymorphe TL-Bibliotheken gew"ahrleistet den typsicheren Zugriff auf externe Daten und Programme. Gemeinsame Benennungs-, Typisierungs- und Bindungsmechanismen erh"ohen die Flexibilit"at und Korrektheit. Es existiert keine Beschr"ankung auf bestimmte vordefinierte Dienste oder Objekte, das System kann in einfacher Weise an gew"unschte Erfordernisse angepa"st und erweitert werden.

Dieses Kapitel bietet einen "Uberblick "uber die Tycoon-Systemarchitektur, wobei vor allem auf die f"ur die dynamische Codeerzeugung wichtigen Aspekte eingegangen wird.


\section{Die Tycoon-Architektur}
\label{Abs. Tycoon-Architektur}

Abbildung~\ref{TycoonArchitektur} illustriert die Tycoon-Systemarchitektur. Das Tycoon-System wird in die Schichten Objektspeicher, Laufzeitsystem, Compiler-Backend, Compiler-Frontend und Anwendungen unterteilt, welche ihre Dienste mittels wohldefinierter Schnittstellen bereitstellen. Dieses Modell erlaubt die strikte Trennung der Funktionalit"at und so alternative Implementierungen f"ur einzelne Schichten.

\begin{figure}
\begin{center}
\leavevmode
\epsfxsize=12cm
\epsffile{Bilder/TycoonArchitektur.eps}
\caption{Tycoon-Schichtarchitektur}
\label{TycoonArchitektur}
\end{center}
\end{figure}


\subsection{Die Programmiersprache}
\label{Abs. TL}

Die Mehrzweckprogrammiersprache TL\footnote{\s{Tycoon Language}} kann im wesentlichen als eine Weiterentwicklung von Quest und P-Quest angesehen werden. Semantisch ist TL mit den polymorphen funktionalen Sprachen der ML-Familie verwandt, in ihrer Modulstruktur und imperativen Konstrukten spiegeln sich dar"uber hinaus Konzepte der Modula-Sprachfamilie wieder.

Persistenz, Polymorphismus und Funktionen h"oherer Ordnung stellen grundlegende Konzepte der Programmiersprache TL dar. Die Unterst"utzung von Persistenz ist auf der TL-Ebene vollkommen transparent und erfolgt im Zusammenspiel mit dem Tycoon-Speicherprotokoll. Polymorphismus, ein wichtiges Werkzeug zur Erstellung generischer Bibliotheken, existiert in zwei Auspr"agungen, als parametrischer und Subtyppolymorphismus. Funktionen k"onnen als Objekte erster Klasse sowohl als Argumente an andere Funktionen "ubergeben werden, als auch von Funktionen als Ergebnis zur"uckgegeben werden. 

TL definiert nur einige wenige feste Datentypen, wie Ganz- und Flie"skommazahlen, Zeichenketten und Wahrheits-Werte, au"serdem Wertkonstruktoren f"ur Felder, Tupel, Records, variante Tupel und Records sowie Ausnahmen. Die beliebige orthogonale Kombinierbarkeit dieser Konstruktoren zusammen mit rekursiven Typdefinitionen und Typoperatoren erm"oglicht die Modellierung aller im praktischen Einsatz vorkommenden Datenstrukturen, wie Listen, Mengen, Relationen, etc. sowie darauf operierender polymorpher Funktionen.

TL kombiniert imperativen und funktionalen Programmierstil. Es werden imperative Kontrollstrukturen wie z.B. \s{loop, if, case} zur Verf"ugung gestellt. Dar"uber hinaus wird eine dynamische Ausnahmebehandlung (\e{exception handling}) unterst"utzt, um die Integration fehlertr"achtiger Systeme zu vereinfachen.

Der Aufruf von C-Funktionen "uber eine einfache Schnittstelle erm"oglicht die Anbindung der Programmiersprache TL an externe Bibliotheken und Dienste. Die typsichere Nutzung dieser Funktionen ist durch die Zuweisung passender Signaturen auf TL-Seite m"oglich. Die eigentliche Funktionalit"at, wie die dynamische Bindung der Bibliotheken und Konvertierung der Argumente bzw. Resultate, erfolgt durch das Laufzeitsystem.


\subsection{Die Zwischenrepr"asentation}
\label{Abs. TML}

Die Transformation des vom Compiler-Frontend erzeugten abstrakten TL-Syntaxbaums in die Zwischenrepr"asentation TML\footnote{\s{Tycoon Machine Language}} stellt eine wesentliche Vereinfachung der Programmanalyse und -optimierung dar. TML ist eine Darstellung des Programmcodes in \e{Continuation Passing Style} (\e{CPS}). CPS basiert auf dem $\lambda$-Kalk"ul und ist eine geeignete Repr"asentation f"ur funktionale Sprachen. Schleifen, Zuweisungen und andere imperative Konstrukte m"ussen in ad"aquater Weise transformiert werden.

CPS-Funktionen liefern keinen Wert zur"uck, sondern erhalten bei ihrem Aufruf ein zus"atzliches Argument -- die Fortsetzung (\e{continuation}). Diese Fortsetzung ist eine Funktion mit einem an das Funktionsergebnis zu bindenden Parameter, und stellt die Abgabe des Kontrollflusses durch einen Funktionsaufruf dar. Eine Kontrollflu"sanalyse, die die Grundlage f"ur alle Optimierungen darstellt, wird somit "uberfl"ussig.   

Ein gro"ser Vorteil von TML liegt in der geringen Anzahl von Sprachkonstrukten, die von einem Optimierer gehandhabt werden m"ussen. Neben Funktionsabstraktion und -applikation sind dies Variablenzugriffe und elementare Operationen. Die eigentliche Funktionalit"at wird von den elementaren Operationen getragen,  die alle arithmetischen und boolschen Operationen, die Zugriffe auf den Objektspeicher und die Definition rekursiver Funktionen realisieren.
  
Neben einfachen Standardoptimierungen, wie dem Propagieren von Konstanten oder der Auswertung konstanter Ausdr"ucke, kann der im Compiler-Backend implementierte Optimierer auch Funktionsaufrufe durch Funktionsexpansion (\e{inlining}) entfernen.


\subsection{Das Laufzeitsystem}
\label{Abs. TVM}

Die ausf"uhrliche Beschreibung der TVM\footnote{\s{Tycoon Virtual Machine}} und des Laufzeitsystems unter besonderer Ber"ucksichtigung der f"ur die dynamische Codeerzeugung relevanten Aspekte erfolgt in Kapitel~\ref{Kap. virtuelle Maschine}.


\subsection{Die Objektspeicherschnittstelle}
\label{Abs. TSP}

Das Speicherprotokoll TSP\footnote{\s{Tycoon Store Protocol}} definiert eine standardisierte Schnittstelle, die von den Details der zugrundelegenden Implementierung des persistenten Objektspeichers abstrahiert. Es beschr"ankt sich dabei auf einen Satz von Funktionen, die auch von existierenden kommerziellen und frei verf"ugbaren Objektspeichersystemen bereitgestellt werden.

Eine der wichtigsten Eigenschaften des TSP ist die Unterst"utzung polymorpher, inhomogener Speicherobjekte. Um dies auf einfache Weise zu erreichen, wird ein untypisiertes Objektspeichermodell verwendet, in dem alle Werte ein einheitliches Layout und Markierungsschema (\e{tagging}) zur Unterscheidung der einzelnen Datentypen besitzen. Auf allen Systemumgebungen haben diese Speicherworte eine Gr"o"se von 32 Bit, von denen die beiden niederwertigsten Bits zur Markierung dienen und der Rest Nutzdaten enth"alt.

Jedes Objekt besitzt eine Identit"at, die OID (\e{object identifier}), "uber die die Referenzierung und Bindung an andere Objekte erfolgt. Objekte k"onnen nur erzeugt, jedoch nicht wieder freigegeben werden. Die Freigabe erfolgt durch eine automatische Freispeicherverwaltung (\e{garbage collection}),  die alle von einem speziell ausgezeichneten Wurzelobjekt transitiv erreichbaren Objekte persistent h"alt.

Objektreferenzen k"onnen durch die Freispeicherverwaltung ge"andert werden. Alle weiteren im Objektspeicher gehaltenen, jedoch nicht von der Wurzel aus erreichbaren Zustandsvariablen, wie die Ausf"uhrungsumgebung der virtuellen Maschine, m"ussen daher explizit der Kontrolle der Freispeicherverwaltung unterstellt werden. Eine dem Objektspeicher bekanntgegebene Aufz"ahlungsfunktions, die w"ahrend der Speicherfreigabe ausgef"uhrt wird, erf"ullt diesen Zweck.

