More Related Content Similar to Typ-sichere DSLs (20) More from Werner Keil (20) Typ-sichere DSLs2. Zielsetzung
ARITHMETISCHE ODER
DATENTYP FEHLER BEI DSL
NUTZUNG VERMEIDEN
2 © 2007-2012 Creative Arts & Technologies
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&A
3 © 2007-2012 Creative Arts & Technologies
4. Was bin Ich?
Werner Keil
• Consultant – Coach
• Creative Cosmopolitan
• Open Source Evangelist
• Software Architect
• Java Godfather
• UOMo Lead
• …
Twitter @wernerkeil
4 © 2007-2012 Creative Arts & Technologies
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 -kosten
5 © 2007-2012 Creative Arts & Technologies
6. Was ist eine Domäne?
Real-Time Business
Systems Systems
Requirements
Specification
Aircraft Patient Insurance
control Management Management Implementation
systems Systems Systems
Deployment
6 © 2007-2012 Creative Arts & Technologies
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 generiert
7 © 2007-2012 Creative Arts & Technologies
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. 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. 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. 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 agency's 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
Offshore
11 © 2007-2012 Creative Arts & Technologies
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. 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. 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. 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. 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
• HL7's Erweiterungen namens ISO+
25 © 2007-2012 Creative Arts & Technologies
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 directly
26 © 2007-2012 Creative Arts & Technologies
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. 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. Jython (3)
Result
Starting Cost: 23.75
Tip Percentage: 0.15
Tax Percentage: 0.07
29
30 © 2007-2012 Creative Arts & Technologies
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
25. Links
Eclipse – Project UOMo
http://www.eclipse.org/uomo/
Units of Measurement API
http://www.unitsofmeasurement.org
UCUM
http://www.unitsofmeasure.org
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. Links (3)
Xtext
http://www.eclipse.org/xtext
Scala DSLs
http://www.scala-lang.org/node/1403
Fantom
http://fantom.org/
29. Kontakt
werner@catmedia.us
oder
uomo@catmedia.us
Twitter: @wernerkeil
Hashtag #EclipseUOMo