Was macht Boo so liebenswert? Neben seiner “Handgelenk schonenden” Attitüde ist es vor allem die Möglichkeit den Compiler zu instrumentieren und zu beeinflussen. Hinzu kommt das wesentliche Merkmal von dynamischen Sprachen - das Ducktyping (das unter der Haube Reflection benutzt). Das Interface IQuackFu stellt das Pendant zu dem C# 4.0 Schlüsselwort dynamic dar, und zwar seit langem! Was Rodrigo B. de Oliveira so im Laufe der Jahre (mit ein paar wenigen Commitern) auf die Beine gestellt hat, macht schon richtig Spaß. Am bekanntesten sind vermutlich die Projekte von Oren Eini aka Ayende sein (Rhino.DSL, die Brail ViewEngine und Binsor zur Konfiguration des DI-Containers Castle.Windsor)
Wer also kurz die Dokumentation von Boo (Boo Primer, Getting Started, Tutorials, Language Guide, Language Features) überflogen hat, wird sich fragen:
Was bietet Boo, was C# nicht kann (und vermutlich nicht können wird)?
- Code Templates – Wer kennt die Operatoren aus Template Haskell. Das Erweiterungsprojekt boo-extensions, das auch von Rogrigo de Oliviera gepflegt wird, bietet das DataMacro ähnlich dem data (namespace Boo.Adt) Schlüsselwort aus Template Haskel (siehe 1.) oder den Unions aus F#
- Macros – Boo kann mit Interfaces, dem MacroMacro oder MetaMethoden syntaktischen Zucker zur Compiletime und Runtime generieren, kombiniert man es mit Ducktyping und den Template Operatoren.
- Compilerpipeline – Von der Textdatei zum fertig IL-Code gibt es einiges zu tun. Boo macht das elegant über die CompilerPipeline. So kann der Buildprozess auf Compilerebene parametrisiert, durch weg- oder hinzunehmen von Steps verändert und dadurch erweitert oder eingeschränkt werden.
- Grammar and Rules – boo-extensions besitzt auch zwei Parser, die beide auf einem ähnlichen Prinzip beruhen: Parser Expression Grammars. Der erste Parser ist Boo.Pegs, der zweite Boo.OMeta. Beide als Macros definiert. Das extensions Projekt ist stets aktuell zum master von Boo und wird binnen kürzester Zeit aktualisiert (meistens ein bis zwei Wochen danach).
Somit habe ich hoffentlich klar gemacht, worin die Stärken von Boo liegen. Die Boo-Extensions besitzen mit einer in Boo.OMeta geschriebenen Grammatik nicht nur die Möglichkeit Boo in sich selbst zu hosten, sondern durch den deklarativen Ansatz einer Grammatik den Umfang des Parsers durch Komposition und Mehrfachvererbung zu erweitern oder zu verändern. Somit passen wir Boo unseren Bedürfnissen nicht nur nach Oben, sondern auch nach Unten an. Boo dürfte bald einen Status erreicht haben, der Möglichkeiten von Perl6 nahe kommt. Erweiterungsmöglichkeiten und Skalierung als Sprachfeatures. Wie das geht? Im Falle von Macros, einfach die Assembly, in der sie definiert sind referenzieren und import (using in C#) und schon kann es los gehen.
Fangen wir von vorne an. Der Compilerkern ist die Schnittstelle ICompilerComponent. Davon leiten sich ab:
IAstMacro
IAstAttribute
IAstGeneratorMacro
ICompilerStep
Implementieren wir IAstMacro, IAstAttribute oder leiten von einer ihrer abstrakten Basisklassen ab, können wir eigene Syntax in Boo verwenden. Die Basis für eine eigene DSL, oder ganz kleinen, einfachen Spracherweiterungen. Dabei hilft uns der Splicing Operator $ der nicht nur in Strings Instanzen in den Kontext holt sonder auch beim Erstellen von Syntaxbäumen über den zweiten Template Operator Quasi Quotation, auch bekannt als “oxford brackets” [| … |]. Wer schon vorab etwas darüber lesen will, kann hier im Blog von Rodrigo B. Oliveira vorbei schauen.
Wer sich erst einmal grundlegend mit dem Typsystem von Boo, also seinem Abstrakten Syntax Baum und den verschiedenen, von mir oben erwähnten Techniken, auseinander gesetzt hat, dem wird Tür und Tor offen stehen um die Programmiersprache Boo nach seinen Bedürfnissen anzupassen. Wem das zu viel ist kann damit einfach wie in Python programmieren, alle Featues von .NET nutzen, sich leicht Parser bauen oder die Sprache lediglich um einfach Konstrukte erweitern, die einem den Alltag erleichtern. Wer will benutzt die Type-Inference Engine von Boo, oder auch das Duck-Typing. Wem das nicht gefällt kann auch immer noch selbst Typisieren. Das sollte ein kleiner Einblick in die Möglichkeiten von Boo sein, ich werde in den kommenden Posts Schritt für Schritt mit euch in die einzelnen Bereiche abtauchen und versuchen die Mannigfaltigkeit und ihre Wirkungsweise zu entdecken