99
Zef Hemel, Eelco Visser

mobl: Een DSL voor mobiele applicatieontwikkeling

Embed Size (px)

Citation preview

Page 1: mobl: Een DSL voor mobiele applicatieontwikkeling

Zef Hemel, Eelco Visser

Page 2: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 3: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 4: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 5: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 6: mobl: Een DSL voor mobiele applicatieontwikkeling

230,000/day

Page 7: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 8: mobl: Een DSL voor mobiele applicatieontwikkeling

200,000/day

Page 9: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 10: mobl: Een DSL voor mobiele applicatieontwikkeling

applicationdevelopment

Page 11: mobl: Een DSL voor mobiele applicatieontwikkeling

Objective-C

Page 12: mobl: Een DSL voor mobiele applicatieontwikkeling

Objective-C Java

Page 13: mobl: Een DSL voor mobiele applicatieontwikkeling

Objective-C Java J2ME/C++

Page 14: mobl: Een DSL voor mobiele applicatieontwikkeling

Objective-C Java J2ME/C++

HTML/Javascript

Page 15: mobl: Een DSL voor mobiele applicatieontwikkeling

Objective-C Java J2ME/C++

HTML/Javascript Java

Page 16: mobl: Een DSL voor mobiele applicatieontwikkeling

Objective-C Java J2ME/C++

HTML/Javascript Java .NET

Page 17: mobl: Een DSL voor mobiele applicatieontwikkeling

AppStore

Page 18: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 19: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 20: mobl: Een DSL voor mobiele applicatieontwikkeling

portability

deployment

Page 21: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 22: mobl: Een DSL voor mobiele applicatieontwikkeling

WWW

Page 23: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 24: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 25: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 26: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 27: mobl: Een DSL voor mobiele applicatieontwikkeling

HTML

Page 28: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

WebDatabases

Page 29: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

Location information (GPS)

WebDatabases

Page 30: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

Location information (GPS)

Threading

WebDatabases

Page 31: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

Location information (GPS)

Threading

Canvas

WebDatabases

Page 32: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

Location information (GPS)

Threading

Canvas

WebDatabases

Multi-touch

Page 33: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

Location information (GPS)

Threading

Canvas

WebDatabases

Multi-touch

Offline support

Page 34: mobl: Een DSL voor mobiele applicatieontwikkeling

WebDatabases

Location information (GPS)

Threading

Canvas

WebDatabases

Multi-touch

Offline support

Full-screen support

Page 35: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 36: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 37: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 38: mobl: Een DSL voor mobiele applicatieontwikkeling

mobile web apps

Page 39: mobl: Een DSL voor mobiele applicatieontwikkeling

HTML

CSS

Javascript

SQLcache

manifests

Page 40: mobl: Een DSL voor mobiele applicatieontwikkeling

HTML

CSS

Javascript

SQLcache

manifests

Page 41: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 42: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 43: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 44: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 45: mobl: Een DSL voor mobiele applicatieontwikkeling

user interface abstraction

Page 46: mobl: Een DSL voor mobiele applicatieontwikkeling

user interface abstraction

Page 47: mobl: Een DSL voor mobiele applicatieontwikkeling

var results = tx.executeQuery("SELECT * FROM Task");for(var i = 0; i < results.length; i++) { alert(results[i].name);}

synchronous programming

Page 48: mobl: Een DSL voor mobiele applicatieontwikkeling

render page

query database and process

results

...

time

Page 49: mobl: Een DSL voor mobiele applicatieontwikkeling

render page

query database and process

results

...

timebrowser freeze

Page 50: mobl: Een DSL voor mobiele applicatieontwikkeling

render page

send query

...

process query result

...

time

Page 51: mobl: Een DSL voor mobiele applicatieontwikkeling

tx.executeQuery("SELECT * FROM Task", function(results) { for(var i = 0; i < results.length; i++) { alert(results[i].name); } });...

asynchronous programming

Page 52: mobl: Een DSL voor mobiele applicatieontwikkeling

tx.executeQuery("SELECT * FROM Task", function(results) { alert("Hello, "); });alert("world!");

Page 53: mobl: Een DSL voor mobiele applicatieontwikkeling

tx.executeQuery("SELECT * FROM Task", function(results) { tx.executeQuery("INSERT ...", function() { alert("Selected, then inserted"); }); });

