choose'10: ralf laemmel - dealing confortably with the confusion of tongues

65
Dealing comfortably with the confusion of tongues Ralf Lämmel Software Languages Team, Koblenz http://en.wikipedia.org/wiki/Tower_of_Babel_(M._C._Escher )

Upload: choose

Post on 07-Dec-2014

954 views

Category:

Documents


1 download

DESCRIPTION

Presented by Ralf Laemmel at the Choose Forum 2010 in Bern.

TRANSCRIPT

Page 1: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Dealing comfortably with the confusion of tongues

Ralf LämmelSoftware Languages Team, Koblenz

http://en.wikipedia.org/wiki/Tower_of_Babel_(M._C._Escher)

Page 2: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Consider the following system. How to reasonably

summarize its architecture?

Page 3: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

RL: c9 is MSFT’s community-oriented

youtube.

Page 4: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Technology used in the 5th edition of Channel9

ASP.NET MVC

SparkView engine

jQuery

Silverlight 4

Windows Azure, SQL Azure, “other Azures”

ECN for the Content Delivery Network (videos)

http://channel9.msdn.com/Blogs/C9Team/Welcome-to-the-all-new-Channel-9

Page 5: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

A b

egin

ner’s

vie

w o

n ...

Ch

an

ne

l9

Page 6: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

http://www.epochtimes.de/pics/2009/07/20/xxl/2009-07-20-xxl--NASA_ueber_AP_Mond_Erde_1969_000_SAWH990715682240_new.jpg

Abstraction! Abstraction! Abstraction!

Page 7: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

• What domain?

• Programming

• X/O/R mapping

• XML/database processing

• GUI

• ...

• What engineering?

• megamodeling programming

• software language engineering

CHO

OSE Forum

2012

Dom

ain-specific Engineering

Page 9: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

DOM [Wikipedia]

The Document Object Model (DOM) is a cross-platform and language-independent convention for representing and interacting with objects in HTML, XHTML and XML documents. Aspects of the DOM (such as its "Elements") may be addressed and manipulated within the syntax of the programming language in use. The public interface of a DOM is specified in its Application Programming Interface (API). ...

Page 10: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

SAX [Wikipedia]

SAX (Simple API for XML) is a sequential access parser API for XML. SAX provides a mechanism for reading data from an XML document. It is a popular alternative to the Document Object Model (DOM). ... A parser which implements SAX (ie, a SAX Parser) functions as a stream parser, with an event-driven API. The user defines a number of callback methods that will be called when events occur during parsing. ...

Page 11: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

StAX [Wikipedia]

Streaming API for XML (StAX) is an application programming interface (API) to read and write XML documents, originating from the Java programming language community. Traditionally, XML APIs are either: tree based, ..., event based. ... These two access metaphors can be thought of as polar opposites. ...StAX was designed as a median between these two opposites. ...

Page 12: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

DOM SAX StAX

Read (parse, query) XML • • •

Write XML • •

Metadata! Metadata! Metadata!

Page 13: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

DOM SAX StAX

In-memory XML processing •Push-based XML parsing •Pull-based XML parsing •

Metadata! Metadata! Metadata!

Page 14: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

DOM SAX StAX

Standardization • ·

.NET counterpart • •

Metadata! Metadata! Metadata!

Page 15: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Follow-up questions?

How to usefully abstract from XML in defining “push-based”?

How to usefully share conceptual understanding across DOM and JAXB?

... between JAXB and Hibernate?

...

Page 16: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

An advanced programming class

The Expression Problem

The Visitor Design Pattern

Parsing

XML Processing

XML Validation

XML Data Binding

Database Access

O/R Mapping

Model View Controller

More Design Patterns

Reflection

Aspect-Oriented Programming

Functional OO Programming

Combinator Libraries

Generic Programming

Programming with Threads

Distributed Programming

WebService Programming

Page 17: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Our ultimate goal: heavily annotate programmig

and language technologies and their uses with metadata facilitating understanding.

Page 18: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

A running example:

101companies

http://sourceforge.net/apps/mediawiki/developers/index.php?title=101companies

Page 19: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101companies

Page 20: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
Page 21: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

...

Page 22: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
Page 23: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

...

Page 24: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
Page 25: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

