1 Einführung
zum Anfang der Seite
1.1 Voraussetzungen
zum Anfang der Seite

Diese Ausarbeitung richtet sich an Leser, die bereits über fundierte Erfahrungen mit der Programmiersprache Haskell verfügen. Es wird somit bspw. vorausgesetzt, dass der Leser mit den Konzepten der abstrakten Datentypen (ADTs) und Monaden vertraut ist.

1.2 Motivation
zum Anfang der Seite

Die Motivation für die Auseinandersetzung mit der Template Haskell Bibliothek leitet sich zunächst einmal aus der generellen Motivation, ab Metaprogrammierung zu betreiben. Diese Motivation fußt auf dem Gedanken einer abstrakten Gestaltungsschicht oberhalb der Objektprogramme, in der letztere selbst zu Eingabedaten für andere Programme werden - den sogenannten Metaprogrammen. Metaprogramme können somit Objektprogramme analysieren, modifizieren und erzeugen. Auf diese Weise können die Sprachen bzw. die Compiler oder Interpreter aus den die Objektprogramme hervorgehen, erweitert und um neue Konzepte ergänzt werden. So wird in der Sprache C++ bspw. die generische Programmierung mittels Metaprogrammierung realisiert.

In der Praxis finden sich viele unterschiedliche Metasprachen, und der ein oder andere Leser mag bereits Erfahrungen mit diesen gemacht haben. Häufig stößt man bei der Verwendung solcher Metasprachen auf Probleme der Überprüfbarkeit hinsichtlich der Korrektheit der erzeugten Syntax, der Typsicherheit und des Scopings. Der wesentliche Grund dafür ist, dass prinzipiell jede Sprache als Metasprache für eine zu erzeugende Objektsprache fungieren kann. Ein nicht gemeinsam genutztes Sprachkonzept, unterschiedliche Syntax und Datendefinitionen machen es für die Metasprache häufig unmöglich, den erzeugten Objektcode nach oben genannten Kriterien zu prüfen. So werden in der Sprache C bspw. Makro-Definitionen in einer eigenen Sprache verfasst und zur Compilezeit ohne jede Prüfung expandiert. Ein weiteres Beispiel ist die Erzeugung von Java Script Code durch eine serverseitige Skriptsprache wie z.B. PHP. Hierbei werden die Java Script Anweisungen als Strings kodiert und zu einem Programm konkateniert, dessen Korrektheit bzw. Lauffähigkeit sich dann erst bei der Interpretation im Browser zeigt.

Aus den eben genannten Problemen leitet sich die eigentliche Motivation für die Template Haskell Bibliothek ab, die darin besteht, die Sprachkonzepte von Haskell (strenge Typisierung und statisches Scoping) auch auf die Metaprogrammierung zu übertragen, indem Haskell selbst als Metasprache verwendet wird. Um dies zur erreichen waren einige Überlegungen und Anstrengungen nötig, die von den Autoren Sheard und Jones im Jahr 2000 in einer Publikation erläutert wurden. In dieser werden auch weitere Ziele genannt, die mithilfe von Template Haskell erreicht werden sollen:

  • Bedingte Kompilierung
    Mithilfe der bedingten Kompilierung können Programme für unterschiedliche Anwendungsbereiche erstellt werden. Dabei kann es sich bspw. um verschiedene Programmversionen für unterschiedliche Betriebssysteme, Konfigurationen oder Debugging-Optionen handeln.1
  • Programm Reifikation
    Reifikation (oder Introspektion) meint die Fähigkeit eines Programms seine eigene Struktur zu kennen. Durch diese Möglichkeit können Programme sich selbst analysieren, verändern und auch neue Programme erzeugen.2
  • Algorithmische Programmkonstruktion
    Die Motivation der algorithmischen Programmkonstruktionen besteht darin, ein komplexes, langes Programm durch einen kurzen Algorithmus zu beschreiben. Template Haskell übernimmt dann die eigentliche Konstruktion des Programmcodes zur Compilezeit.3
  • Erweiterung der Abstraktionsmechanismen
    Hierunter kann man sich u.a. die Abstraktion von Signaturen vorstellen. Funktionen die bspw. auf zwei Parametern arbeiten, können auf diese Weise als Funktionen konstruiert werden, die auf einer beliebigen Anzahl von Parametern arbeiten können. Möglich wird dies Template Haskell durch die Definition von generischen, integer-induzierte Funktionen.4
  • Optimierungen
    Hierunter können sowohl domain-spezifische Optimierungen, wie etwa algebraische Regeln, verstanden werden als auch Performance-Steigerungen durch sog. Unrolling von Algorithmen. Letzteres meint im Wesentlichen die Verlagerung von zeitaufwändigen Rekursionsaufrufen aus der Lauf- in die Compilezeit.5