Page 54: mobl: Een DSL voor mobiele applicatieontwikkeling

mix of loosely-coupled DSLs

poor tool-support for mixed-language projects

lack of abstraction in UI

asynchronous programming

Page 55: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 56: mobl: Een DSL voor mobiele applicatieontwikkeling

demo

http://confplan.zef.me

Page 57: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 58: mobl: Een DSL voor mobiele applicatieontwikkeling

task 1:user interface

http://mobl-lang.org/get.htmlhttp://webdsl.org/zip/devnology/eclipselinux64.ziphttp://webdsl.org/zip/devnology/eclipselinux.ziphttp://webdsl.org/zip/devnology/eclipsemac64.ziphttp://webdsl.org/zip/devnology/eclipsewin.zip

Page 59: mobl: Een DSL voor mobiele applicatieontwikkeling

application tipcalculator

import mobl::ui::generic

screen root() { var amount = 10 var percentage = 10

header("Tip calculator") group { item { numField(amount, label="amount") } item { numField(percentage, label="percentage") } item { "$" label(amount * (1 + percentage/100)) } }}

Page 60: mobl: Een DSL voor mobiele applicatieontwikkeling

application tipcalculator

import mobl::ui::generic

screen root() { var amount = 10 var percentage = 10

header("Tip calculator") group { item { numField(amount, label="amount") } item { numField(percentage, label="percentage") } item { "$" label(amount * (1 + percentage/100)) } }}

Page 61: mobl: Een DSL voor mobiele applicatieontwikkeling

application tipcalculator

import mobl::ui::generic

screen root() { var amount = 10 var percentage = 10

header("Tip calculator") group { item { numField(amount, label="amount") } item { numField(percentage, label="percentage") } item { "$" label(amount * (1 + percentage/100)) } }}

Page 62: mobl: Een DSL voor mobiele applicatieontwikkeling

application tipcalculator

import mobl::ui::generic

screen root() { var amount = 10 var percentage = 10

header("Tip calculator") group { item { numField(amount, label="amount") } item { numField(percentage, label="percentage") } item { "$" label(amount * (1 + percentage/100)) } }}

Page 63: mobl: Een DSL voor mobiele applicatieontwikkeling

application tipcalculator

import mobl::ui::generic

screen root() { var amount = 10 var percentage = 10

header("Tip calculator") group { item { numField(amount, label="amount") } item { numField(percentage, label="percentage") } item { "$" label(amount * (1 + percentage/100)) } }}

Page 64: mobl: Een DSL voor mobiele applicatieontwikkeling

application tipcalculator

import mobl::ui::generic

screen root() { var amount = 10 var percentage = 10

header("Tip calculator") group { item { numField(amount, label="amount") } item { numField(percentage, label="percentage") } item { "$" label(amount * (1 + percentage/100)) } }}

Page 65: mobl: Een DSL voor mobiele applicatieontwikkeling

task 2:scripting

Page 66: mobl: Een DSL voor mobiele applicatieontwikkeling

application test

import mobl::ui::generic

function fac(n : Num) : Num { if(n == 1) { return 1; } else { return n * fac(n-1); }}

screen promptNum(question : String) : Num { var answer = 0 header(question) { button("Done", onclick={ screen return answer; }) } group { item { numField(answer) } }}

screen root() { header("Calculator") var n = 2 group { item { numField(n) } } button("*", onclick={ n = n * promptNum("Multiply with"); }) button("+", onclick={ n = n + promptNum("Add"); }) button("!", onclick={ n = fac(n); })}

Page 67: mobl: Een DSL voor mobiele applicatieontwikkeling

application test

import mobl::ui::generic

function fac(n : Num) : Num { if(n == 1) { return 1; } else { return n * fac(n-1); }}

screen promptNum(question : String) : Num { var answer = 0 header(question) { button("Done", onclick={ screen return answer; }) } group { item { numField(answer) } }}

screen root() { header("Calculator") var n = 2 group { item { numField(n) } } button("*", onclick={ n = n * promptNum("Multiply with"); }) button("+", onclick={ n = n + promptNum("Add"); }) button("!", onclick={ n = fac(n); })}

Page 68: mobl: Een DSL voor mobiele applicatieontwikkeling

