von Martin Grund, 02.12.2007

Entwickeln domänenspezifischer Sprachen mit Ruby: Auf dem Weg zur nächsten Programmiersprache

Aus dem
t3n Magazin Nr. 10

Was ist nun der Unterschied zwischen externen domänenspezifischen Sprachen und vollwertigen Programmiersprachen (GPL)? Er besteht darin, dass eine GPL mit dem Ziel entworfen wurde, möglichst alle Probleme in den unterschiedlichsten Domänen zu lösen, während der Einsatzbereich von einer externen DSL auf eine Domäne beschränkt ist.

Grammatik, wie in der Schule?

Das wichtigste Werkzeug beim kreativen Prozess der Sprachentwicklung ist die Grammatik der jeweiligen Sprache. Grammatiken bilden dabei wie in der natürlichen Sprache den Regelsatz, nach dem Aussagen in der Sprache allgemein gültig formuliert werden.

In der Linguistik formulieren Grammatiken Ersetzungsregeln, die bestimmen, wie man von einem Ausgangspunkt zu einem Endpunkt kommt. Für den Sprachdesigner ist dabei das wichtigste Ziel, eine deterministische und finite Grammatik zu definieren.

Die Analyse der Eingabedaten beginnt mit der Zerlegung in die Grundbegriffe der Sprache, die Token, durch den Lexer. Übertragen auf die deutsche Sprache wäre dies die Zerlegung der ursprünglichen Zeichenkette (Beispiel: „Ich helfe dir.“) in die drei Grundelemente der Sprache, Subjekt, Prädikat und Objekt. Im nächsten Schritt werden mittels vordefinierter Regeln ( HS -> S P O ) die einzelnen Token (S, P, O) durch den Parser in ein Symbol (HS) ersetzt. Dies wird so lange fortgeführt, bis alle Token und Symbole durch Terminalsymbole – Symbole, für die keine weiteren Ersetzungsregeln definiert sind – ersetzt wurden.

Ein Rechenbeispiel

Das folgende Beispiel zeigt, trotz seines geringen Umfangs, die Möglichkeiten einer externen Sprache auf und stellt außerdem dar, wie einfach es ist, eine solche Sprache in mit Hilfe des Dhaka-Projekts [1] zu implementieren. Dhaka ist ein in Ruby geschriebener Parsergenerator zur einfachen Implementierung einer externen DSL. Dabei greift der Generator dem Entwickler hilfreich unter die Arme und bietet dennoch die von Ruby gewöhnte Flexibilität. Zielsetzung ist es, eine DSL zu erstellen, die einen in Präfixnotation eingegebenen String in das für Ruby verständliche Infixformat umwandelt, dieses evaluiert und das Ergebnis der Operation zurückgibt.

Seite:  1 2 3 4 5

Empfohlene Artikel