Domainspezifische Sprachen - Institut für Informatik der CAU Kiel

Werbung
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
Herunterladen