A few variation pointsX vs. O vs. R vs. λ etc.Static typing vs. dynamic typingTextual vs. abstract vs. visual syntaxGPPL vs. DSL vs. embedding vs. APIInstance- vs. operation-based mappingType checking vs. inference vs. reasoningCode first vs. schema first vs. mapping onlyIn-memory processing vs. push vs. pull parsingPure vs. impure transformations (or in between)Code vs. generative vs. model-driven vs. mapping

Page 26: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101 ways to run a company.

Page 27: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101companies

Modeling companies

Page 28: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Model ANTLRcompany : 'company' STRING '{' dept* '}'; dept : 'department' STRING '{' ('manager' employee) ('employee' employee)* dept* '}';employee : STRING '{' 'address' STRING 'salary' FLOAT '}';WS : (' '|'\r'? '\n'|'\t')+ {skip();};STRING : '"' (~'"')* '"';FLOAT : ('0'..'9')+ ('.' ('0'..'9')+)?;

CFGs for HR notation.The aspect of “sharing

knowledge” is underestimated.

Purity of CFGs is an i!usion.

Page 29: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Model Haske!

type Company = [Dept]data Dept = Dept Name Manager [SubUnit]type Manager = Employeedata Employee = Employee Name Address Salarydata SubUnit = PU Employee | DU Depttype Name = Stringtype Address = Stringtype Salary = Float

Structure is defined by sequence, cases, and

recursion.

Algebraic datatypes imply tree shape of

data instances.

Models use nominal & structural types,

and aliases.

Page 30: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Model Ecore

There are recurring themes for

primitive types.

Lists or co!ections may in fact be distinguished

structural forms.

Page 31: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Model Ecore/Java/EMF/** * @model */public interface Person extends EObject { /** * @model required="true" ordered="false" */ String getName(); void setName(String value); /** * @model required="true" ordered="false" */ String getAddress(); void setAddress(String value);}

Programs are

models.

Models are

programs.

Page 32: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

<xs:element name="company"> ... </xs:element> <xs:complexType name="dept"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="manager" type="employee"/> <xs:element maxOccurs="unbounded" minOccurs="0" ref="subunit"/> </xs:sequence> </xs:complexType> <xs:element name="subunit"> <xs:complexType> <xs:choice> <xs:element name="pu" type="employee"/> <xs:element name="du" type="dept"/> </xs:choice> </xs:complexType> </xs:element> <xs:complexType name="employee"> <xs:sequence> <xs:element ref="person"/> <xs:element ref="salary"/> </xs:sequence> </xs:complexType> <xs:element name="person"> ... </xs:element> <xs:element name="salary"> ... </xs:element>

Model XSD

Let’s hope XSD goes away faster than

Cobol.

Page 33: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

CREATE TABLE dept ( deptId INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), managerId INTEGER, FOREIGN KEY (managerId) REFERENCES employee(employeeID), upperDeptId INTEGER, FOREIGN KEY (upperDeptId) REFERENCES dept(deptId) ON DELETE CASCADE ON UPDATE CASCADE);

CREATE TABLE employee (employeeId INTEGER AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(50) NOT NULL, address VARCHAR(50) NOT NULL, salary DOUBLE, deptId INTEGER, FOREIGN KEY (deptId) REFERENCES dept(deptId) ON DELETE CASCADE ON UPDATE CASCADE);

Model SQL DDL

Type references may be represented through key references.

Eventua!y behavioral aspects

join in.

Page 34: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101companies

Totaling salaries

Page 35: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total EMF/Java

public class Total {

public static double total(Company company) {

double total = 0;

for (Dept dept : company.getDepts())

total += total(dept);

return total;

}

private static double total(Dept dept) { ... }

private static double total(Subunit subunit) { ... }

private static double total(Employee employee) { ... }

}

Queries over (systems of)

recursive datatypes may require (systems of)

recursive “functions”.

Page 36: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total Haske!

total :: Company -> Floattotal = everything (+) (mkQ 0 id)

Traversal or genera!y:quantification Type case

Page 37: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total XML/XQuery

