\chapter{Einf"uhrung}

Technologische und administrative Entwicklungen erfordern zunehmend
Anwendungen, die komplex strukturierte Massendaten (z.B. Konstruktionsdaten, 
multimediale Daten) verwalten k"onnen. Die Unterst"utzung solcher 
datenintensiven Anwendungen, z.B. durch objektorientierte Datenbanktechnologie, 
ist ein seit einigen Jahren behandeltes Gebiet der Informatik \cite{heuer:92}. 
Auch die Entwicklung von gro"sen Softwaresystemen l"a"st sich als 
datenintensive Anwendung dieser Kategorie betrachten.
Entwurfsanwendungen, wie das Software-Engineering,  werden durch 
relationale Datenbanktechnologie jedoch nur unzureichend unterst"utzt 
\cite{GL85}, denn Software-Komponenten sind komplex strukturierte, voneinander 
abh"angige Werte oder Objekte, die sich nicht ad"aquat auf das Relationenmodell
abbilden lassen.
Weiterhin handelt es sich bei den betrachteten, persistent zu verwaltenden
Entit"aten nicht nur um textuelle 
Repr"asentationen von Zwischenergebnissen des Entwicklungsprozesses 
(z.B. Anforderungsanalysen, Quellcode) oder komplexe 
grafische Darstellungen (z.B. Objektdiagramme, Proze"smodelle). Wesentlich
ist auch die persistente Manipulation von ausf"uhrbaren bzw. bindef"ahigen 
Programmen (Funktionen, Prozeduren etc.), d.h. von Daten im weiteren Sinne, 
im Gegensatz zu oben angef"uhrten nicht ablauff"ahigen Daten.

Diese Sichtweise, Programme als Daten zu interpretieren und umgekehrt, 
Daten als Programme, ist der Grundgedanke von Reflektion und ist fast so alt 
wie die Informatik selbst. Sie geht im Bereich der 
Rechnerarchitektur auf die Entwicklung der von Neumann-Architektur, 
in der theoretischen Informatik auf das Konzept der universellen 
Turing-Maschine und im Bereich der Programmiersprachen auf die Entwicklung von 
Lisp \cite{McC62}, dem Vorreiter aller funktionalen Programmiersprachen, 
zur"uck. Diese Sprachen haben in den letzten zehn Jahren, aufbauend auf
Arbeiten im Bereich polymorpher Typsysteme\footnote{Zur Einf"uhrung
in dieses Gebiet sei auf \cite{CaWe85} verwiesen.} einen starken 
Entwicklungsschub erhalten. Ihre Erweiterung um das Konzept der
orthogonalen Persistenz f"uhrte zu Sprachen wie Napier88 \cite{DCBM89},
Galileo \cite{ACO85}, Fibonacci \cite{AGO91} oder Tycoon \cite{MaSc92}. 
Durch orthogonale Persistenz kann der 
Proze"s des Software-Engineering 
st"arker unterst"utzt werden, denn Funktionen k"onnen, da sie Datenwerte erster
Klasse sind, nicht nur als Argumente "ubergeben oder als Resultat von
Funktionen zur"uckgegeben, sondern auch in persistenten Datenstrukturen 
gespeichert werden. Somit kann ausf"uhrbarer Code in der gleichen
persistenten Umgebung manipuliert werden wie alle anderen Datenwerte, im
Gegensatz zu Lisp-Dialekten jedoch statisch typisiert. 

Ungeachtet der genannten Vorteile polymorph typisierter funktionaler 
persistenter Sprachen haben herk"ommliche, z.B. SQL-basierte relationale 
Systeme einen Entwicklungsvorsprung, was ihre Benutzerschnittstellen 
betrifft. Anwender werden bei ihrer Arbeit in vielf"altiger 
Weise durch grafische Werkzeuge unterst"utzt, die ihnen das Navigieren in der 
Datenbank und die Anfrageformulierung erleichtern, z.B. durch interaktive 
Browser und andere 4GL-Werkzeuge. Daneben k"onnen Benutzer aus der vorhandenen 
Datenbasis auch durch algebraische Ausdr"ucke Werte selektieren, aus diesen 
neue Werte konstruieren und diese wiederum in der Datenbank in strukturierter 
Weise entsprechend der Schemadefinition ablegen. 

Durch die Betrachtung von Daten im weiteren Sinne liegt es nahe, nicht
nur das Data-Engineering durch grafische Werkzeuge zu unterst"utzen, sondern
das Software-Engineering in seiner Gesamtheit,  
denn die T"atigkeit des Software-Entwicklers enth"alt einige Analo\-gien zu 
derjenigen des traditionellen Datenbankbenutzers:
Er sucht nach 
vorhandenen Werten (z.B. Funktionen) und deren Signatur, um sie in neuen 
Werten zu verwenden, die dann die Basisbausteine f"ur komplexere Werte 
darstellen usw. Dabei sollen seine neu erzeugten Software-Bausteine 
Bestandteil der Datenbasis werden, um wiederum anderen Entwicklern zur 
Verf"ugung zu stehen. 
Die Datenbasis der Software-Komponenten wird also st"andig aktualisiert und 
erweitert. Zu den Werkzeugen, die es erlauben, Programme durch direkte 
grafische Manipulation zu konstruieren \cite{FDK*92}, geh"oren generische 
Browser zur Navigation im Objektspeicher, Programmeditoren zur Erzeugung 
nichtlinearer Programmrepr"asentationen (sog. Hyperprogramme \cite{KCC*92}), 
sowie Werkzeuge zur Unterst"utzung der Fehlersuche. In gro"sen, arbeitsteilig 
zu entwickelnden Systemem kommen zudem noch Werkzeuge zum Versions-, Modul- 
und Bibliotheks-Management sowie zur Dokumentation hinzu.

Als Implementierungstechnik f"ur oben genannte Werkzeuge ist
programmiersprachliche Reflektion, d.h. die M"oglichkeit, innerhalb eines
Programmes Code zu generieren und diesen in den Programmablauf zu 
integrieren \cite{BGV92}, bedeutsam. Reflektion dient jedoch
nicht nur indirekt (als Implementierungstechnik f"ur Werkzeuge) der
Produktivit"atssteigerung, sondern auch direkt, denn sie erm"oglicht die
typsichere Entwicklung generischer, typgesteuerter Algorithmen. 


		\section{Aufgabenstellung}

Ziel dieser Arbeit ist es, Dienste und Werkzeuge sowie Konzepte f"ur deren 
systematische Benutzung zu entwickeln, um das oben beschriebene Szenario 
einer {\em reflektiven grafischen Software-Konstruktionsumgebung} f"ur 
die persistente polymorphe Programmiersprache Tycoon\footnote{
{\sf Tycoon:}{\em {\bf T}yped {\bf c}ommunicating {\bf o}bjects in {\bf o}pen 
e{\bf n}vironments}} zu erm"oglichen. Diese Dienste umfassen

\begin{itemize}
\item einen generischen Gateway-Generator zur Integration externer, in C++
implementierter Dienste (insbesondere zur GUI-Programmierung) in die 
persistente Umgebung;
\item die Erweiterung des \TL\footnote{\TL: {\em Tycoon 
Language}}-Compilers in der Weise, da"s zur Laufzeit 
Typrepr"asentationen zur Verf"ugung gestellt werden k"onnen, 
die typsichere reflektive Programmierung erm"oglichen;
\item eine typsichere Schnittstelle zum Tycoon-Compiler, die von
\TL-Programmen aus aufrufbar und 
deshalb zur reflektiven Programmierung geeignet ist; diese wird im folgenden 
als {\em aufrufbarer Compiler} bezeichnet;
\item {\em Environments} als Werte erster Klasse, die einerseits dynamisch 
konstruiert und dem aufrufbaren Compiler als Parameter "ubergeben werden 
k"onnen und andererseits zur Strukturierung von Benutzersichten auf den
persistenten Objektspeicher dienen.
\end{itemize}

Die Implementierung dieser Dienste erfolgt im Rahmen der persistenten 
polymorphen Programmierumgebung Tycoon \cite{Matt93}.
Diese erf"ullt die grundlegenden Voraussetzungen daf"ur, denn Tycoon 
weist folgende Eigenschaften auf:
\begin{description}
\item [Sprachliche Unterst"utzung funktionaler Modellierung:] Basierend auf dem
Lambda-Kalk"ul evaluiert jeder Term zu einem Wert. Funktionen sind Objekte
erster Klasse.
\item [Orthogonale Persistenz:] Daten sind langlebig, unabh"angig von ihrem Typ.
Insbesondere sind keine Konvertierungsfunktionen zwischen strukturierten und
flachen Datenformaten oder Transportfunktionen
vom Hauptspeicher zum Objektspeicher und umgekehrt erforderlich.
\item [Typsichere Integration externer Diensterbringer:] Sie erm"oglicht die
Offenheit des Systems gegen"uber externen Diensten, ohne auf die Vorteile
strenger und statischer Typisierung verzichten zu m"ussen.
\item [Selbstimplementierung des Compilers in TL:] Diese bildet die Grundlage 
einer relativ na\-t"ur\-lichen Implementierung reflektiver M"oglichkeiten,
insbesondere die Darstellung von Programm- und Typrepr"asentationen in \TL\ 
selbst.
\end{description}
Zu den weiteren praktischen Arbeiten geh"oren die Entwicklung eines Prototyps
einer grafischen reflektiven Programmierwerkbank zu Demonstrationszwecken
sowie die Implementierung von Beispielen zur Nutzung der entwickelten 
reflektiven Dienste.

		\section{Struktur der Arbeit}

Dieser Abschnitt gibt einen "Uberblick "uber Aufbau und Inhalt dieser
Arbeit. Dazu werden die in den einzelnen Kapiteln behandelten Themen kurz
beschrieben.

\begin{description}
\item[Die Persistente Programmierumgebung Tycoon:] Nach dieser Einf"uhrung
folgt in Kapitel \ref{tycoon} eine Darstellung des Ist-Zustandes des 
Tycoon-Systems zu Beginn dieser Arbeit. Diesem wird eine um reflektive 
Eigenschaften erweiterte Architektur gegen"ubergestellt.
Weiterhin werden die f"ur Kapitel \ref{gdl} und \ref{gui} wesentlichen 
statischen und dynamischen Typkonzepte von \TL\ dargestellt. Die darauf
folgende Diskussion von Programmierstilen in \TL\ schafft die Grundlage f"ur
die in Kapitel \ref{gdl} entwickelte Abbildung des C++-Klassenkonzeptes nach
\TL.

\item[Ein Generator zur Anbindung externer C++-Bibliotheken:] In Kapitel
\ref{gdl} werden Konzepte und Implementierung eines Gateway-Generators zur 
Einbindung externer, in C++ implementierter Bibliotheken in das Tycoon-System 
erl"autert. Dieser Generator stellt die Grundlage zur Verwirklichung der 
grafischen Aspekte einer persistenten Entwicklungsumgebung in dieser Arbeit dar.

\item[GUI-Dienste:] Nach einer Vorstellung der wesentlichen Konzepte grafischer
Benutzerschnittstellen am Beispiel der GUI-Klassenbibliothek {\sf StarView}
wird die Anwendung des Gateway-Generators aus
Kapitel \ref{gdl} zur Einbindung dieser C++-Bibliothek demonstriert. 
Ferner wird auf Nutzungsm"oglichkeiten von {\em multi threading} zur 
GUI-Programmierung eingegangen.

\item[Reflektive Dienste:] Generik ist eines der Hauptziele des
Tycoon-Systems. Mit den Sprachmitteln von \TL\ ist jedoch eine generische
Darstellung einer bestimmten Klasse von Algorithmen nicht m"oglich.
Reflektive M"oglichkeiten sollen in dieser Situation Abhilfe schaffen. Dazu
werden in Kapitel \ref{reflection} Spracherweiterungen und Schnittstellen
vorgestellt und deren Implementierung beschrieben, mit dem Ziel, reflektive 
Programmierung in Tycoon zu erm"oglichen.
Dynamische Typisierung, Environments, die Schnittstelle zum \TL-Compiler
sowie Anwendungsbeispiele sind die wesentlichen Themen.

\item[Die Tycoon-Programmierwerkbank:] 
Konzepte der Benutzung der in den vorigen Kapiteln dargestellten Dienste im 
Rahmen einer grafischen reflektiven Programmierwerkbank sind das Thema von 
Kapitel \ref{workbench}. Bezugnehmend auf existierende
Systeme ({\sf Napier88} \cite{FDK*92}, Tycoon \cite{MMM93}) werden 
zun"achst M"oglichkeiten grafischer Benutzerinteraktion in 
persistenten und reflektiven Umgebungen dargestellt.
Aus der uniformen Behandlung von Daten und Programmen sowie von Quellcode und
ausf"uhrbarem Code ergeben sich zum Teil neuartige M"oglichkeiten der
interaktiven Programmentwicklung. Mittels dynamischer Typisierung und
dem \TL-Compiler als Bibliotheksdienst lassen sich Systemkomponenten
wie die Modulverwaltung auf die Anwendungsebene verlagern, was zu einer
konzeptionellen Vereinfachung des Systems f"uhrt.

\item[Zusammenfassung und Ausblick:] Zum Schlu"s werden die wichtigsten
Eigenschaften der vorgestellten Dienste und Konzepte zusammengefa"st.
Dabei steht der Aspekt der Steigerung der Generik des Programmiersystems im
Vordergrund. Ein Ausblick auf zuk"unftige Forschungsaktivit"aten und 
offene Punkte beschlie"st diese Arbeit.
\end{description}