1.3 Abgrenzung
zum Anfang der Seite

Im Rahmen dieser Arbeit wird die Haskell Bibliothek Template Haskell ausführlich behandelt. Auf die Vorteile dieser Bibliothek wird eingegangen, detailierte Unterschiede und Gemeinsamkeiten zwischen ähnlichen Bibliotheken anderer Programmiersprachen sind dabei jedoch nicht Gegenstand dieser Arbeit. Vielmehr dient diese Arbeit der Erläuterung der wesentlichen Konzepte, die in der Template Haskell Bibliothek umgesetzt wurden. Dabei wird vor allem auf die Probleme eingegangen, die zu den jeweiligen Konzepten geführt haben. Versionsabhängige Features der aktuellen Version 2.5.0.0 sind dabei ebenso von nachrangiger Bedeutung wie die aktuell innerhalb der Haskell-Community diskutierten Weiterentwicklungsmöglichkeiten.

1.4 Aufbau der Arbeit
zum Anfang der Seite

Die Ausarbeitung beginnt mit einem Grundlagenteil in Kapitel zwei, in dem die wesentlichen Begriffsdefinition zum Thema Scoping erläutert werden, welches im Rahmen dieser Arbeit eine zentrale Rolle einnimmt. Zudem wird auf die grundsätzliche Arbeitsweise des GHC-Compilers in diesem Zusammenhang eingegangen.

Dem Grundlagenkapitel schließt sich die eigentliche Vorstellung der Template Haskell Bibliothek in Kapitel drei an. Diese wird anhand einer drei-Schichten Architektur von unten nach oben sukzessiv vorgestellt. Jede dieser Schichten wird ausführlich behandelt, wobei der Schwerpunkt auf der obersten Schicht liegt.

Im vierten Kapitel werden einige ausgewählte Anwendungsbeispiele für den Einsatz von Template Haskell aufgezeigt, bevor die Arbeit dann in Kapitel fünf mit einer Abschlussbetrachtung der Template Haskell Bibliothek endet, in deren Rahmen die erarbeiteten Erkenntnisse noch einmal rekapituliert und kritisch gewürdigt werden.

Hinweise zu Hervorhebungen

Aus Gründen der Übersichtlichkeit, werden im Rahmen dieser Arbeit folgende Hervorhebungen verwendet.

  • Codings

    Code-Beispiele werden in zeilennummerierten Bereichen mit Syntax-Highlighting angezeigt. Schlüsselwörter von Haskell werden dabei hervorgehoben und können angeklickt werden, wodurch man zur Webseite der Haskell Bibliothek gelangt (Hackage). Beispiel:

    1. sum [1..10]
    2. head [1..10]

    Funktionsnamen, Bezeichner und Inline-Codings werden im Text grau hinterlegt dargestellt.

  • Konsolen-Output

    Konsolen-Ausgaben von Programmen werden in einem schwarzen Bereich mit weißer Schrift anzgezeigt. Das Zeichen > am Anfang einer Zeile gibt an, dass es sich um eine Eingabe durch den Benutzer im ghci handelt. Die Zeile darunter stellt die Ausgabe des Ergebnisses dar.

    
    > sum [1..10]
    55
    > head [1..10]
    1
    
    
     

Valid XHTML 1.0 Strict