<result>{sum(//salary)}</result>

A domain-specific language for queries is good at doing, we!, queries.

Page 38: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total XML/DOM/XPath

public static double total(Document doc) throws Exception { double total = 0; NodeList nodelist = XPathAPI.selectNodeList(doc, "//salary"); for (int i=0; i<nodelist.getLength(); i++) { Element elem = (Element)nodelist.item(i); total += Double.parseDouble(elem.getTextContent()); } return total;} Host language may run embedded programs

and inspect results.

Page 39: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total XML/Java/JAXB

public class Total {

public static double total(Company c) {

double total = 0;

if (c.getDept() != null)

for (Dept d : c.getDept())

total += total(d);

return total;

}

public static double total(Dept d) { ... }

public static double total(Employee e) { ... }

public static double total(Subunit s) { ... }

}

POJOsTime and again.

Page 40: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total SQL DML

SELECT SUM(salary) FROM employee;

What’s the XML/OO counterpart to projection?

Query languages provide aggregators.

Page 41: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total Java / JDBC

public static double total(MyConnection myConnection) throws SQLException { double total = 0; String query = "SELECT salary FROM employee"; PreparedStatement pstmtEmployees = myConnection .getConn() .prepareStatement(query); ResultSet salaries = pstmtEmployees.executeQuery(); while (salaries.next()) total += salaries.getDouble("salary"); return total;}

Iterators on lazy server results

Page 42: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Total RDF/Java/Jena

public static double total(CompanyModel c) { double total = 0; StmtIterator i = c.getModel().listStatements( new SimpleSelector( null, c.SALARY, (RDFNode) null)); while (i.hasNext()) { Statement s = i.next(); total += s.getDouble(); } return total;}

Selection (quantification) over

graphs requires identities.

Page 43: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Ecore/ATLmodule Total;

create OUT: Total from IN: Company;

rule Company2Total {

from

company : Company!Company

to

t : Total!TotalWrapper (

total <- Company!Employee.allInstances()

-> collect(e | e.salary)

-> sum()

)

}

Total

Quantification,Projection,

A'regation

Page 44: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101companies

Cutting salaries

Page 45: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut Haske!

cut :: Company -> Company

cut = everywhere (mkT (/(2::Float)))

The type of a pure function reveals its nature of being a transformation.

Page 46: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut EMF/Java

public class Cut { public static void cutCompany(Company company) { for (Dept dept : company.getDepts()) cut(dept); } private static void cut(Dept dept) { ... } private static void cut(Subunit subunit) { ... } private static void cut(Employee employee) { employee.setSalary(employee.getSalary() / 2); }}

The appearance of “void” in an imperative (OO) language su'ests

impure transformation.

Page 47: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut XML/XQuery

copy $copy := .modify for $salary in $copy//salary return

replace value of node $salary with $salary div 2

return $copy

The distinction of pure vs. impure is not always easy.

Page 48: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut XML/XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:com="http://www.softlang.org/company.xsd" version="1.0"> <xsl:output method="xml" encoding="UTF-8"/> <xsl:template match="com:salary"> <xsl:copy> <xsl:value-of select=". div 2"/> </xsl:copy> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template></xsl:stylesheet> Don’t confuse notation with

concepts. Conceptua!y, XSLT is potentia!y simple.

Page 49: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut SQL DML

UPDATE employee SET salary = salary / 2;

Type-based quantification is rea!y simple with RDBMS.

Page 50: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut RDF/Java/Jena

public static void cut(CompanyModel c) { List<Statement> l = c.getModel().listStatements( new SimpleSelector( null, c.SALARY, (RDFNode) null)).toList(); for (Statement s : l) s.changeLiteralObject(s.getDouble() / 2);}

laziness + mutation = evil

Page 51: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Cut Ecore/ATL

module Cut;create OUT: Company from IN: Company;rule Company2Company { from s : Company!Company to t : Company!Company ( depts <- s.depts ) }rule Employee2Employee { from s : Company!Employee to t : Company!Employee ( person <- s.person, salary <- s.salary / 2 )}rule Dept2Dept { ... }rule Subunit2Subunit_Pu { ... }rule Subunit2Subunit_Du { ... }rule Person2Person { ... }

Rule-based thinking as opposed

to )ee-wheeling functions.

Page 52: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101companies

Mapping companies

Page 53: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Map Java/Serializable

import org.softlang.company.*;import java.io.FileInputStream;import java.io.ObjectInputStream;

FileInputStream fis = new FileInputStream("sampleCompany.ser");ObjectInputStream in = new ObjectInputStream(fis);Object o = in.readObject();in.close();Company c = (Company)o; Use a universal object

representation.

Page 54: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

XML/Java/JAXBMap

@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = {"name", "address"})@XmlRootElement(name = "person")public class Person { @XmlElement(required = true) protected String name; @XmlElement(required = true) protected String address; public String getName() { return name; } public void setName(String value) { name = value; } public String getAddress() { return address; } public void setAddress(String value) { address = value; }}

