Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Domainspezifische Sprachen Eine Einführung und Vertiefung am Beispiel des Eclipse Xtext Framework Mirko Heinold Institut für Informatik Christian-Albrechts-Universität zu Kiel Arbeitsgruppe Kommunikationssysteme 1. März 2012 1 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Übersicht 2 / 37 1 Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile 2 Entwurf einer DSL mit Xtext Einführung in Xtext DSL Entwicklung Ähnliche Tools 3 Fazit Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Definition Domain Specific Language (noun) a computer programming language of limited expressiveness focused on a particular domain [Fowler, 2006] 3 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Was ist eine Domänenspezifische Sprache (DSL) Eine Programmiersprache für eine Domäne Mit beschränkter Ausdrucksfähigkeit Nicht zwangsläufig Turing unvollständig Meist geringer Umfang Auf die Domäne und deren Problem und Eigenschaften zugeschnitten Lange Tradition beispielsweise in der Unix Welt 4 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Wo helfen uns DSLs Beim Abstrahieren von Problemen einer Domäne Beispiel: Umschreibung von gültigen Konstrukten in Programmiersprachen Eine Gleitpunktkonstante besteht aus einen ganzzahligen Teil, einen Dezimalpunkt, einem Dezimalbruch, dem Zeichen e oder E, einem ganzzahligen Exponenten mit optionalen Vorzeichen und einem optionalen Typ-Suffix, nämlich einem der Buchstaben f, F, l oder L. Ganzzahligen Teil und Dezimalbruch sind Ziffernfolgen. Entweder der ganzzahlige Teil oder der Dezimalbruch kann fehlen (aber nicht beide); entweder der Dezimalpunkt oder der Exponent beginnend mit e kann fehlen (aber nicht beide). [Kernighan and Ritchie, 1990] 5 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile EBNF als Beispiel einer DSL Erweiterte Backus-Naur-Form (EBNF) ist eine Sprache für die Domäne der Darstellung von kontextfreien Grammatiken 1 2 3 float_lit = decimals "." [ decimals ] [ exponent ] | decimals exponent | "." decimals [ exponent ] . 4 5 decimals = decimal_digit { decimal_digit } . exponent = ( "e" | "E" ) [ "+" | "-" ] decimals . 6 7 8 9 decimal_digit = "0"..."9" . Beispiel: http://golang.org/doc/go_spec.html 6 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Abgrenzung DSLs zu anderen Sprachen Weitere Beispiele für DSLs sind: SQL → make → HTML → Reguläre Ausdrücke → *.jpg Keine DSLs sind: General purpose Sprachen wie Java, C, Ruby, JavaScript . . . 7 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Externe DSLs Komplett eigenständige Sprache Eigene Syntax Ein vollständiger Parser wird geschrieben Meist mittels Parsergenarator Beispiele: EBNF, SQL . . . 8 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Interne (embedded) DSL General purpose Sprache wird als Hostsprache verwendet DSL Code ist gültiger Code der Hostsprache Syntax der Hostsprache wird verwendet Dennoch ist die entstandene DSL eine eigene Sprache Kein neuer Standard Textparser für die Sprache nötig Weniger Freiheiten als bei externen DSLs 9 / 37 Mirko Heinold Domainspezifische Sprachen Hostsprache DSL Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Rake als Beispiel für eine Interne DSL Rake ist ein Make für Ruby Nutzt Ruby Syntax und ist gültiges Ruby Programm Hat eigenes typisches Aussehen und nutzt spezielle Bibliotheken 1 2 3 file ’main.o’ => ["main.c", "greet.h"] do sh "cc -c -o main.o main.c" end 4 5 6 7 file ’greet.o’ => [’greet.c’] do sh "cc -c -o greet.o greet.c" end 8 9 10 11 file "hello" => ["main.o", "greet.o"] do sh "cc -o hello main.o greet.o" end Beispiel: http://rake.rubyforge.org/ 10 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Ziele beim Entwurf einer DSL Einfachheit Sich selbst dokumentierender Code Ideales Abbilden der zugehörigen Domäne Für Domänenexperten gut verständlich 11 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Vorteile Deckt sehr individuelle Anforderungen ab Steigert Effizienz Vermeidet Fehler bei Entwicklung Ermöglicht einfacheren Zugang zu einer Domäne Ermöglicht Abstraktionen von Problemen Für Domänenexperten beherrschbar Domänenspezifische Anforderungen können validiert werden 12 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Nachteile Die DSL muss teuer entwickelt werden Nur mit guter Tool-Unterstützung brauchbar Gefahr von Fehlentwicklungen und schlechtem Design Domäne muss genau verstanden sein Domänenexperten mit großer Erfahrung nötig Langfristig benötigte Eigenschaften müssen verstanden werden Geeignete Abstraktionen müssen gefunden werden Neue Sprache muss gelernt werden 13 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Nachteile Wenig Support Geringe Userbasis Geringe Codebasis/ kaum Beispiele vorhanden wenig Webhilfe kaum Dienstleister Gefahr der Hinentwicklung zu einer general purpose Programmiersprache Ausführbarer DSL-Code nicht performant Schwieriges Einbetten in andere Software und Sprachen 14 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit 15 / 37 Einführung in Xtext DSL Entwicklung Ähnliche Tools Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Was ist Xtext? Ein Framework zum einfachen Entwickeln textueller DSLs Stellt mehrere DSLs dafür zur Verfügung Beinhaltet APIs dafür Eclipse Plug-in Erlaubt Erstellen von DSLs durch Definition einer Grammatik Erzeugt für erstellte DSL automatisch ein Editor als Eclipse-Instanz 16 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Ziele von Xtext DSLs Entwickeln soll einfacher werden Entwicklungszeit und Kosten sollen reduziert werden Toolunterstützung für DSLs soll einfacher und besser werden 17 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Beispiel: DSL für Umfragen 18 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Aussehen unserer DSL für Umfragen 1 Poll "Evaluation" 2 3 Question "Geben Sie Ihren Namen ein" name 4 5 6 7 8 9 10 Question "Wie fanden Sie das Seminar?" bewertung () "1 (Sehr Gut)" sehrGut () "2 (Gut)" gut () "3 (Befriedigend)" befriedigend () "4 (Ausreichend)" ausreichend () "5 (Mangelhaft)" mangelhaft 11 12 13 14 15 19 / 37 Question "Was kann verbessert werden?" verbesserungen [] "Schrift" schrift [] "Beamer" beamer [] "Schokolade fuer alle" schokolade Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Was wir aus der Sprache generieren wollen 20 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Grammatik für diese Sprache (1) 1 grammar org.xtext.example.mydsl.SimplePollDSL with org.eclipse. xtext.common.Terminals 2 3 generate simplePollDSL "http://www.xtext.org/example/mydsl/ SimplePollDSL" 4 5 6 7 8 Poll: "Poll" description=STRING (questions+=Question)* ; 9 10 11 12 Question: TextQuestion | SingleChoiceQuestion | MultipleChoiceQuestion ; Beispiel von Peter Friese, itemis 21 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Grammatik für diese Sprache (2) 14 15 TextQuestion: "Question" title=STRING name=ID; 16 17 18 19 SingleChoiceQuestion: "Question" title=STRING name=ID (options+=SingleChoiceOption)+; 20 21 22 23 MultipleChoiceQuestion: "Question" title=STRING name=ID (options+=MultipleChoiceOption)+; 24 25 26 27 SingleChoiceOption: "()" title=STRING name=ID ; 28 29 30 31 22 / 37 MultipleChoiceOption: "[]" title=STRING name=ID ; Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Xtext Grammatik Es gibt eine Xtext Grammar Language Diese erinnert an EBNF und reguläre Ausdrücke Ist selbst eine DSL Beschreibt die Syntax der Sprache Enthält auch Informationen zum vom Parser erzeugten Modell 23 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Livedemo 1 Demo, um den generierten Code und Editor zu zeigen → 24 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Editor Wird Automatisch generiert Code Completion Syntax Highligthing Syntax Überprüfung Weiter Fehlererkennung möglich Outlining Referenzen über Dateigrenzen hinweg möglich Im hohen Maße anpassbar 25 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Zurück zum Thema Code Generierung −−−−→ 26 / 37 −−−−→ Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Xtend-Code zur HTML-Code Generierung (1) 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 27 / 37 def toHTMLCode(Poll p) ’’’ <html> <head> <title>Poll</title> </head> <body> <p> <h2>«p.description»</h2> <br /> «FOR question : p.questions» <br /> «question.generateCode» «ENDFOR» </p> <p> <input type="submit" value="Submit" /> </p> </body> </html> ’’’ Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Xtend-Code zur HTML-Code Generierung (2) Auszug aus der Funktion generateCode(Question question) 44 45 46 47 48 49 50 51 52 53 28 / 37 def generateCode(Question question) { if (question instanceof SingleChoiceQuestion){ var String s s = question.title + "<br />\n" for(SingleChoiceOption op: (question as SingleChoiceQuestion).options){ s = s + "<input type=\"radio\" name=\"" + question.name + "\" value=\"" + op.name + "\" />" + op.title + "<br />\n" } return s }else if(question instanceof MultipleChoiceQuestion){ Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Livedemo 2: Generierung des Zielcodes → 29 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Xtend Funktionale Features Statisch getypt Stark an Java angelehnt Kompiliert zu lesbarem Java-Code Toolunterstützung durch Eclipse IDE Typ Inferenz 30 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Unterstützung zum Übersetzen und Interpretieren Graph bzw. Abstrakter Syntax Baum wird erzeugt Darstellung und Zugriff mit dem Eclipse Modeling Framework (EMF) Kann gesehen werden als mächtige Java Beans Variante Struktur und Objekte lassen sich in Grammatik festlegen Ausgangspunkt für Übersetzung und Interpreter Wir erhalten Parser und Serialisierer Übersetzung also bi-direktional von der Grammatik zum AST und andersrum 31 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Übersicht DSL Entwicklung mit Xtext 32 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Weitere Tools zum DSL Entwurf (1) Lex und Yacc Helfen beim Schreiben eines Compilers für die DSL Parsen und Syntax Check wird auf Basis einer Grammatik durchgeführt Keine weiteren Tools und Unterstützungen MetaEdit+ Bietet mehr als einen Parser Kein automatisch erstellter Editor Kommerziell Unterstützt Entwicklung vom Modell zum Code 33 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Einführung in Xtext DSL Entwicklung Ähnliche Tools Weitere Tools zum DSL Entwurf (2) MPS Meta Programming System Open-Source-Software Soll Erweitern von Sprachen vereinfachen DSL Entwurf auch möglich Konzept: Code wird nicht mehr als Text sondern als AST vorgehalten Microsoft DSL Tools Eingebettet in Visual Studio Erleichtert ebenfalls DSL Entwurf Generiert keinen Editor für erstellte DSL 34 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Fazit DSL Entwicklung hat sich mit Xtext deutlich weiterentwickelt Einfach und leicht zugänglich Hohe Qualität der erzeugten DSLs DSLs schneller realisierbar Automatisch erstellter Editor steigert Wert deutlich Aber . . . Gutes Sprachdesign ist kompliziert DSLs entwickeln bleibt zusätzlichen Aufwand Automatische Festlegung auf Java und Eclipse Technologie 35 / 37 Mirko Heinold Domainspezifische Sprachen Domänenspezifische Sprachen Entwurf einer DSL mit Xtext Fazit Gibt es Fragen? Autor Comic: Randall Munroe, Quelle: http://xkcd.com/303/, CC-by-nc 36 / 37 Mirko Heinold Domainspezifische Sprachen Funktionsdetails der Xtext Grammar Language Anzahl erlaubter Anwendungen der Grammatik Regeln: ? 0 oder 1 mal + mindestens 1 mal * beliebig oft Weitere Regeln: | Oder [] Referenz auf eine Regel der Grammatik {} Erzwingt Erstellung eines bestimmten Typs 37 / 37 Mirko Heinold Domainspezifische Sprachen Fowler, M. (2006). Introducing domain specific languages. Kernighan, B. and Ritchie, D. (1990). Programmieren in C. Hanser Verlag. 37 / 37 Mirko Heinold Domainspezifische Sprachen