5 Abschlussbetrachtung
zum Anfang der Seite

Im Rahmen dieser Arbeit wurde die Haskell-Erweiterung Template Haskell untersucht und vorgestellt, mit der es möglich ist, homogene und statische Metaprogrammierung in Haskell umzusetzten.

Die Analyse des Ausfbaus der Bibliothek in Kapitel drei hat gezeigt, dass diese eine sinnvoll auf einander aufbauende Drei-Schichten-Architektur aufweist. Es wurde gezeigt, dass die einzelnen Schichten dabei in einem kausalen Zusammenhang stehen. Die unterste Schicht, welche lediglich der Repräsentation des Haskell-Codes in Form von ADTs dient, bietet durch den erhöhten Abstraktionsgrad keinerlei Schutz- oder Kontrollmechanismen, die die Einhaltung von Scoping- und Typregeln gewährleisten. Ebenso wurde gezeigt, dass das Problem der Namenskonflikte durch Kombination mehrerer Programmfragmente, allein auf dieser Ebene nicht gelöst werden kann, weswegen das Konzept der Q-Monade eingeführt wurde.

Die Q-Monade - so wurde deutlich - stellt innerhalb der ersten Schicht eine wichtige Zugriffsschnittstelle zur Vermeidung von Namenskonflikten dar, wodurch modulare Metaprogrammierung überhaupt erst möglich wird. Darüberhinaus stellt sie aber auch wichtige Informationen zur Durchführung der Reifikation (z.B. Compilertabelle) bereit. Das zum Teil umständliche Arbeiten mit der Q-Monade (Wechsel zwischen Ein- und Auswickeln von Daten) führte schließlich zu der Schicht der Syntax-Konstruktionsfunktionen, die im Wesentlichen nichts anderes als die Q-monadischen Konstruktorversionen der ADTs breitstellt.

Die Quasi-Quotes, als letzte und komfortabelste Schicht der Architektur, bildeten den eigentlichen Schwerpunkt dieser Arbeit. So wurde gezeigt, dass es mithilfe der Quasi-Quotes möglich ist, komplexe Metaprogramme durch Angabe von gewöhnlichem Haskell-Code zu konstruieren. Dabei wurde sowohl auf die Probleme hinsichtlich der Typüberprüfung und des Scopings, die durch die Verwendung von Quasi-Quotes entstehen können, als auch auf die Konzepte zur Lösung dieser eingegangen. Allerdings wurde auch deutlich, dass viele Problemstellungen der Metaprogrammierung mit Quasi-Quotes allein nicht realisiert werden können, weswegen eine Kombination der zweiten und der dritten Schicht nötig werden kann. Genau in dieser Kombinationsmöglichkeit der Schichten, liegt eine der Stärken von Template Haskell: Der Entwickler kann jederzeit zwischen den Schichten konvertieren und - sofern gewollt - Sicherhheitsmechanismen wie die Q-Monade gezielt umgehen.

Abschließend lässt sich sagen, dass die von Sheard und Jones in der Motivation genannten Ziele alle umgesetzt werden konnten. Allerdings existieren noch einige Unklarheiten hinsichtlich des Grads der Typisierung. So wird das Template [| 1 ++ "hallo" |] vom Compiler bspw. als korrektes Metaprogramm erachtet. Der Grund dafür ist, dass man die Typüberprüfung möglichst flexibel halten möchte, denn, bezogen auf das obige Template könnte es theoretisch möglich sein, dass die Expansion eines anderes Templates im selben Metaprogramm eine Instanz-Deklaration von Num für Strings einführt, wonach der obige Ausdruck im Nachhinein korrekt wäre. Diese Flexibilität bei der Konstruktion von Templates führt allerdings dazu, dass korrekte Metaprogramme nicht unbedingt auch zu korrekten Objektprogrammen führen. Weiterhin ist anzumerken, dass die Bibliothek in der hier betrachteten Version 2.5.0.0 noch einige Implementierungsschwächen aufweist. Pattern- und Typ-Splices können z.B. zwar als Quasi-Quotes definiert, aber nicht durch einen Splice ins Programm eingefügt werden. Auch die Tatsache, dass Funktionen, die von einem Splice verwendet werden, nicht im selben Modul mit diesem sein dürfen, führt zu Umständlichkeiten beim Entwickeln von Metaprogrammen.

Valid XHTML 1.0 Strict