% Studienarbeit von Ulrike Steffens
%
% Universitaet Hamburg
% Fachbereich Informatik
% Arbeitsbereich DBIS
%
% Kapitel: Tycoon: Eine persistente, interoperable Systemumgebung
% 2.4.96

\chapter{Tycoon: Eine persistente, interoperable Systemumgebung}
\label{Tycoon}
Im Rahmen des Projektes Tycoon\footnote{Tycoon: Typed communicating objects
in open environments.}\index{Tycoon} am Arbeitsbereich Datenbanken und Informationssysteme
des Fachbereichs Informatik der Universit"at Hamburg wurde eine offene,
heterogene 
Systementwicklungsumgebung\index{Systementwicklungsumgebung}
 geschaffen. Diese sollte zum einen eine persistente,\index{persistent}
polymorphe\index{polymorph} Programmiersprache mit einem 
Typsystem\index{Typsystem h"oherer Ordnung} h"oherer Ordnung zur
Verf"ugung stellen, um Programmierer bei der Erstellung neuer und der 
Einbindung bereits existierender generischer\index{generischer Dienst} Dienste zu unterst"utzen. Zum
anderen sollte dieser Sprache eine Architektur zugrunde liegen, die es m"oglich
macht, bei der Programmierung von allen technischen Anforderungen au"serhalb
der Programmiersprache zu abstrahieren.

\section{Architektur des Tycoon-Systems}
\label{tycoonArch}
Das Tycoon System\index{Tycoon System} l"a"st sich in verschiedene Schichten einteilen, die ihrer
Aufgabe nach zu unterscheiden sind (vgl. Abbildung \ref{systemOverview}).
\begin{figure}[hbt]
\begin{center}
\leavevmode
\epsfxsize=10cm \epsfysize=10cm
\epsffile{/usr/users/stud/steffens/Studienarbeit/Latex/Bilder/overview.epsf}
\end{center}
\caption[Ein "Uberblick "uber die Tycoon Systemschichten]{Ein "Uberblick "uber die Tycoon Systemschichten [MSS95]}
\label{systemOverview}
\end{figure}

\subsection{Tycoon Speicherprotokoll}
\label{tsp} 
Das Tycoon Speicherprotokoll\index{Tycoon Speicherprotokoll}
 ({\em Tycoon\index{Tycoon Store Protocol} 
Store Protocol, TSP}) verbindet die verschiedenen 
Objektspeicher\index{Objektspeicher} des Systems
mit der Tycoon\index{Tycoon Maschine}
 Maschine ({\em Tycoon\index{Tycoon Machine}
 Machine, TM}) \cite{mss95}. Dazu stellt es Funktionen, wie z.B. das Einrichten 
oder L"oschen eines Speichers oder das Anlegen neuer Objekte im Speicher, bereit. 
Spezielle Merkmale der zugrunde liegenden Objektspeichersysteme bleiben 
hierbei verborgen. Das TSP ist in ANSI C\index{C} realisiert.

\subsection{Virtuelle Tycoon Maschine}
\label{tvm}
Die Tycoon Maschine\index{Tycoon Maschine}
 umfa"st den Interpreter\index{Interpreter}
 des Systems und das dazugeh"orige 
Laufzeitsystem\index{Laufzeitsystem}, die beide in ANSI 
C\index{C} erstellt sind und bereits auf verschiedene 
Betriebssystemplattformen portiert wurden. Weiterhin enth"alt die TM
eine Reihe von statisch\index{statische Bindung} oder 
dynamisch\index{dynamische Bindung} gebundenen 
Objektbibliotheken\index{Objektbibliothek}\index{externe Bibliothek}, die
dem System zus"atzliche externe\index{externer Dienst}
 Dienste zur Verf"ugung stellen. Die 
Schnittstelle, die den Zugriff auf die TM erm"oglicht, hei"st 
virtuelle\index{virtuelle Tycoon Maschine} Tycoon 
Maschine ({\em Tycoon\index{Tycoon Virtual Machine} Virtual
Machine, TVM}) \cite{mss95}. Sie besteht aus einer Reihe von Befehlen in 
Bytecode\index{Bytecode}, der
zwischen heterogenen Rechnerknoten ohne eine erneute "Ubersetzung "ubermittelt
werden kann.

Die externen Bibliotheken k"onnen unabh"angig davon, ob sie statisch oder 
dynamisch gebunden sind, von der TVM genutzt werden. Hierzu m"ussen zur
Laufzeit der Name der Bibliothek und der aufgerufenen Funktion sowie eine
Beschreibung der Funktionsargumente und ihrer Typen "ubergeben werden. Der 
Interpreter verf"ugt "uber eine Liste statisch gebundener Bibliotheken und 
Funktionen, die er zun"achst nach der aufgerufenen Funktion durchsucht. Ist
diese Suche erfolglos, so ruft der Interpreter eine Betriebssystemroutine auf,
die versucht, eine dynamische Bindung der Funktion herzustellen.

Es kann jedoch nicht nur im Code der TVM auf externe Funktionen zugegriffen
werden. Auch der Aufruf von TVM-Code in externem Code ist m"oglich. Durch
einen speziellen Bindemechanismus wird ein externer Zeiger auf das jeweilige
TVM-Funktionsobjekt erzeugt und nach au"sen "ubergeben.

Der Austausch von Funktionen zwischen dem Tycoon System und externen
Bibliotheken beschr"ankt sich auf Funktionen, deren Parameter unstrukturierte
Werte, wie z.B. Zahlen, Zeichenketten aber auch Zeiger, sind. Strukturierte
Werte m"ussen vor der "Ubergabe in ihre Komponenten aufgegliedert und
anschlie"send wieder zusammengesetzt werden.

Durch den Aufruf externer Funktionen im TVM-Code kann es dazu kommen, da"s
persistente TVM-Programme mit Zeigern arbeiten, die in Speicherbereiche
au"serhalb des TSP-Speichers verweisen. Die Lebensdauer von Objekten
au"serhalb des TSP-Speichers ist jedoch auf die Dauer eines
Betriebssystemprozesses begrenzt. Dadurch besteht die Gefahr, da"s das 
persistente Programm nach  einem Neustart des Tycoon Systems auf Objekte zugreift, die 
nicht mehr im Speicher vorhanden sind. Um dieser besonderen Anforderung Rechnung zu
tragen, bietet die TVM einen Mechanismus, der das Anlegen und L"oschen
von Objekten au"serhalb des TSP-Speichers aufzeichnet. Anhand der 
Aufzeichnungen ist es m"oglich, die betreffenden Objekte wiederherzustellen,
falls persistenter TVM-Code darauf zugreifen sollte.

\subsection{Weitere Schichten des Tycoon-Systems}
\label{schichten}
Der Bytecode der TVM wird aus Termen der Tycoon Maschinensprache ({\em Tycoon
Machine Language, TML}) generiert. Diese dient als Zwischenrepr"asentation
zwischen den verschiedenen h"oheren Programmiersprachen des Systems und der TVM.
Ihre Aufgabe ist es, die Code-Analyse zur "Ubersetzungszeit und die 
Code-Analyse zur Laufzeit zu vereinheitlichen und den Code der h"oheren
Programmiersprachen zu optimieren.

Im Laufe des Tycoon Projektes wurden die Tycoon Sprache ({\em Tycoon Language,
TL}, vgl. Abschnitt \ref{tl}) und die objektorientierte Tycoon Sprache 
({\em Tycoon object-oriented Language, TooL}) als h"ohere Programmiersprachen 
entwickelt. Sie setzen auf 
der TML auf und sind ihrerseits in eine Arbeitsumgebung integriert, die die 
interaktive Programmierungs- und Benutzungsschnittstelle ({\em
Tycoon top level}) und die Modulverwaltung umfa"st
sowie das Konzept der erweiterbaren Syntax des Systems realisiert.

Anwendungen, die in den h"oheren Programmiersprachen des Tycoon-Systems
implementiert sind, werden in Bibliotheken verwaltet.

\section{Programmiersprache TL}
\label{tl}
Eine der h"oheren Programmiersprachen, die in das Tycoon System integriert sind,
ist die Tycoon Sprache TL \cite{mms94}. Sie besitzt einheitliche Benennungs-, Typisierungs-
und Bindungskonzepte f"ur alle Sprachelemente, die damit zu 
Elementen erster Klasse werden und orthogonal kombiniert werden k"onnen. 

TL folgt dem Konzept des Polymorphismus. Sowohl Subtyppolymorphismus als
auch parametrischer Polymorphismus sind hier realisiert. Auf diese Weise
wird die Kombination verschiedener TL-Programmteile vereinfacht.

Die Orthogonalit"at, der Polymorphismus und die strenge Typisierung in
TL erm"oglichen die Definition, Integration und Kombination verschiedener
generischer Dienste. Durch die polymorphe Typisierung wird eine Abstraktion
von den Besonderheiten des jeweiligen Dienstes erreicht. Das Typsystem 
unterbindet statisch die fehlerhafte Verwendung von Operationen und 
gew"ahrleistet hierdurch die Konsistenz zwischen den verschiedenen
Diensterbringern.

Die einzelnen Dienste sind in einem System aus Modulen, Schnittstellen und
Bibliotheken eingebunden (vgl. Abschnitt \ref{modules}). TL beinhaltet
ein Sprachkonstrukt zur Anbindung von Bibliotheken und
Programmierschnittstellen der Programmiersprache C.

TL ist "uber die Tycoon Maschinensprache TML mit den weiteren Schichten des Tycoon Systems verbunden (vgl. Abschnitt \ref{schichten}). Dadurch kann in der Sprache die Persistenz des Systems genutzt werden, ohne die
systemimmanenten Anforderungen, wie z.B. Verwaltung des Haupt- und Zwischenspeichers
oder Speicherbereinigung ({\em garbage collection}), erw"agen zu m"ussen.

Das Laufzeitsystem von TL unterst"utzt ein Verfahren zur Fehlerbehandlung, das
Programme auch in zuvor definierten Ausnahmezust"anden korrekt terminieren
l"a"st.

Die Sprache TL wird in einer interaktiven Programmier- und Benutzungsumgebung, dem {\em
Tycoon top level}, verwendet, die der Umgebung interaktiver Sprachen, wie 
ML oder Lisp, "ahnlich ist. Der Tycoon top level unterst"utzt die direkte
Eingabe von TL-Konstrukten, die Ausf"uhrung von TL-Programmen und die
Eingabe von Befehlen, die den Zustand des top levels selbst betreffen.
Jeder Benutzer arbeitet auf einem eigenen top level, der dadurch jeweils einen
lokal begrenzten Namensraum bildet.

\subsection{Typisierung in TL}
\label{tltypes}
TL ist eine strikt typisierte Sprache \cite{mat93}. Wert- und Typbezeichner k"onnen an jeder Stelle eines TL-Programmes explizit
durch die ihnen entsprechende Typinformation erg"anzt werden. F"ur Bezeichner,
die dynamischen oder rekursiven Bindungen unterliegen, wie z.B.
Parameter von Funktionen, ist diese explizite Form der Typisierung 
obligatorisch. F"ur andere Bezeichner kann die Typinformation bei der
"Ubersetzung abgeleitet werden \cite{mat93}.

Die Typisierung eines Bezeichners {\em x} mit dem Typ {\em A} wird
in TL wie folgt zum Ausdruck gebracht:
\begin{xple}
x :A
\end{xple}
Ein TL-Konstrukt dieser Form hei"st Signatur. Durch eine Signatur wird
der betreffende Bezeichner jedoch nur teilweise spezifiziert. Ein Wert der
Variablen {\em x} mu"s zumindest die Spezifikation, die durch den
Typ {\em A} gegeben ist, erf"ullen. Er kann dar"uber hinaus aber weitere
Merkmale besitzen. Hieraus ergibt sich eine partielle Ordnung auf der
Menge der TL-Typen, die sich in der Subtyprelation der Sprache ausdr"uckt.
Das Konstrukt
\begin{xple}
B $<$:A
\end{xple}
bedeutet, da"s {\em B} pr"aziser ist als {\em A} oder, mit anderen
Worten, da"s {\em B} Subtyp von {\em A} ist \cite{mms94}.
Die induktiv definerte Subtyprelation ist eine der Grundlagen des
in TL realisierten Konzeptes des Polymorphismus \cite{mat93}.

\subsection{Persistenz in TL}
\label{tlpersistence}
Das Konzept der Persistenz besteht in TL gleicherma"sen f"ur Werte,
Funktionen und Typbindungen. Persistente TL Objekte sind entweder
aus einem gebundenen Modul oder vom Tycoon top level aus erreichbar.

Wird im Rahmen eines TL-Programmes ein konsistenter Zustand des
Tycoon Speichers erreicht, so kann dieser Zustand explizit stabilisiert
werden. Daf"ur steht sowohl eine Funktion innerhalb eines Moduls
als auch ein top level Befehl
zur Verf"ugung. Beide sichern den augenblicklichen Zustand
des Tycoon Speichers. Verl"a"st der Benutzer 
den top level oder kommt es zu einem Systemabsturz, so
werden alle "Anderungen seit der letzten Stabilisierung zur"uckgenommen.
Zu Beginn der n"achsten Sitzung mit dem Tycoon System befindet
sich der Tycoon Speicher somit in dem zuletzt stabilisierten Zustand.

Das R"ucksetzen des Systems auf einen Stabilisierungspunkt w"ahrend einer Sitzung ist ebenfalls
m"oglich \cite{mms94}. 

\subsection{Anbindung externer C-Bibliotheken}
\label{tlcbib}
Der Austausch von Funktionen zwischen den Programmiersprachen TL und C
ist in beide Richtungen m"oglich. C-Funktionen k"onnen als Funktionswerte
in TL aufgenommen werden, und TL-Funktionen k"onnen so umgeformt werden, da"s sie 
in C in Form eines Zeigers auf eine Funktion genutzt werden k"onnen \cite{mms94}.

\subsubsection*{Aufruf externer C-Funktionen in TL}
Durch die vordefinierte Funktion {\em bind} werden externe Funktionen
an TL-Funktionswerte gebunden. Die Funktion besitzt folgende Signatur:
\begin{xple}
bind(Function $<$:\k{Ok} library, label, format :String) :Function
\end{xple}
Der Funktion {\em bind} wird mit {\em Function} eine Beschreibung der resultierenden
TL-Funktion "ubergeben. Der Parameter {\em library} bezeichnet die 
Bibliotheksdatei, in der sich die anzubindende C-Funktion befindet. Der
Parameter {\em label} enth"alt den Namen dieser Funktion. Die
Zeichenkette {\em format} beschreibt das Parameterformat der C-Funktion.
Hierbei steht jedes einzelne Zeichen f"ur einen C-Parameter. Die Zeichen
sind wie die Parameter in C von links nach rechts geordnet. Der
R"uckgabeparameter ist durch das letzte Zeichen der Zeichenkette
dargestellt.
\newline
\newline
Die Anbindung der C-Funktion
\begin{verbatim}
   void inq_set_query_stemming (Boolean_t on_off)
\end{verbatim}
sieht in TL folgenderma"sen aus:
\begin{xple}
  {\bf let} lib = "{}/local/dbis1/software/inquery/lib/libinquery.a"{}

  {\bf let} setStemmingCall =
   bind(:\k{Fun}(:Bool) :\k{Ok} lib "{}inq\_set\_query\_stemming"{} "{}bv"{})
\end{xple}
Ein Aufruf von {\em setStemmingCall} in TL 
\begin{xple}
   setStemmingCall(true)
\end{xple}
f"uhrt zur Ausf"uhrung der C-Funktion {\em inq\_set\_query\_stemming}.

\subsubsection*{Aufruf von TL-Funktionen aus externen C-Programmen}
Nicht nur der Aufruf von C-Funktionen aus TL heraus ist m"oglich, sondern
auch umgekehrt der Aufruf von TL-Funktionen in externen C-Programmen. Dieses
ist dann sinnvoll, wenn aus TL eine C-Funktion aufgerufen wird, die eine
weitere Funktion als "Ubergabeparameter verlangt. Diese Parameterfunktion kann
dann in TL definiert und in C benutzt werden.

Um den Implementationsaufwand auf der C-Seite m"oglichst gering zu halten, werden
die hier zu nutzenden TL-Funktionen als C-Funktionszeiger "ubergeben. Der 
entsprechende TL-Typ hierf"ur ist im Modul {\em cCallback.tm} unter dem Namen
{\em cCallback.T} definiert. Ein Wert dieses Typs kann mit der Funktion
{\em cCallback.new}, die ebenfalls in {\em cCallback.tm} implementiert ist,
erzeugt werden.

\subsection{Module, Schnittstellen und Bibliotheken}
\label{modules}
Die strukturierte Implementation gro"ser Programme wird in TL durch 
Modularisierung unterst"utzt. Das Gesamtprogramm wird in "uberschaubare
Teile gegliedert, deren Code sich in Modulen befindet. Den Modulen 
entsprechende Schnittstellen definieren in einer Exportliste die nach au"sen 
hin sichtbaren Signaturen von Werten, Funktionen, Typen und Typoperatoren. 

Da in realen Systemen wie dem Tycoon System die Zahl der Module schnell
ansteigt, beinhaltet TL zus"atzlich ein Bibliothekskonzept. Eine
Bibliothek begrenzt den Sichtbarkeitsbereich der in ihr enthaltenen
Module und Schnittstellen und erlaubt somit die Definition von 
Subsystemen. Die Implementation versteckter Module und Schnittstellen
sowie die Zuordnung mehrerer Module zu einer Schnittstelle ist in
TL-Bibliotheken zul"assig.

