Entwicklung & Design

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

Der folgende Artikel soll einen Einblick in die Entwicklung von domänenspezifischen Sprachen mit Ruby geben und dabei die wichtigsten Mittel des Sprachdesigns erläutern. Anhand eines Beispiels wird gezeigt, wie die notwendige Grammatik, der Lexer und der Parser definiert werden.

Im Laufe der Jahre hat die Popularität von Ruby stetig zugenommen, die Anzahl verfügbarer Anwendungen steigt mit jedem Tag. Doch hat dies nicht nur Vorteile für den Entwickler – so muss er immer komplexere Programmierschnittstellen (API) verstehen und beherrschen, um ein gewünschtes Problem lösen zu können. Trotz der Flexibilität von Ruby, die hoch geschätzt wird, gibt es immer wieder Sachverhalte, die man anders ausdrücken möchte beziehungsweise der eben noch geschriebene Programmcode fühlt sich einfach nicht gut an. In diesem Fall hat man wahrscheinlich Code geschrieben, der einen bestimmten Zustand mit einer bestimmten Semantik beschreibt und versucht, ein bestimmtes Problem innerhalb dieses eingeschränkten Kreises – der Domäne – zu lösen. Im nun folgenden Refactoring-Schritt würde man die API solange anpassen, bis diese sich gut in das Programmiermodell einbettet. Mit der Optimierung des geschriebenen Codes wurde schon der erste Schritt zu einer domänenspezifischen Sprache (DSL) getan, auch wenn man es auf den ersten Blick nicht glauben mag.

Doch bevor nun näher auf die eigentliche Sprache eingegangen wird, soll zuerst kurz definiert werden, was eine domänenspezifische Sprache überhaupt ist: Sie beschreibt ein Programmiermodell, das auf eine bestimmte Situation beschränkt ist und Verallgemeinerungen bewusst außen vor lässt, um sich voll und ganz dem eigentlichen Problem zu widmen. Dabei wird bei der DSL zwischen zwei verschiedenen Arten – interne und externe DSL – unterschieden. Die interne DSL probiert, den gewünschten Sachverhalt ganz mit den Mitteln der Wirtssprache auszudrücken. Ein Beispiel für ein solches Paradigma ist das bekannte Framework ActiveRecord aus Ruby on Rails. Hier werden durch geschickten Umgang mit den sprachlichen Mitteln von Ruby die Modelle mit deklarativen Mitteln definiert, die im Prinzip nicht zu der typischen imperativen Syntax passen. Eine externe DSL erkennt man daran, dass diese von einem Parser analysiert und dann von einem Interpreter verarbeitet wird – ein typisches Beispiel ist ein Bash-Skript unter Linux/Unix. Die Bash ist auf eine ganz bestimmte Domäne eingeschränkt, die möglichen Operationen der Sprache sind speziell auf den Umgang mit Dateien und Verzeichnissen optimiert.

Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Schreib den ersten Kommentar!