pil - a platform independent language

109
Zef Hemel, Eelco Visser PIL: A P latform I ndependent L anguage for Retargetable DSLs Delft University of Techology, The Netherlands

Upload: zefhemel

Post on 18-Feb-2017

3.695 views

Category:

Technology


1 download

TRANSCRIPT

Zef Hemel, Eelco Visser

PIL: A Platform Independent Language for Retargetable DSLs

Delft University of Techology, The Netherlands

domain-specific languages

Stratego/XT

domain-specific languages

Stratego/XT

compiler

“traditional” compilers

✘ low-level✘ complex to generate✘ machine-specific

“traditional” compilers

DSL compilers

✔ high-level✔ easier to generate✔ machine-independent

DSL compilers

✔ high-level✔ easier to generate✔ machine-independent

DSL generators

✔ high-level✔ easier to generate✔ machine-independent

DSL generators

✔ high-level✔ easier to generate✔ machine-independent

DSL generators

✔ high-level✔ easier to generate✔ machine-independent

DSL generators

software platforms

data model user interface

logic access control

workflow data validation

define page conference(c : Conference) { header { “Accepted papers” } list { for(p : Paper in c.papers where p.accepted) { listitem { output(p) } } }}

http://tweetview.net/ev/sle09

WebDSL compiler

WebDSL compiler

java

java python

ANTLR

ANTLR

action scriptc c#

c# 3delphijava

javascript

objective-cperl 5 python

action script c

c# c# 3 delphijavajavascript

objective-cperl 5 python

language status

Java in sync with ANTLR3

JavaScript in sync with ANTLR3

C# 3 in sync with ANTLR3 (except no support for -debug and -profile)

Objective-C currently catching up with release version

Ruby last working version is v3.0ea7. Catching up with v3.0b3

ANTLR back-end supportas of 4th of september 2009

DSL compiler architecture

DSL(model)

Platform

parse

typecheck

desugar

generate code

DSL(text)

DSL(checked)

DSL(core)

Code

pretty-print

fron

t-en

dba

ck-e

nd

DSL(model)

Platform

parse

typecheck

desugar

generate code

DSL(text)

DSL(checked)

DSL(core)

Code

pretty-print

fron

t-en

dba

ck-e

nd

retargeting a DSL compiler

Platform

DSL(core)

Platform 1 Platform 2

DSL(core)

Platform 1 Platform 2

large semantic gap

DSL(core)

front-end 25,000

back-ends 10,000 each

page-elem-to-java: |[ list { elem* } ]| -> |[ out.print(“<ul>”); stat_elem* out.print(“</ul>”); ]| with stat_elem* := <map(elem-to-java)> elem*

Java

page-elem-to-java: |[ list { elem* } ]| -> |[ out.print(“<ul>”); stat_elem* out.print(“</ul>”); ]| with stat_elem* := <map(elem-to-java)> elem*

Java

servlets

servlets

performanceflexibility control

developer platform != code generator platform

developer platforms

Java C# Python Ruby

OOP

developer platforms

Java C# Python Ruby

OOP

lambda functionsORM framework

event supportflexible syntaxinner classes

anonymous classesiterators

annotations

dynamic typing

fancy platform features

page-elem-to-java: |[ list { elem* } ]| -> |[ out.print(“<ul>”); stat_elem* out.print(“</ul>”); ]| with stat_elem* := <map(elem-to-java)> elem*

Java

page-elem-to-python: |[ list { elem* } ]| -> |[ out.print(“<ul>”) stat_elem* out.print(“</ul>”) ]| with stat_elem* := <map(elem-to-python)> elem*

Python

Platform 1 Platform 2

language translation

DSL(core)

Platform 1 Platform 2

language translation

DSL(core)

Microsoft™ Java™ language conversion assistant for Visual Studio™

Microsoft™ Java™ language conversion assistant for Visual Studio™

incomplete

JRuby

DSL(core)

C

JRuby

DSL(core)

C

compatibility

compatibility

performance

compatibility

maintenance

performance

compatibility

maintenance

just for JVM and .NET

performance

code generation

Java C# Python Ruby

OOP

just subset of platforms

Platform 1 Platform 2 Platform n

DSL(core)

Platform 1 Platform 2

IL

Platform n

DSL(core)

UNCOLMelvin E. Conway, 1958

Universal Computer Oriented Language

UNCOLMelvin E. Conway, 1958

Universal Computer Oriented Language

O-code

C--

P-code

gcc’s RTL

traditional ILs High-level IL

machine architecture software platform

low-level high-level

abstract syntax familiarconcrete syntax

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

PILPlatform Independent Language

PIL

Java Python ...

DSL(core)

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

simplified Java

✘ visibility modifiers✘ abstract classes✘ interfaces✘ inner/anonymous classes✘ import com.somelib.*;✘ checked exceptions✘ primitive types✘ one class per file✘ static class members

.

a.b

a.b

a = package, class, field,variable?

a.ba::b

this.a.b

PIL

class page::Home extends webdsl::web::Page { String title = null; String name = null;

void init(pil::web::Request request) { this.name = request.getParameter(“name”); }

void render(pil::util::PrintWriter out) { out.print(“<html><head><title>” + title + “</title></head><body>”); out.print(“<h1>Welcome “ + name + “</h1>”); out.print(“</body></html>”); }}

Java-like syntax

ObjectBoolInt

FloatCharByte

StringMutableString

Array<T>List<T>Set<T>

Map<K,V>Exception

1,200 lines Stratego/platform

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

Stratego/XT library

imports libpil-front libpil-java-backend libpil-python-backend

stand-alone compiler

$ pilc -i application.pil --java$ pilc -i application.pil --python

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

abstract from platform

familiar concrete syntax

platform interaction

easy DSL compiler integration

cheap to port

platform interaction

external class pil::web::Request { String getParameter(String name); ...}

platform-specific implementations

package pil.web;

import javax.servlet.http.*;

public class Request { private HttpServletResponse r;

public Response(HttpServletResponse r) { this.r = r; }

public String getParameter(String name) { return r.getParameter(name); } ...}

Java implementation

import cgi

class Request(object): def __init__(self): self.fs = cgi.FieldStorage()

def getParameter(self, name): return self.fs[name] ...

Python implementation

NHibernate

NHibernate

NHibernate

external class db::DatabaseSession { void beginTransaction(); void rollback(); void commit(); List<Object> getAll(Class cls); void persist(Object o); void delete(Object o);}

WebDSL

Java Python

PIL

Hibernate SQLAlchemy

ORM Interface

query API/language?

query API/language?

persistence behavior?

WebDSL

Java Python

PILPIL/ORM

abstract from platform

familiar concrete syntax

code-generation specific abstractions

platform interaction

easy DSL compiler integration

cheap to port

abstract from platform

familiar concrete syntax

code-generation specific abstractions

platform interaction

easy DSL compiler integration

cheap to port

conclusion

retargetability problem:software platforms

retargetability problem:software platforms

maintaining platform back-ends is expensive

retargetability problem:software platforms

maintaining platform back-ends is expensive

PIL

retargetability problem:software platforms

maintaining platform back-ends is expensive

PIL

PIL/G

Java & Python back-ends

Java & Python back-ends

Stratego/XT

Java & Python back-ends

Stratego/XT