type-safe dsls

29
Type-safe DSLs Using Xtext/TS, Xtend, Groovy and other languages Werner Keil Eclipse DemoCamp Hamburg 14 th June 2012

Upload: werner-keil

Post on 26-May-2015

1.993 views

Category:

Technology


2 download

DESCRIPTION

Groovy founder Guillaume Laforge built on top of the Java standard proposal for type safe Units of Measurements, JSR-275 with his case study of a Domain-Specific Language for unit manipulations some while ago. Based on Unit-API the successor to JSR-275, and its leading Open Source implementation Eclipse UOMo together with Xtext/TS we'll see, how a similar DSL for unit manipulations could be created with Xtext. As well as other languages including Groovy or Scala.

TRANSCRIPT

Page 1: Type-safe DSLs

Type-safe DSLs

Using Xtext/TS, Xtend, Groovy and other languages

Werner Keil

Eclipse DemoCamp Hamburg

14th June 2012

Page 2: Type-safe DSLs

AVOIDING ARITHMETIC OR TYPE ERRORS IN A DSL

Our Goal

2 © 2007-2012 Creative Arts & Technologies

Page 3: Type-safe DSLs

Overview

• Introduction• What is a DSL?• Internal and External DSLS• Type-Safety

•Units and Healthcare• Unit-API, UOMo

• UCUM, HL7, Groovy used by Healthcare

•Other Languages• Jython/WLST• Xtext/Xbase/Xtend• Scala, Fantom, F#

•Demo•Q&A3 © 2007-2012 Creative Arts & Technologies

Page 4: Type-safe DSLs

Who am I?

4 © 2007-2012 Creative Arts & Technologies

Werner Keil

• Consultant – Coach

• Creative Cosmopolitan

• Open Source Evangelist

• Software Architect

• Java Godfather

• …

Twitter @wernerkeil

Page 5: Type-safe DSLs

What is a DSL?

•A DSL is a computer language (specification, modeling, programming) tailored to a particular domain. But, what is a domain?

•DSL examples: SQL, CSS, Sawzall (Google)

•Gains in expressiveness and ease of use (the future could be end-user programming)

•Gains in productivity •Reduced maintenance costs

5 © 2007-2012 Creative Arts & Technologies

Page 6: Type-safe DSLs

What is a Domain?

6 © 2007-2012 Creative Arts & Technologies

Implementation

Specification

Requirements

Deployment

Business

SystemsReal-Time

Systems

Aircraft

control

systems

Patient Management

Systems

Insurance

Management

Systems

Page 7: Type-safe DSLs

Internal Domain Specific Languages

•These are languages built using the syntactic elements of the underlying language

• In the case of Java, building a DSL using Java classes and methods

•With other JVM-based languages, that’s usually similar, Java code generated in many cases

7 © 2007-2012 Creative Arts & Technologies

Page 8: Type-safe DSLs

External Domain Specific Languages•External DSLs

• Written in a different language than the main (host) language of the application

• Transformed into it using some form of compiler or interpreter

•May include• XML configuration files• Plain text configuration files• Full-blown languages

8 © 2007-2012 Creative Arts & Technologies

Page 9: Type-safe DSLs

Type-Safety

•Java does not have strongly typed primitive types (like e.g. Ada language).

•For performance reasons most developer prefer primitive types over objects in their interface.

•Primitives type arguments often lead to name clashes (methods with the same signature)

9 © 2007-2012 Creative Arts & Technologies

Page 10: Type-safe DSLs

What do these disasters have in common?•Patriot MissileThe cause was an inaccurate calculation of the time since boot due to a computer arithmetic error.

•Ariane 5 ExplosionThe floating point number which a value was converted from had a value greater than what would be represented by a 16 bit signed integer.

10 © 2007-2012 Creative Arts & Technologies

Page 11: Type-safe DSLs

• Gimli Glider (near disaster)Fuel loading was miscalculated through misunderstanding of the recently adopted Metric System, replacing the Imperial System

• Mars Orbiter Preliminary findings indicate that one team used English units (e.g. inches, feet and pounds) while the other used metric units for a key spacecraft operation.

• 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

• This also underlines the added risk when 3rd party contractors are involved or projects are developed Offshore

What do these disasters have in common?

11 © 2007-2012 Creative Arts & Technologies

Page 12: Type-safe DSLs

Unit Tests wouldn‘t find these…

•All previous example illustrate three categories of errors difficult to find through Unit Testing:

• Interface Errors (e.g. millisecond/second, radian/degree, meters/feet).

• Arithmetic Errors (e.g. overflow).

• Conversion Errors.

Despite their name

17 © 2007-2012 Creative Arts & Technologies

Page 13: Type-safe DSLs

SQL Example with ErrorsStringBuilder 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

Page 14: Type-safe DSLs

Typesafe SQL ExamplePerson 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

Page 15: Type-safe DSLs

Results with

Same Dimension Different Dimension

Binary Operations Binary Operations

add(double) or (long) root(int)

multiply(double) or (long) power(int)

divide(double) or (long) multiply(Unit)

compound(Unit) divide(Unit)

Unary Operations

inverse()

Unit-API | Operations

Page 16: Type-safe DSLs

Unified Code for Units of Measure

The Unified Code for Units of Measure is inspired byand heavily based on

• ISO 2955-1983

• ANSI X3.50-1986

• HL7's extensions called ISO+

UOMo UCUM

25 © 2007-2012 Creative Arts & Technologies

Page 17: Type-safe DSLs

HL7 DSL

26 © 2007-2012 Creative Arts & Technologies

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

Page 18: Type-safe DSLs

DEMO

Healthcare DSL with Groovy

Page 19: Type-safe DSLs

Jython

28 © 2007-2012 Creative Arts & Technologies

/** * 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;

}

}

Page 20: Type-safe DSLs

Jython (2)

29 © 2007-2012 Creative Arts & Technologies

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))

Page 21: Type-safe DSLs

Jython (3)

30 © 2007-2012 Creative Arts & Technologies

Starting Cost: 23.75

Tip Percentage: 0.15

Tax Percentage: 0.07

29

Result

Page 22: Type-safe DSLs

DEMO

Xtext Examples

Page 23: Type-safe DSLs

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

Page 24: Type-safe DSLs

DEMO

Scala and Fantom Examples

Page 25: Type-safe DSLs

Eclipse – Project UOMo

http://www.eclipse.org/uomo/

Units of Measurement API

http://www.unitsofmeasurement.org

UCUM

http://www.unitsofmeasure.org

Links

Page 26: Type-safe DSLs

OpenHealth Project

http://www.openhealth.org

Groovy DSL Example

http://groovy.dzone.com/news/domain-specific-language-unit-

Jython

http://www.jython.org

Links (2)

Page 27: Type-safe DSLs

Xtext

http://www.eclipse.org/xtext

Scala DSLs

http://www.scala-lang.org/node/1403

Fantom

http://fantom.org/

Links (3)

Page 28: Type-safe DSLs

Q & ALet‘s talk

Page 29: Type-safe DSLs

Contact

[email protected]

or

[email protected]

Twitter: @wernerkeil

Hashtag #EclipseUOMo