application test

import mobl::ui::generic

function fac(n : Num) : Num { if(n == 1) { return 1; } else { return n * fac(n-1); }}

screen promptNum(question : String) : Num { var answer = 0 header(question) { button("Done", onclick={ screen return answer; }) } group { item { numField(answer) } }}

screen root() { header("Calculator") var n = 2 group { item { numField(n) } } button("*", onclick={ n = n * promptNum("Multiply with"); }) button("+", onclick={ n = n + promptNum("Add"); }) button("!", onclick={ n = fac(n); })}

Page 69: mobl: Een DSL voor mobiele applicatieontwikkeling

application todo

import mobl::ui::generic

function fac(n : Num) : Num { if(n == 1) { return 1; } else { return n * fac(n-1); }}

screen promptNum(question : String) : Num { var answer = 0 header(question) { button("Done", onclick={ screen return answer; }) } group { item { numField(answer) } }}

screen root() { header("Calculator") var n = 2 group { item { numField(n) } } button("*", onclick={ n = n * promptNum("Multiply with"); }) button("+", onclick={ n = n + promptNum("Add"); }) button("!", onclick={ n = fac(n); })}

Page 70: mobl: Een DSL voor mobiele applicatieontwikkeling

application test

import mobl::ui::generic

function fac(n : Num) : Num { if(n == 1) { return 1; } else { return n * fac(n-1); }}

screen promptNum(question : String) : Num { var answer = 0 header(question) { button("Done", onclick={ screen return answer; }) } group { item { numField(answer) } }}

screen root() { header("Calculator") var n = 2 group { item { numField(n) } } button("*", onclick={ n = n * promptNum("Multiply with"); }) button("+", onclick={ n = n + promptNum("Add"); }) button("!", onclick={ n = fac(n); })}

Page 71: mobl: Een DSL voor mobiele applicatieontwikkeling

var pos = getPosition();alert("Your location is: " + pos);

Page 72: mobl: Een DSL voor mobiele applicatieontwikkeling

var pos = getPosition();alert("Your location is: " + pos);

var pos;getPosition(function(result) { pos = result; alert("Your location is: " + pos); ...});

continuation-passingstyle transformation

Page 73: mobl: Een DSL voor mobiele applicatieontwikkeling

task 3:data modeling and query

Page 74: mobl: Een DSL voor mobiele applicatieontwikkeling

entity Task { name : String (searchable) done : Bool dateAdded : DateTime}

Page 75: mobl: Een DSL voor mobiele applicatieontwikkeling

entity Task { name : String (searchable) done : Bool dateAdded : DateTime category : Category (inverse: tasks) tags : Collection<Tag> (inverse: tasks)}

entity Category { name : String tasks : Collection<Task> (inverse: category)}

entity Tag { name : String tasks : Collection<Task> (inverse: tags)}

Page 76: mobl: Een DSL voor mobiele applicatieontwikkeling

screen root() { header("Tasks") { button("Add", onclick={ addTask(); }) } group { list(t in Task.all() order by dateAdded desc) { taskItem(t) } } button("Search", onclick={ search(); })}

screen search() { var phrase = "" header("Search") { backButton() } searchBox(phrase) group { list(t in Task.searchPrefix(phrase)) { taskItem(t) } }}

Page 77: mobl: Een DSL voor mobiele applicatieontwikkeling

screen root() { header("Tasks") { button("Add", onclick={ addTask(); }) } group { list(t in Task.all() order by dateAdded desc) { taskItem(t) } } button("Search", onclick={ search(); })}

screen search() { var phrase = "" header("Search") { backButton() } searchBox(phrase) group { list(t in Task.searchPrefix(phrase)) { taskItem(t) } }}

Page 78: mobl: Een DSL voor mobiele applicatieontwikkeling

control taskItem(t : Task) { item(onclick={ taskDetails(t); }) { checkBox(t.done) " " label(t.name) contextMenu { button("Remove", onclick={ remove(t); }) } }}

Page 79: mobl: Een DSL voor mobiele applicatieontwikkeling

control taskItem(t : Task) { item(onclick={ taskDetails(t); }) { checkBox(t.done) " " label(t.name) contextMenu { button("Remove", onclick={ remove(t); }) } }}

