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
Übersicht Domänenspezifische Sprachen 1 Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile 2 3 2 / 37 Mirko Heinold Domainspezifische Sprachen
Definition Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Domain Specific Language (noun) a computer programming language of limited expressiveness focused on a particular domain [Fowler, 2006] 3 / 37 Mirko Heinold Domainspezifische Sprachen
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
Wo helfen uns DSLs Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile 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
EBNF als Beispiel einer DSL Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Erweiterte Backus-Naur-Form (EBNF) ist eine Sprache für die Domäne der Darstellung von kontextfreien Grammatiken 1 float_lit = decimals "." [ decimals ] [ exponent ] 2 decimals exponent 3 "." decimals [ exponent ]. 4 5 decimals = decimal_digit { decimal_digit }. 6 7 exponent = ( "e" "E" ) [ "+" "-" ] decimals. 8 9 decimal_digit = "0"..."9". Beispiel: http://golang.org/doc/go_spec.html 6 / 37 Mirko Heinold Domainspezifische Sprachen
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
Externe DSLs Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile Komplett eigenständige Sprache Eigene Syntax Ein vollständiger Parser wird geschrieben Meist mittels Parsergenarator Beispiele: EBNF, SQL... 8 / 37 Mirko Heinold Domainspezifische Sprachen
Interne (embedded) DSL Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile 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 Hostsprache DSL 9 / 37 Mirko Heinold Domainspezifische Sprachen
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 file main.o => ["main.c", "greet.h"] do 2 sh "cc -c -o main.o main.c" 3 end 4 5 file greet.o => [ greet.c ] do 6 sh "cc -c -o greet.o greet.c" 7 end 8 9 file "hello" => ["main.o", "greet.o"] do 10 sh "cc -o hello main.o greet.o" 11 end Beispiel: http://rake.rubyforge.org/ 10 / 37 Mirko Heinold Domainspezifische Sprachen
Ziele beim Entwurf einer DSL Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile 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
Vorteile Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und Nachteile 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
Nachteile Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und 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
Nachteile Domänenspezifische Sprachen Was ist eine DSL Arten von DSLs Entwurfsziele Vor- und 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
15 / 37 Mirko Heinold Domainspezifische Sprachen
Was ist Xtext? Domänenspezifische Sprachen 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
Ziele von Xtext Domänenspezifische Sprachen 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
Beispiel: DSL für Umfragen 18 / 37 Mirko Heinold Domainspezifische Sprachen
Aussehen unserer DSL für Umfragen 1 Poll "Evaluation" 2 3 Question "Geben Sie Ihren Namen ein" name 4 5 Question "Wie fanden Sie das Seminar?" bewertung 6 () "1 (Sehr Gut)" sehrgut 7 () "2 (Gut)" gut 8 () "3 (Befriedigend)" befriedigend 9 () "4 (Ausreichend)" ausreichend 10 () "5 (Mangelhaft)" mangelhaft 11 12 Question "Was kann verbessert werden?" verbesserungen 13 [] "Schrift" schrift 14 [] "Beamer" beamer 15 [] "Schokolade fuer alle" schokolade 19 / 37 Mirko Heinold Domainspezifische Sprachen
Was wir aus der Sprache generieren wollen 20 / 37 Mirko Heinold Domainspezifische Sprachen
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 Poll: 6 "Poll" description=string 7 (questions+=question)* 8 ; 9 10 Question: 11 TextQuestion SingleChoiceQuestion MultipleChoiceQuestion 12 ; Beispiel von Peter Friese, itemis 21 / 37 Mirko Heinold Domainspezifische Sprachen
Grammatik für diese Sprache (2) 14 TextQuestion: 15 "Question" title=string name=id; 16 17 SingleChoiceQuestion: 18 "Question" title=string name=id 19 (options+=singlechoiceoption)+; 20 21 MultipleChoiceQuestion: 22 "Question" title=string name=id 23 (options+=multiplechoiceoption)+; 24 25 SingleChoiceOption: 26 "()" title=string name=id 27 ; 28 29 MultipleChoiceOption: 30 "[]" title=string name=id 31 ; 22 / 37 Mirko Heinold Domainspezifische Sprachen
Xtext Grammatik Domänenspezifische Sprachen 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
Livedemo 1 Domänenspezifische Sprachen Demo, um den generierten Code und Editor zu zeigen 24 / 37 Mirko Heinold Domainspezifische Sprachen
Editor Domänenspezifische Sprachen 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
Zurück zum Thema Code Generierung 26 / 37 Mirko Heinold Domainspezifische Sprachen
Xtend-Code zur HTML-Code Generierung (1) 24 def tohtmlcode(poll p) 25 <html> 26 <head> 27 <title>poll</title> 28 </head> 29 <body> 30 <p> 31 <h2>«p.description»</h2> <br /> 32 «FOR question : p.questions» 33 <br /> 34 «question.generatecode» 35 «ENDFOR» 36 </p> 37 <p> 38 <input type="submit" value="submit" /> 39 </p> 40 </body> 41 </html> 42 27 / 37 Mirko Heinold Domainspezifische Sprachen
Xtend-Code zur HTML-Code Generierung (2) Auszug aus der Funktion generatecode(question question) 44 def generatecode(question question) { 45 if (question instanceof SingleChoiceQuestion){ 46 var String s 47 s = question.title + "<br />\n" 48 for(singlechoiceoption op: (question as SingleChoiceQuestion).options){ 49 s = s + "<input type=\"radio\" name=\"" + question.name 50 + "\" value=\"" + op.name + "\" />" + op.title + "<br />\n" 51 } 52 return s 53 }else if(question instanceof MultipleChoiceQuestion){ 28 / 37 Mirko Heinold Domainspezifische Sprachen
Livedemo 2: Generierung des Zielcodes 29 / 37 Mirko Heinold Domainspezifische Sprachen
Xtend Domänenspezifische Sprachen 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
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
Übersicht mit Xtext 32 / 37 Mirko Heinold Domainspezifische Sprachen
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
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 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
Gibt es Fragen? Domänenspezifische Sprachen 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