Your SlideShare is downloading. ×
0
Dealing comfortably with
the confusion of tongues
Ralf Lämmel
Software Languages Team, Koblenz
http://en.wikipedia.org/wik...
Consider the following
system. How to reasonably
summarize its architecture?
RL: c9 is MSFT’s
community-oriented
youtube.
Technology used in the
5th edition of Channel9
ASP.NET MVC
SparkView engine
jQuery
Silverlight 4
Windows Azure, SQL Azure,...
Abeginner’sviewon...
Channel9
http://www.epochtimes.de/pics/2009/07/20/xxl/2009-07-20-xxl--NASA_ueber_AP_Mond_Erde_1969_000_SAWH990715682240_new.jpg
Abs...
• What domain?
• Programming
• X/O/R mapping
• XML/database processing
• GUI
• ...
• What engineering?
• megamodeling prog...
A simpler riddle: how to usefully
characterize these XML technologies?
DOM
SAX
StAX
DOM [Wikipedia]
The Document Object Model (DOM) is a cross-platform
and language-independent convention for
representing a...
SAX [Wikipedia]
SAX (Simple API for XML) is a sequential access
parser API for XML. SAX provides a mechanism for
reading d...
StAX [Wikipedia]
Streaming API for XML (StAX) is an application
programming interface (API) to read and write XML
document...
DOM SAX StAX
Read (parse, query) XML • • •
Write XML • •
Metadata! Metadata! Metadata!
DOM SAX StAX
In-memory XML processing •
Push-based XML parsing •
Pull-based XML parsing •
Metadata! Metadata! Metadata!
DOM SAX StAX
Standardization • ·
.NET counterpart • •
Metadata! Metadata! Metadata!
Follow-up questions?
How to usefully abstract from XML in
defining “push-based”?
How to usefully share conceptual
understa...
An advanced programming class
The Expression Problem
The Visitor Design Pattern
Parsing
XML Processing
XML Validation
XML ...
Our ultimate goal:
heavily annotate programmig
and language technologies and
their uses with metadata
facilitating underst...
A running example:
101companies
http://sourceforge.net/apps/mediawiki/developers/index.php?title=101companies
101companies
...
...
A few variation points
X vs. O vs. R vs. λ etc.
Static typing vs. dynamic typing
Textual vs. abstract vs. visual syntax
GP...
101 ways
to run a company.
101companies
Modeling companies
Model ANTLR
company : 'company' STRING '{' dept* '}';
dept :
'department' STRING '{'
('manager' employee)
('employee' empl...
Model Haske!
type Company = [Dept]
data Dept = Dept Name Manager [SubUnit]
type Manager = Employee
data Employee = Employe...
Model Ecore
There are recurring
themes for
primitive types.
Lists or co!ections
may in fact be
distinguished
structural fo...
Model Ecore/Java/EMF
/**
* @model
*/
public interface Person extends EObject {
	 /**
	 * @model required="true" ordered="f...
<xs:element name="company"> ... </xs:element>
	 <xs:complexType name="dept">
	 	 <xs:sequence>
	 	 	 <xs:element name="nam...
CREATE TABLE dept (
	 deptId INTEGER AUTO_INCREMENT PRIMARY KEY,
	 name VARCHAR(100),
	 managerId INTEGER,
	 FOREIGN KEY (...
101companies
Totaling salaries
Total EMF/Java
public class Total {
	 public static double total(Company company) {
	 	 double total = 0;
	 	 for (Dept de...
Total Haske!
total :: Company -> Float
total = everything (+) (mkQ 0 id)
Traversal or genera!y:
quantification
Type case
Total XML/XQuery
<result>
	{sum(//salary)}
</result>
A domain-specific language for
queries is good at doing, we!, queries.
Total XML/DOM/XPath
public static double total(Document doc)
	 	 throws Exception {
	 double total = 0;
NodeList nodelist ...
Total XML/Java/JAXB
public class Total {
	 public static double total(Company c) {
	 	 double total = 0;
	 	 if (c.getDept...
Total SQL DML
SELECT SUM(salary)
FROM employee;
What’s the XML/OO
counterpart to
projection?
Query languages
provide aggre...
Total Java / JDBC
public static double total(MyConnection myConnection)
	 	 throws SQLException {
	 double total = 0;
	 St...
Total RDF/Java/Jena
public static double total(CompanyModel c) {
	 double total = 0;
	 StmtIterator i =
	 	 c.getModel().l...
Ecore/ATL
module Total;
create OUT: Total from IN: Company;
rule Company2Total {
	 from
	 company : Company!Company
	 to
	...
101companies
Cutting salaries
Cut Haske!
cut :: Company -> Company
cut = everywhere (mkT (/(2::Float)))
The type of a pure function reveals
its nature o...
Cut EMF/Java
public class Cut {
	 public static void cutCompany(Company company) {
	 	 for (Dept dept : company.getDepts()...
Cut XML/XQuery
copy $copy := .
modify
	 for $salary in $copy//salary
	 return
replace value of node $salary
with $salary d...
Cut XML/XSLT
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:com="http://www.softlang.org/company.x...
Cut SQL DML
UPDATE employee
SET
salary = salary / 2;
Type-based quantification is
rea!y simple with RDBMS.
Cut RDF/Java/Jena
public static void cut(CompanyModel c) {
	 List<Statement> l =
	 	 c.getModel().listStatements(
	 	 	 ne...
Cut Ecore/ATL
module Cut;
create OUT: Company from IN: Company;
rule Company2Company {
	 from s : Company!Company
	 to t :...
101companies
Mapping companies
Map Java/Serializable
import org.softlang.company.*;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
Fil...
XML/Java/JAXBMap
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"name", "address"})
@XmlRootElemen...
XML/Java/JAXB
import org.softlang.company.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import...
Ecore/Java/EMFMap
<GenModel ...>
<genPackages prefix="Company" ...>
<genClasses ecoreClass="Company.ecore#//Company">
<gen...
Relational/Java/HibernateMap
<hibernate-mapping>
<class name="org.softlang.om.Dept" table="DEPT">
<id name="id" column="DE...
Relational/Java/Hibernate
import org.hibernate.Session;
import java.util.HashSet;
import java.util.List;
import java.util....
Relational/Java/HibernateMap
<hibernate-mapping>
<class name="org.softlang.om.Dept" table="DEPT">
<id name="id" column="DE...
101companies
Interacting with
companies
GUI Java/Swing
A GUI essentia!y provides a concrete
syntax for the underlying language.
GUI Ajax/Java[Script] /GWT
Compared to a regular GUI, this
scheme involves distribution, and, in
fact, mapping.
public CompanyInfo getCompanyInfo(Company company) {
	 CompanyInfo companyInfo = new CompanyInfo();
	 for (Dept dept : com...
Our ultimate goal:
heavily annotate programmig
and language technologies and
their uses with metadata
facilitating underst...
Thanks!
Questions or comments?
Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
Upcoming SlideShare
Loading in...5
×

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

806

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

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

No notes for slide

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

  1. 1. 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)
  2. 2. Consider the following system. How to reasonably summarize its architecture?
  3. 3. RL: c9 is MSFT’s community-oriented youtube.
  4. 4. 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
  5. 5. Abeginner’sviewon... Channel9
  6. 6. 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!
  7. 7. • What domain? • Programming • X/O/R mapping • XML/database processing • GUI • ... • What engineering? • megamodeling programming • software language engineering CH O O SE Forum 2012 D om ain-specific Engineering
  8. 8. A simpler riddle: how to usefully characterize these XML technologies? DOM SAX StAX
  9. 9. 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). ...
  10. 10. 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. ...
  11. 11. 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. ...
  12. 12. DOM SAX StAX Read (parse, query) XML • • • Write XML • • Metadata! Metadata! Metadata!
  13. 13. DOM SAX StAX In-memory XML processing • Push-based XML parsing • Pull-based XML parsing • Metadata! Metadata! Metadata!
  14. 14. DOM SAX StAX Standardization • · .NET counterpart • • Metadata! Metadata! Metadata!
  15. 15. 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? ...
  16. 16. 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
  17. 17. Our ultimate goal: heavily annotate programmig and language technologies and their uses with metadata facilitating understanding.
  18. 18. A running example: 101companies http://sourceforge.net/apps/mediawiki/developers/index.php?title=101companies
  19. 19. 101companies
  20. 20. ...
  21. 21. ...
  22. 22. A few variation points X vs. O vs. R vs. λ etc. Static typing vs. dynamic typing Textual vs. abstract vs. visual syntax GPPL vs. DSL vs. embedding vs. API Instance- vs. operation-based mapping Type checking vs. inference vs. reasoning Code first vs. schema first vs. mapping only In-memory processing vs. push vs. pull parsing Pure vs. impure transformations (or in between) Code vs. generative vs. model-driven vs. mapping
  23. 23. 101 ways to run a company.
  24. 24. 101companies Modeling companies
  25. 25. Model ANTLR company : '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.
  26. 26. Model Haske! type Company = [Dept] data Dept = Dept Name Manager [SubUnit] type Manager = Employee data Employee = Employee Name Address Salary data SubUnit = PU Employee | DU Dept type Name = String type Address = String type 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.
  27. 27. Model Ecore There are recurring themes for primitive types. Lists or co!ections may in fact be distinguished structural forms.
  28. 28. 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.
  29. 29. <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.
  30. 30. 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.
  31. 31. 101companies Totaling salaries
  32. 32. 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”.
  33. 33. Total Haske! total :: Company -> Float total = everything (+) (mkQ 0 id) Traversal or genera!y: quantification Type case
  34. 34. Total XML/XQuery <result> {sum(//salary)} </result> A domain-specific language for queries is good at doing, we!, queries.
  35. 35. 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.
  36. 36. 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) { ... } } POJOs Time and again.
  37. 37. Total SQL DML SELECT SUM(salary) FROM employee; What’s the XML/OO counterpart to projection? Query languages provide aggregators.
  38. 38. 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
  39. 39. 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.
  40. 40. Ecore/ATL module 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
  41. 41. 101companies Cutting salaries
  42. 42. Cut Haske! cut :: Company -> Company cut = everywhere (mkT (/(2::Float))) The type of a pure function reveals its nature of being a transformation.
  43. 43. 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.
  44. 44. 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.
  45. 45. 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.
  46. 46. Cut SQL DML UPDATE employee SET salary = salary / 2; Type-based quantification is rea!y simple with RDBMS.
  47. 47. 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
  48. 48. 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.
  49. 49. 101companies Mapping companies
  50. 50. 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.
  51. 51. 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.
  52. 52. 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.
  53. 53. 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.
  54. 54. 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.
  55. 55. Relational/Java/Hibernate import 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
  56. 56. 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
  57. 57. 101companies Interacting with companies
  58. 58. GUI Java/Swing A GUI essentia!y provides a concrete syntax for the underlying language.
  59. 59. GUI Ajax/Java[Script] /GWT Compared to a regular GUI, this scheme involves distribution, and, in fact, mapping.
  60. 60. 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
  61. 61. Our ultimate goal: heavily annotate programmig and language technologies and their uses with metadata facilitating understanding.
  62. 62. Thanks! Questions or comments?
  1. A particular slide catching your eye?

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

×