Annotations capture mapping including constraints.

Page 55: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

XML/Java/JAXB

import org.softlang.company.*;import javax.xml.bind.JAXBContext;import javax.xml.bind.Unmarshaller;import java.io.File;

File input = new File("sampleCompany.xml");JAXBContext jaxbContext = JAXBContext.newInstance("org.softlang.company");Unmarshaller unMarshaller = jaxbContext.createUnmarshaller();Company c = (Company) unMarshaller.unmarshal(input);

Map

There is a 1:1 mapping between

names of program types & serialization-level names.

Page 56: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Ecore/Java/EMFMap

<GenModel ...> <genPackages prefix="Company" ...> <genClasses ecoreClass="Company.ecore#//Company"> <genFeatures ... ecoreFeature="...//Company/depts"/> </genClasses> <genClasses ecoreClass="Company.ecore#//Dept"> <genFeatures ... ecoreFeature="...//Dept/name"/> <genFeatures ... ecoreFeature="...//Dept/manager"/> <genFeatures ... ecoreFeature="...//Dept/subunits"/> </genClasses> ... </genPackages></GenModel>

types-to-types & properties-to-properties

mapping modulo renaming and exclusion.

Page 57: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Relational/Java/HibernateMap

<hibernate-mapping> <class name="org.softlang.om.Dept" table="DEPT"> <id name="id" column="DEPT_ID"> <generator class="native" /> </id> <property name="name" /> <many-to-one name="manager" class="org.softlang.om.Employee" column="MANAGER_ID" unique="true" /> <set name="subunits" table="DEPT_SUBUNIT" inverse="true"> <key column="DEPT_ID" /> <many-to-many column="SUBUNIT_ID" class="org.softlang.om.Subunit" /> </set> </class></hibernate-mapping>

Given: tables and classes. Recover relationship as

mapping.

Page 58: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Relational/Java/Hibernateimport org.hibernate.Session;import java.util.HashSet;import java.util.List;import java.util.Set;

Company c = new Company();c.session = new Configuration(). configure(). buildSessionFactory(). getCurrentSession(); c.session.beginTransaction();List<?> depts = c.session.createQuery( "from Dept where UPPER_DEPT_ID is null").list(); for (Object o : depts) c.getDepts().add((Dept) o);

Map

Persistence incl. transactions

Page 59: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Relational/Java/HibernateMap<hibernate-mapping> <class name="org.softlang.om.Dept" table="DEPT"> <id name="id" column="DEPT_ID"> <generator class="native" /> </id> <property name="name" /> <many-to-one name="manager" column="MANAGER_ID" class="org.softlang.om.Employee" /> <set name="employees" cascade="all"> <key column="DEPT_ID" /> <one-to-many class="org.softlang.om.Employee" /> </set> <set name="subDepartments" cascade="all"> <key column="UPPER_DEPT_ID" /> <one-to-many class="org.softlang.om.Dept" /> </set> </class></hibernate-mapping>

Another schema Another mapping

Page 60: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

101companies

Interacting with companies

Page 61: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

GUI Java/Swing

A GUI essentia!y provides a concrete syntax for the underlying language.

Page 62: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

GUI Ajax/Java[Script] /GWT

Compared to a regular GUI, this scheme involves distribution, and, in

fact, mapping.

Page 63: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

public CompanyInfo getCompanyInfo(Company company) { CompanyInfo companyInfo = new CompanyInfo(); for (Dept dept : company.getDepts()) companyInfo.getDeptsInfos().add(dept.getName()); return companyInfo;}

public class CompanyInfo implements Serializable { private List<String> deptsInfos; public CompanyInfo() { deptsInfos = new LinkedList<String>(); } public List<String> getDeptsInfos() { return deptsInfos; }}

public class Company { private List<Dept> depts; public Company() { depts = new LinkedList<Dept>(); } public List<Dept> getDepts() { return depts; } public Double total() { ... } public void cut() { ... }}

Ajax/Java[Script] /GWTMap

Instance-level mapping

Page 64: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Our ultimate goal: heavily annotate programmig

and language technologies and their uses with metadata facilitating understanding.

Page 65: Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues

Thanks!Questions or comments?