Page 80: mobl: Een DSL voor mobiele applicatieontwikkeling

Task.all()

Page 81: mobl: Een DSL voor mobiele applicatieontwikkeling

Task.all() where done == false && ...order by dateAdded desclimit 10offset 5

Page 82: mobl: Een DSL voor mobiele applicatieontwikkeling

Task.all() where done == false && ...order by dateAdded desclimit 10offset 5

Page 83: mobl: Een DSL voor mobiele applicatieontwikkeling

task 4:higher-order controls and

native interfaces

Page 84: mobl: Een DSL voor mobiele applicatieontwikkeling

control taskItem(t : Task) { checkBox(t.done) " " label(t.name) contextMenu { button("Remove", onclick={ remove(t); }) }}

control taskDetail(t : Task) { group { item { textField(t.name, placeholder="Task name") } item { checkBox(t.done, label="Done") } }}

screen root() { header("Tasks") { button("Add", onclick={ addTask(); }) } masterDetail(Task.all() order by dateAdded desc, taskItem, taskDetail) button("Search", onclick={ search(); })}

Page 85: mobl: Een DSL voor mobiele applicatieontwikkeling

control taskItem(t : Task) { checkBox(t.done) " " label(t.name) contextMenu { button("Remove", onclick={ remove(t); }) }}

control taskDetail(t : Task) { group { item { textField(t.name, placeholder="Task name") } item { checkBox(t.done, label="Done") } }}

screen root() { header("Tasks") { button("Add", onclick={ addTask(); }) } masterDetail(Task.all() order by dateAdded desc, taskItem, taskDetail) button("Search", onclick={ search(); })}

Page 86: mobl: Een DSL voor mobiele applicatieontwikkeling

control masterDetail(items : Collection<Dynamic>, masterItem : Control1<Dynamic>, detail : Control1<Dynamic>) { group { list(it in items) { item(onclick={ detailScreen(it, detail); }) { masterItem(it) } } }}

screen detailScreen(it : Dynamic, detail : Control1<Dynamic>) { header("Detail") { backButton("Back", onclick={ screen return; }) } detail(it)}

Page 87: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 88: mobl: Een DSL voor mobiele applicatieontwikkeling
Page 89: mobl: Een DSL voor mobiele applicatieontwikkeling

external type LocalStorage { static sync function getItem(key : String) : Dynamic static sync function setItem(key : String, val : Object) : void static sync function removeItem(key : String) : void static sync function clear() : void}

<javascript>firstapp.LocalStorage = window.localStorage;</javascript>

Page 90: mobl: Een DSL voor mobiele applicatieontwikkeling

what else is there?

Page 91: mobl: Een DSL voor mobiele applicatieontwikkeling

service DataProvider { resource getNearbyConferences(lat : Num, long : Num) : [JSON] { uri = "/nearbyConferences" } resource fetchProgram(conferenceId : String) : [JSON] { uri = "/conferenceProgram" }}

web services

Page 92: mobl: Een DSL voor mobiele applicatieontwikkeling

service DataProvider { resource getNearbyConferences(lat : Num, long : Num) : [JSON] { uri = "/nearbyConferences" } resource fetchProgram(conferenceId : String) : [JSON] { uri = "/conferenceProgram" }}

function loadLocalConferences() { var position = getPosition(); var nearbyConferencesJson = DataProvider.getNearbyConferences(position.latitude, position.longitude); foreach(jsonObj in nearbyConferencesJson) { Conference.fromSelectJson(jsonObj); }}

web services

Page 93: mobl: Een DSL voor mobiele applicatieontwikkeling

location & maps

Page 94: mobl: Een DSL voor mobiele applicatieontwikkeling

mobl::ui::ios mobl::ui::jq

Page 95: mobl: Een DSL voor mobiele applicatieontwikkeling

mobl::ui::ios mobl::ui::jq

mobl::ui

Page 96: mobl: Een DSL voor mobiele applicatieontwikkeling

application confplan

offline truetitle "ConfPlan"

Page 97: mobl: Een DSL voor mobiele applicatieontwikkeling

future

Page 98: mobl: Een DSL voor mobiele applicatieontwikkeling

adaptive user interfaces

database sync

more high-level controls

web/native hybrid (PhoneGap)