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