Typ-sichere DSLsMit Xtext/TS, Xtend, Groovy undanderen Sprachen             Werner Keil         Eclipse DemoCamp Berlin   ...
Zielsetzung          ARITHMETISCHE ODER          DATENTYP FEHLER BEI DSL          NUTZUNG VERMEIDEN2   © 2007-2012 Creativ...
Überblick• Einleitung       • Was ist eine DSL?       • Interne und Externe DSLs       • Type-Sicherheit• Einheiten im Ges...
Was bin Ich?Werner Keil                 • Consultant – Coach                 • Creative Cosmopolitan                 • Ope...
Was ist eine DSL?• Eine DSL ist eine Computersprache (Spezification,  Modellierung, Programmierung,…) angepasst an  eine b...
Was ist eine Domäne?                             Real-Time                      Business                               Sys...
Internal Domain Specific Languages• Sprachen mit Hilfe syntaktischer Elemente der  darunter liegenden Sprache/Umgebung• Im...
External Domain Specific Languages• Externe DSLs       • Geschriebern in einer eigenen Sprache als der darunterliegenden (...
Typ-Sicherheit• Java hat keine stark typisierten Primitiven  Datentypen (wie etwa Ada).• Zwecks Performance nutzen die mei...
Was haben diese Vorfälle gemeinsam?• Patriot Missile  Ungenaue Berechnung der Zeit, die seit dem Start  verging verursacht...
Was haben diese Vorfälle gemeinsam?• Gimli Glider (Beinahe Disaster)     Treibstoffmenge falsch berechnet wegen Fehlinterp...
Unit Tests helfen hier selten…  Dem Namen zum Trotz• Alle Beispiele illustrieren 3 Kategorien von Fehlern,  die man mit Un...
SQL Beispiel mit Fehlern     StringBuilder sql = new StringBuilder();     sql.append("SELECT o.sum,(SELECT first_name,last...
Typ-sicheres SQL Beispiel     Person p = new Person();     List<Tuple<String, Integer, Date>> rows =           new QueryBu...
Unit-API | Operationen   Ergebnis mit   Gleicher Dimension            Anderer Dimension   Binäre Operationen            Bi...
UOMo UCUM          Unified Code for Units of Measure          Unified Code for Units of Measure ist inspiriert und stark  ...
HL7 DSL     def mySegment = ...                                    // assignment to another     NK1 segment instance     d...
Healthcare DSL mit Groovy  DEMO
Jython     /** * Java calculator class that contains two simple     methods */     public class Calculator {              ...
Jython (2)     import Calculator     from java.lang import Math     class JythonCalc(Calculator):     def __init__(self): ...
Jython (3)          Result     Starting Cost: 23.75     Tip Percentage: 0.15     Tax Percentage: 0.07     2930   © 2007-20...
Xtext Examples  DEMO
Scala, Fantom, F#• Scala       • Functional programming language. Type-safe, as the company driving it was         called....
Scala und Fantom Beispiele  DEMO
Links   Eclipse – Project UOMo   http://www.eclipse.org/uomo/   Units of Measurement API   http://www.unitsofmeasurement.o...
Links (2)   OpenHealth Project   http://www.openhealth.org   Groovy DSL Example   http://groovy.dzone.com/news/domain-   s...
Links (3)   Xtext   http://www.eclipse.org/xtext   Scala DSLs   http://www.scala-lang.org/node/1403   Fantom   http://fant...
FragenQ&A
Kontakt          werner@catmedia.us                 oder          uomo@catmedia.us          Twitter: @wernerkeil          ...
Upcoming SlideShare
Loading in...5
×

Typ-sichere DSLs

494

Published on

Mit Xtext/TS, Xtend, Groovy und anderen Sprachen

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
494
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Typ-sichere DSLs

  1. 1. Typ-sichere DSLsMit Xtext/TS, Xtend, Groovy undanderen Sprachen Werner Keil Eclipse DemoCamp Berlin 20. Juni 2012
  2. 2. Zielsetzung ARITHMETISCHE ODER DATENTYP FEHLER BEI DSL NUTZUNG VERMEIDEN2 © 2007-2012 Creative Arts & Technologies
  3. 3. Überblick• Einleitung • Was ist eine DSL? • Interne und Externe DSLs • Type-Sicherheit• Einheiten im Gesundheitswesen • Unit-API, UOMo • UCUM, HL7, Groovy in der Gesundheitsbranche• Andere Sprachen • Jython/WLST • Xtext/Xbase/Xtend • Scala, Fantom, F#• Demo• Q&A3 © 2007-2012 Creative Arts & Technologies
  4. 4. Was bin Ich?Werner Keil • Consultant – Coach • Creative Cosmopolitan • Open Source Evangelist • Software Architect • Java Godfather • UOMo Lead • … Twitter @wernerkeil4 © 2007-2012 Creative Arts & Technologies
  5. 5. Was ist eine DSL?• Eine DSL ist eine Computersprache (Spezification, Modellierung, Programmierung,…) angepasst an eine bestimmte Domäne. Doch was ist eine Domäne? (siehe nächste Seite;-)• DSL Beispiele: SQL, CSS, Sawzall (Google)• Gewinn von Aussagekraft und Benutzerfreundlichkeit (kann u.U. Bis zur Entwicklung durch Endbenutzer führen)• Gewinn von Produktivität• Geringerer Wartungsaufwand und -kosten5 © 2007-2012 Creative Arts & Technologies
  6. 6. Was ist eine Domäne? Real-Time Business Systems Systems Requirements Specification Aircraft Patient Insurance control Management Management Implementation systems Systems Systems Deployment6 © 2007-2012 Creative Arts & Technologies
  7. 7. Internal Domain Specific Languages• Sprachen mit Hilfe syntaktischer Elemente der darunter liegenden Sprache/Umgebung• Im Fall von Java, eine DSL verwendet Java Klassen und Methoden• Bei anderen JVM-basierenden Sprachen ist es in der Regel ähnlich, meist wird Java Code oder Klassen generiert7 © 2007-2012 Creative Arts & Technologies
  8. 8. External Domain Specific Languages• Externe DSLs • Geschriebern in einer eigenen Sprache als der darunterliegenden (Host) Sprache der Anwendung • Umgewandelt mit Hilfe eines Compilers, Parsers oder Interpreters• Kann auch enthalten • XML Konfigurationsdateien • Textdateien zur Konfiguration • Eigene Sprachen (Meta-DSLs)8 © 2007-2012 Creative Arts & Technologies
  9. 9. Typ-Sicherheit• Java hat keine stark typisierten Primitiven Datentypen (wie etwa Ada).• Zwecks Performance nutzen die meisten Entwickler Primitive Datentypen an Stelle der entsprechenden Objekt-Typen.• Primitive Datentypen in Argumenten führen oft zu Namensverwirrung (Methoden mit ident wirkender Signatur)9 © 2007-2012 Creative Arts & Technologies
  10. 10. Was haben diese Vorfälle gemeinsam?• Patriot Missile Ungenaue Berechnung der Zeit, die seit dem Start verging verursachte den Absturz.• Ariane 5 Explosion Floating point Zahl die in einen Wert umgewandelt wurde, der den verfügbaren 16 bit signed integer überstieg.10 © 2007-2012 Creative Arts & Technologies
  11. 11. Was haben diese Vorfälle gemeinsam?• Gimli Glider (Beinahe Disaster) Treibstoffmenge falsch berechnet wegen Fehlinterpretation des gerade eingeführten Metrischen Systems in Kanada, statt des Britischen Imperial System of Units• Mars Orbiter Vorläufige Erkenntnisse deuten darauf hin, dass ein Team Englische Einheiten (e.g. inches, feet and pounds) benutzte, während andere Teams Metrische Einheiten zur Steuerung der Raumsonde nutzten. • NASA lost a $125 million Mars orbiter because a Lockheed Martin engineering team used English units of measurement while the agencys team used the more conventional metric system for a key spacecraft operation • A credible source disclosed, there was a manual step with an outsourced person to convert these calculations between the different teams, and NASA budget cuts caused them to fire him and have the wrong, unpatched data transmitted!!! • This also underlines the added risk when 3rd party contractors are involved or projects are developed Offshore11 © 2007-2012 Creative Arts & Technologies
  12. 12. Unit Tests helfen hier selten… Dem Namen zum Trotz• Alle Beispiele illustrieren 3 Kategorien von Fehlern, die man mit Unit Tests nur schwer aufspüren kann: • Schnittstellen-Fehler (z.B. millisecond/second, radian/degree, meters/feet). • Arithmetische Fehler (z.B. overflow). • Konvertierungsfehler.17 © 2007-2012 Creative Arts & Technologies
  13. 13. SQL Beispiel mit Fehlern StringBuilder sql = new StringBuilder(); sql.append("SELECT o.sum,(SELECT first_name,last_name"); sql.append(" FROM person p"); sql.append(" WHERE o.person_id=p.id) AS client"); sql.append(" FROM order o"); sql.append("WHERE o.id = "+orderId); sql.append(" AND o.status_code IN (?,?)"); PreparedStatement stmt = conn.prepareStatement(sql.toString()); stmt.setString(1, "PAID"); //...19 © 2007-2012 Creative Arts & Technologies
  14. 14. Typ-sicheres SQL Beispiel Person p = new Person(); List<Tuple<String, Integer, Date>> rows = new QueryBuilder(datasource) .from(p) .where(gt(p.height, 170)) .select(p.name, p.height, p.birthday) .list(); for (Tuple<String, Integer, Date> row : rows) { String name = row.v1; Integer height = row.v2; Date birthday = row.v3; System.out.println( name + " " + height + " " + birthday); }20 © 2007-2012 Creative Arts & Technologies
  15. 15. Unit-API | Operationen Ergebnis mit Gleicher Dimension Anderer Dimension Binäre Operationen Binäre Operationen add(double) od. (long) root(int) multiply(double) od. (long) power(int) divide(double) od. (long) multiply(Unit) compound(Unit) divide(Unit) Unäre Operationen inverse()
  16. 16. UOMo UCUM Unified Code for Units of Measure Unified Code for Units of Measure ist inspiriert und stark beeinflusst von • ISO 2955-1983 • ANSI X3.50-1986 • HL7s Erweiterungen namens ISO+25 © 2007-2012 Creative Arts & Technologies
  17. 17. HL7 DSL def mySegment = ... // assignment to another NK1 segment instance def group = message.PATIENT_RESULT(0).PATIENT group.NK1(0) = abc // syntax error! msg1.NK1(0) = mySegment // syntax error! msg1.NK1(0).from(mySegment) // works! def nk1 = message.PATIENT_RESULT(0).PATIENT.NK1(0) def otherNk1 = message.PATIENT_RESULT(0).PATIENT.NK1(0) nk1[4] = otherNk1[4] // copy address nk1[4][4] = otherNk1[4][4] // copy state or province only nk1[4][4].from(otherNk1[4][4])// equivalent nk1[4][4] = NY // set state or province directly26 © 2007-2012 Creative Arts & Technologies
  18. 18. Healthcare DSL mit Groovy DEMO
  19. 19. Jython /** * Java calculator class that contains two simple methods */ public class Calculator { public Calculator(){ } public double calculateTip(double cost, double tipPercentage) { return cost * tipPercentage; } public double calculateTax(double cost, double taxPercentage) { return cost * taxPercentage; } }28 © 2007-2012 Creative Arts & Technologies
  20. 20. Jython (2) import Calculator from java.lang import Math class JythonCalc(Calculator): def __init__(self): pass def calculateTotal(self, cost, tip, tax): return cost + self.calculateTip(tip) + self.calculateTax(tax) if __name__ == "__main__": calc = JythonCalc() cost = 23.75 tip = .15 tax = .07 print "Starting Cost: ", cost print "Tip Percentage: ", tip print "Tax Percentage: ", tax print Math.round(calc.calculateTotal(cost, tip, tax))29 © 2007-2012 Creative Arts & Technologies
  21. 21. Jython (3) Result Starting Cost: 23.75 Tip Percentage: 0.15 Tax Percentage: 0.07 2930 © 2007-2012 Creative Arts & Technologies
  22. 22. Xtext Examples DEMO
  23. 23. Scala, Fantom, F#• Scala • Functional programming language. Type-safe, as the company driving it was called. • Very popular for DSLs• Fantom • Functional programming language • Units of Measurement support built in. • Runs on both JVM and CLR• F# • Functional programming language • Units of Measurement support built in.33 © 2007-2012 Creative Arts & Technologies
  24. 24. Scala und Fantom Beispiele DEMO
  25. 25. Links Eclipse – Project UOMo http://www.eclipse.org/uomo/ Units of Measurement API http://www.unitsofmeasurement.org UCUM http://www.unitsofmeasure.org
  26. 26. Links (2) OpenHealth Project http://www.openhealth.org Groovy DSL Example http://groovy.dzone.com/news/domain- specific-language-unit- Jython http://www.jython.org
  27. 27. Links (3) Xtext http://www.eclipse.org/xtext Scala DSLs http://www.scala-lang.org/node/1403 Fantom http://fantom.org/
  28. 28. FragenQ&A
  29. 29. Kontakt werner@catmedia.us oder uomo@catmedia.us Twitter: @wernerkeil Hashtag #EclipseUOMo
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×