Domain Specific Languages in der Praxis! Andres Koch, Object Engineering dipl. El. Ing. HTL, M. Math, akoch@objeng.ch Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 1 www.object-engineering.ch Inhalt Vorstellung Sprachen und deren Background Was ist eine DSL Bestandteile zur DSL-Übersetzung Parsertypen (bottom up, top down) Parser-Generatoren und -Arbeitsweise DSL-Design-Vorgehen Praxisbeispiele Laborsprache Businessprache Regelsprache Transaktionsaufzeichnungsprache Translators Zusammenfassung, Fragen und Diskussion Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 2 www.object-engineering.ch
Software Engineering nach Mass Seit 1995 Spezialist für Modernisierung, Integration und Ablösung von Alt-Software und Alt-Systemen Tätig in verschiedenen Branchen (Telco, Finanz, Versicherungen, Industrie) und vernetzt mit Partnern. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 3 www.object-engineering.ch Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 4 www.object-engineering.ch
Sprachen und deren Background Sprachen mächtiger als jedes GUI-basierte Tool Unzählige Kombinationen von Elementen möglich Dem Menschen eher vertraut (Sprache in Schrift), der Entwickler-Guilde sowieso Maschinell verarbeitbar Generierbar Sprachen bilden virtuelle Maschinen oberhalb des Betriebssystems (vgl. JVM) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 5 www.object-engineering.ch Was ist eine DSL Eine domänenspezifische Sprache (engl. domain-specific language, DSL) ist eine formale Sprache, die speziell für ein bestimmtes Problemfeld (die Domäne) entworfen und implementiert wird. Beim Entwurf einer DSL wird man bemüht sein, einen hohen Grad an Problemspezifität zu erreichen: die Sprache soll alle Probleme der Domäne darstellen können und nichts darstellen können, was außerhalb der Domäne liegt. Dadurch ist sie durch Domänenspezialisten ohne besonderes Zusatzwissen bedienbar [Ref. wikipedia.org] Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 6 www.object-engineering.ch
Beispiele Business-Kalkulationssprache, als Excel-Ersatz: Summe Budget pro Spalte in % von Summe VJBudget pro Spalte Experimentdefinitions-Sprache für Laborversuche Ansteuerung von Messinstrumenten, Sensoren, Heizungen u.a. In einem sequentiell- und parallel-laufenden Teil Regelsprache als Ersatz für Legacy-Sprache Sprache für die Plausibilisierung von Eingaben, da C++ zum Zeitpunkt nicht für die Regelprogrammierer geeignet gewesen wäre. Aufgezeichnete Transaktionssprache Sprache, die von einem Service bei echten Transaktionen aufgezeichnet und später geändert und zu Testzwecken (Regression) wiedergegeben werden kann. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 7 www.object-engineering.ch Bestandteile zur DSL- Übersetzung (traditionell) DSL Lexer Parser Symboltabelle Codegenerator Code Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 8 www.object-engineering.ch
Bestandteile zur DSL-Übersetzung DSL-Source DSL-Parser AST Symbol Table Generators Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 9 www.object-engineering.ch Parsertypen (bottom up, top down) Kontextfreie Sprachen typisch in der IT Klassen von Parser: Top down Syntax-Analyse LL(k) Bottom-up: LR, SLR, LALR(1) (z.b yacc) Top-Down-Vorgehen ist typisch für handgeschriebene Parser Bottom-up-Vorgehen ist typisch für generierte Parser Bei DSLs kann man kontextfreie Sprachen so entwerfen, dass sie keine Mehrdeutigkeiten haben. LL(1) top down 1 look ahead LR(1) bottom up 1 look ahead Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 10 www.object-engineering.ch
Grammatik einer DSL Term Nonterminals Logexpr ::= Factor:v1 {: RESULT = v1; :} Term:v1 ADDOP Factor:v2 {: RESULT = v1.add(v2); :} Term:v1 SUBOP Factor:v2 {: RESULT = v1.sub(v2); :} ; ::= Term:v1 {: RESULT = v1; :} Logexpr:v1 EQUOP Term:v2 {: RESULT = v1.eq(v2); :}... Terminals Codegeneration (gehört nicht zum Parser) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 11 www.object-engineering.ch Interpreter vs. Translator Interpreter können auf die optimale Verarbeitung einer DSL abgestimmt werden. Bei Interpretern verwendet man in der Regel einen Zwischencode (z.b. Byte-Code) der optimal durch eine Stackmaschine verarbeitet werden kann. Translators sind dort gefragt, wo bereits eine Laufzeit- Umgebung vorhanden ist (z.b. JVM). Translators sind auch zur Umwandlung von Sprachdialekten geeignet. Translator vs Interpreter, ist eine Design-Entscheid, der aufgrund der Anforderungen zu fällen ist. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 12 www.object-engineering.ch
Parser-Generatoren und Arbeitsweise Parsergeneratoren generieren aus der Grammatik-Definition (typ. EBNF) den Code für den Parser. Sowohl Top-Down-Parser wie auch Bottom-Up-Parser Top-Down-Parser sind Programme, welche wie von Hand geschriebene Parser aussehen: If (nexttolken() == IF_TOK) { parseif(); }... Bottom-up Parser generieren State-Event-Tabellen für eine Stackmaschine. Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 13 www.object-engineering.ch Parser-Generatoren und Arbeitsweise (bottom-up) short yytable[] = { 37, 174, 67, 38, 130, 39, 67, 67, 67, 67, 67, 3, 67, 6, 120, 190, 146, 275, 86, 6, 59, 277, 129, 118, 67, 79, 80, 123, 101, 1, 284, 69, 7, 257, 4, 69, 69, 69, 69, 69, 102, 69, 87, 88, 89, 90, 91, 92, 157, 162, 143, 144, 163, 69, 37, 101, 68, 38, 67, 39, 68, 68, 68, 68, 68, 175, 68, 235, 176, 10, 206, 134, 135, 84, 224, 85, 258, 11, 68, 93, 94, 83, 131, 132, 133, 187, 81, 69, 12, 158, 54, 82, 56, 59, 60, 146, 244, 245, 246, 247, 248, 249, 159, 61, 62, 63, 64, 65, 37, 95, 167, 38, 68, 39, 168, 153, 66, 100, 170, 96, 172, 98, 205, 18, 255, 137, 138, 139, 140, 141, 142, 67, 68, 69, 70, 71, 72, 73, 74, 278, 75,... usw... Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 14 www.object-engineering.ch
Parser-Generatoren und Arbeitsweise (top-down) if ( ((LA41_0>=NOT_OP && LA41_0<=NOT_OP2) (LA41_0>=PLUS_OP && LA41_0<=MINUS_OP) LA41_0==IDENT LA41_0==SINGLE_QUOTED_STRING (LA41_0>=DECIM AL_CONSTANT && LA41_0<=DOUBLE_QUOTED_STRING) LA41_0==73) ) { alt41=1; } switch (alt41) { case 1 : // Q:\\proj\\OE\\PLI2J/grammar/PLI2J.g:0:0: expression { pushfollow(follow_expression_in_attachparameter2852); expression258=expression(); state._fsp--; if (state.failed) return retval; if ( state.backtracking==0 ) adaptor.addchild(root_0, expression258.gettree()); } } break; Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 15 www.object-engineering.ch Populäre Parser-Generatoren Oldies: yacc, lex (Unix) C, C++ (bottom-up) Bison (Linux) C, C++ (gleiche Grammatik wie yacc) Newbies: JavaCup (bottom-up) Java JavaCC (Java Compiler Compiler) Java Super-Newbies: ANTLR (antlr.org) Top-down, mit DFAs für Look-ahead Lexer integriert Tree-Syntax String-Templates Java und andere Parser-Sprachen Eclipse Plugin Xtext 1.0 (eclipse.org/xtext) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 16 www.object-engineering.ch
Design-Vorgehen Genauen Zweck bestimmen (Input, Output) Grammatik entwerfen und verifizieren Infrastruktur (Parser-Gen, Lexer, Symbol-Table) Grammatik übersetzen und code-freien Parser mit obiger Infrastruktur erstellen. Grammatik mit vielen Beispielen verifizieren (in min. Infrastruktur). Rest des Übersetzers/Interpreters implementieren/testen: Codegenerator AST-Visitors/Generatoren User-Interface Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 17 www.object-engineering.ch Praxisbeispiele Laborsprache Businesssprache Regelsprache Transaktionsaufzeichnungsprache Sprach-Translator Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 18 www.object-engineering.ch
Laborsprache Laborsystem für Prozess-Experimente im Kleinen Bestehende Hardware (Messinstrumente, Heizungen, Sensoren, Ventile, Rührwerke etc.) Gefordert: Laborsprache für den Laboranten, der den Prozess programmieren kann. Paralell laufender Teil (Loop, Thread) Sequentieller-Teil, der den Prozessablauf bestimmt Realisierung: yacc C QNX (von yacc generierter C-Code darauf portiert) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 19 www.object-engineering.ch Businesssprache PC-Software-Pallette benötigte eine Kalkulation-Sprache, welche individuelle Bedürfnisse abdecken konnte Sprache wurde neu entworfen Vorbild APL (A Programming Language) aber les- und schreibbar. Einfache Tabellen-Verarbeitung Deutsche Syntax, intuitiv formulierbar Gescheitert am mangelnden Intellekt des Benutzers, denn auch wenn Sprache einfach formuliert werden kann, benötigt es Analyse. Realisierung: yacc C, sowohl MSDOS + UNIX, Interpreter Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 20 www.object-engineering.ch
Businesssprache Beispiel Dollar.Kurs=1.32 Offerte.VS1= erz 5 3 aus 896.320 0 0 0 0 OffV1(;2)= 560.280 0 0 0 0 OffV1(;3)= 7.0 0 0 0 0 OffV1:titel= "VS1 License Pricing" OffV1(2;) = OffV1(1;) * DolK OffV1(3;) = OffV1(2;) + 6.5% OffV1(4;) = OffV1(2;) * 25% * 70% OffV1(5;) = OffV1(2;) * 25% * 30% OffV1:oben="k$-Preis Lief" "ksfr." "ksfr.+mwst" "Prov. DU" "Prov. KSE" OffV1:links = "Company Lic" "58-Package" "add. Unit" VS1.Preis.per.Unit = OffV1(3;) / spiegel 90 58 1 KSE.Add.Marge = 10% VS1.Preis.Liste = Erz 5 3 aus 20 0 0 0 0 VS1PL(;2) = 13.6 0 0 0 0 VS1PL(;3) = 10.0 0 0 0 0 VS1PL:links= "1-10" "11-50" "51-100" VS1PL:oben="K-$-EndUser" "$-Dist" "sfr-eu" "sfr-eu+mwst" "EU-KSE" VS1PL(3;) = VS1PL(1;) * DolK VS1PL(4;) = VS1PL(1;) * DolK + 6.5% VS1PL(5;) = VS1PL(1;) * DolK + KSEAM + 6.5% Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 21 www.object-engineering.ch Regelsprache Regelsprache als Ersatz für Legacy-Sprache Sprache für die Plausibilisierung von Eingaben C++ wäre zum Zeitpunkt nicht für die Regelprogrammierer geeignet gewesen. Letzte zwei Programmierer, welche die alte Software verstanden haben, haben umgeschrieben. Start mit Grundsprach-Set, während Umschreibphase wurde nach Bedarf erweitert. Compiler (yacc-basiert) generiert Byte-Code Byte-Code-Interpreter zur Laufzeit in Service integriert Spätere Generierung von Java-Regelklassen Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 22 www.object-engineering.ch
Regelsprache Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 23 www.object-engineering.ch Regelsprache Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 24 www.object-engineering.ch
Regelsprache Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 25 www.object-engineering.ch Regelsprache (Entwicklungsumgebung) Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 26 www.object-engineering.ch
Transaktions- Aufzeichnungsprache Aufzeichnungsformat für Regressions-Tests Client-Transaktionen werden direkt vom Service aufgezeichnet und in lesbarer Form zurückgeliefert Interpreter kann die Aufzeichnung entweder abspielen, oder man kann sie vor der Ausführung bearbeiten und mit externen Daten ergänzen Realisation: JavaCup Interpreter (in Java) Logging Data-Feeding Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 27 www.object-engineering.ch Transaktions- Aufzeichnungsprache (Bsp) start("test"); start("goiz8"); logln("efkzxx00="+a2100.efkzxx00); A2100.EFKZXX00="01"; A2100.ERNXXX00 = "2341111"; A2100.EIZXXX00 = "41"; ** 19.04.2002;20:37:14 commit; stop("goiz8"); ** 19.04.2002;20:37:21 ** logln("a2111.enrfmt00=" + A2111.ENRFMT00); logln("a2116.enrfmt00=" + A2116.ERNXXX00); #NR=1+#NR; $TIME=stop("TEST"); #Sum=0 + $TIME + #Sum; #Avg=(0+#Sum)/(#NR); reportln("time of Run#"+#NR+"="+ $TIME +" ms Avg=" + #Avg); close; Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 28 www.object-engineering.ch
Sprach-Translator PL/1-Source Manual or Automatic Adjustment PLI2JParser AST Repository Crossreference Code statistics References Java Code (EJB) Java Code DB-Access Additional Products Generators Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 29 www.object-engineering.ch Sprach-Translator nicht wirklich eine DSL Portierung alter Programmiersprachen auf neue Plattformen PL/1 Umfangreiche Sprache Parser-Generatoren kommen an den Anschlag Generierter Code: Lexer: 14 500 Parser: 37 600 Zeilen Grammatik 2 200 Zeilen Code-Generierung über AST Realisation ANTLR (Top-Down) Java Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 30 www.object-engineering.ch
Fazit - DSL Sprachen sind oft mächtiger als andere Mechanismen DSL muss nicht so umfangreich wie eine Programmiersprache sein. Erstellung eines Parsers mit Parser-Generatoren heute ein Kinderspiel Design gehört dazu und darf nicht vernachlässigt werden Einsatzgebiete sind sehr zahlreich Viel Spass beim Experimentieren! Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 31 www.object-engineering.ch Domain Specific Languages in der Praxis Fragen? Copyright 2010 by Object Engineering GmbH, CH-8142 Uitikon-Waldegg 32 www.object-engineering.ch