SlideShare une entreprise Scribd logo
1  sur  171
Télécharger pour lire hors ligne
http://www.mobl-lang.org


Zef Hemel
230,000   300,000
Objective-C      Java   J2ME/C++




HTML/Javascript   Java     .NET
portability
Objective-C      Java   J2ME/C++




HTML/Javascript   Java     .NET
Webkit browser    Webkit browser   J2ME/C++




 Webkit browser   Webkit browser     .NET
WebDatabases
WebDatabases


Location information
       (GPS)
WebDatabases


Location information
       (GPS)

      Canvas
WebDatabases


Location information
       (GPS)

      Canvas

  Multi-touch
WebDatabases


Location information
       (GPS)
                       Offline support
      Canvas

  Multi-touch
WebDatabases
                 Full-screen support
Location information
       (GPS)
                       Offline support
      Canvas

  Multi-touch
WebDatabases
                 Full-screen support
Location information
       (GPS)
                       Offline support
      Canvas
                 Accelerator support
  Multi-touch
Address book
Address book
  Camera
Address book
  Camera
  Compass
Address book
  Camera
  Compass
   File IO
Address book
  Camera
  Compass
   File IO
   Audio
Address book
  Camera
  Compass
   File IO
   Audio
Notifications
mobl program
today
1. language

2. behind the scenes
language
user interface

   styling

data modeling

  scripting

web services
user interface
demo
ui syntax


screen name(farg*) : ReturnType? {
  screenelem*
}


control name(farg*) {
  screenelem*
}
screen root() {
  ...
}
screen root() {
  ...
}


screen promptString(q : String) : String {
  ...
}
screen root() {
  ...
}


screen promptString(q : String) : String {
  ...
}


control button(s : String,
               onclick : Callback = {}) {
  ...
}
control calls

variable declarations

  control structures

      inline HTML


      script blocks
control calls
button("Click me")
control calls
button("Click me")


button("Click me", {
   alert("Click!");
})
control calls
button("Click me")


button("Click me", {
   alert("Click!");
})


button("Click me", onclick={
   alert("Click!");
})
control calls with body


  group() {
    item() { "Item 1" }
    item() { "Item 2" }
  }
control calls with body


  group {
    item { "Item 1" }
    item { "Item 2" }
  }
variable declarations

var b = true
variable declarations

var b = true
var b : Bool = true
variable declarations

var b = true
var b : Bool = true
var newTask = Task()
variable declarations

var   b = true
var   b : Bool = true
var   newTask = Task()
var   newTask : Task = Task()
when


var b = true

checkBox(b)

when(b) {
  label("Yep")
} else {
  label("Nope")
}
list


var nums = [1, 2, 3]

group {
  list(n in nums) {
    item { label(n) }
  }
}
inline HTML


<img src="img/icon.png"/>
inline HTML


   <img src="img/icon.png"/>


<div class=selected ? selectedStyle
                    : notSelectedStyle>
  ...
</div>
script blocks
         avoid if possible



var n = -1
script {
  n = Math.sqrt(9);
}
higher-order controls
demo
styling
style bigAndBlue {
  color:     blue;
  font-size: 40px;
}
Style
style bigAndBlue {
  color:      blue;
  font-size: 40px;
}
control block(style : Style) {
  ...
}

block(bigAndBlueStyle) {
  label("I am big and blue!");
}
style $baseColor = rgb(100, 100, 100)

style myStyle {
  color:     rgb($baseColor.r+10,
                 $baseColor.g+50,
                 $baseColor.b-20);
  font-size: 20px;
}
style mixin borderRadiusMixin($radius) {
  -moz-border-radius: $radius;
  -webkit-border-radius: $radius;
  border-radius: $radius;
}
style mixin borderRadiusMixin($radius) {
  -moz-border-radius: $radius;
  -webkit-border-radius: $radius;
  border-radius: $radius;
}


style myStyle {
  color:     $baseColor;
  borderRadiusMixin(10px);
}
demo
data modeling
   & query
entity   Task {
  name   : String (searchable)
  done   : Bool
  tags   : Collection<Tag> (inverse: tasks)
}


entity Tag {
  name : String (searchable)
  tasks : Collection<Task> (inverse: tags)
}
var newTask = Task(name="New task");
newTask.done = false;
add(newTask);
var doneTasks = Task.all()
Collection<Task>
var doneTasks = Task.all()
Collection<Task>
var doneTasks = Task.all()
                .filter("done", "=", true)
                .order("date", false)
                .limit(10);
Collection<Task>
var tagDoneTasks = tag.tasks
                .filter("done", "=", true)
                .order("date", false)
                .limit(10);
Collection<Task>
var doneTasks = Task.all()
Collection<Task>
var doneTasks = Task.all()
                where done == true
                order by date desc
                limit 10;
Collection<Task>
var tagDoneTasks = tag.tasks
                   where done == true
                   order by date desc
                   limit 10;
Collection<Task>
var searchTasks = Task.search("task")
                  where done == true
                  limit 10;
screen root() {
  header("Tasks")
  group {
    list(t in Task.all() order by date desc) {
      item { label(t.name) }
    }
  }
}
scripting
script in ui


label("Total tasks: " + Task.all().count())
script in ui


label("Total tasks: " + Task.all().count())


button("Click me", onclick={
   alert("You clicked me!");
})
var n = 7;
var n2 = Math.round(n/2);

if(n2 > 3) {
  alert("More than three!");
} else {
  alert("Less than three!");
}
type inference
var n = 7;
var n2 = Math.round(n/2);

if(n2 > 3) {
  alert("More than three!");
} else {
  alert("Less than three!");
}
var done = 0;
foreach(t in Task.all()) {
  if(t.done) {
    done = done + 1;
  }
}
var done = 0;
foreach(t in Task.all()) {
  if(t.done) {
    done = done + 1;
  }
}



var done = (Task.all()
            where done == true)
           .count();
function sqr(n : Num) : Num {
  return n * n;
}
demo: todo list
web service
  access
service SomeService {
  resource tasks() : JSON {
    uri = "/tasks"
  }

    resource search(query : String) : JSON {
      uri = "/search?q=" + escape(query)
    }
}
ajax same-source restriction


service Twitter {
  resource trends() : JSON {
    uri = "/_proxy/api.twitter.com/1/trends.json"
  }

    resource search(query : String) : JSON {
      uri = "/_proxy/search.twitter.com/search.json?q="
            + escape(query)
    }
}
http://api.twitter.com/1/trends.json


{"trends":
  [{"url":"http://search.twitter.com/search?q=...",
     "name":"#ihaveadream"},
    {"url":"http://search.twitter.com/search?q=...",
     "name":"#mlkday"}
    ...
  ]
}
type Trend {
  name : String
  url : String
}

function trendsMapper(json : JSON) : [Trend] {
  return json.trends;
}
resource trends() : JSON {
  uri = "/_proxy/api.twitter.com/1/trends.json"
  mapper = trendsMapper
}
screen root() {
  var trends = Twitter.trends()

    header("Twitter trends")
    group {
      list(topic in trends) {
        item {
          label(topic.name)
        }
      }
    }
}
user interface

   styling

data modeling

  scripting

web services
limitations


slower than native


   no native UI


not great for games
behind the scenes
goals


 portability


completeness


  coverage
goals


 portability   web


completeness


  coverage
goals


 portability   web


completeness   100% code gen


  coverage
design bottom-up
roadmap
1. design core abstractions + native interface
roadmap
1. design core abstractions + native interface

2. enable user land abstractions
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
core abstraction:

synchronous programming


      no more asynchronous
          spaghetti code
synchronous programming


var results = Task.all().list();
for(var i = 0; i < results.length; i++) {
   alert(results[i].name);
}
render page




                 time
query database
 and process
    results




      ...
render page




                                  time
                 query database
browser freeze    and process
                     results




                       ...
render page

 send query




                time
     ...


process query
    result


     ...
asynchronous programming


Task.all.list(function(results) {
    for(var i = 0; i < results.length; i++) {
       alert(results[i].name);
    }
  });
...
Task.all().list(function(results) {
  alert("Hello, ");
});
alert("world!");
Task.all().list(function(results) {
  alert("Hello, ");
});                      breaks sequential
alert("world!");
                     execution assumption
Task.all().list(function(results) {
  // make changes
  ...
  persistence.flush(function() {
    alert("Changes saved!");
  });
});
continuation-passing style
     transformation
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}




function displayLocationAndReturn(callback) {
   mobl.location.getPosition(function(position) {
     console.log("Lat: " + position.latitude);
     console.log("Long: " + position.longitude);
     callback(position);
   });
};
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}




function displayLocationAndReturn(callback) {
   mobl.location.getPosition(function(position) {
     console.log("Lat: " + position.latitude);
     console.log("Long: " + position.longitude);
     callback(position);
   });
};
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}




function displayLocationAndReturn(callback) {
   mobl.location.getPosition(function(position) {
     console.log("Lat: " + position.latitude);
     console.log("Long: " + position.longitude);
     callback(position);
   });
};
core abstraction:

 data binding

no more copying data from and
            to UI
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
var n = 8



var n = ref(8);
var n = 8



       var n = ref(8);

Observable
- set(value)
- get()
- addEventListener(eventType, callback)
label(n * n)




var node = $("<span>");
node.text(n.get() * n.get());
n.addEventListener("change", function() {
    node.text(n.get() * n.get());
});
root.append(node);
label(n * n)




var node = $("<span>");
node.text(n.get() * n.get());
n.addEventListener("change", function() {
    node.text(n.get() * n.get());
});
root.append(node);
label(n * n)




var node = $("<span>");
node.text(n.get() * n.get());
n.addEventListener("change", function() {
    node.text(n.get() * n.get());
});
root.append(node);
button("Inc", onclick={
     n = n + 1;
  })




var node = $("<button ...>");
node.text("Inc");
node.click(function() {
  n.set(n.get() + 1);
});
root.append(node);
button("Inc", onclick={
     n = n + 1;
  })




var node = $("<button ...>");
node.text("Inc");
node.click(function() {
  n.set(n.get() + 1);
});
root.append(node);
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
core abstraction:

data modeling & query



       no more SQL
uses persistence.js
  http://persistencejs.org
entity Task {
  name          :   String (searchable)
  description   :   String (searchable)
  done          :   Bool
  date          :   DateTime
}




var Task = persistence.define('Task', {
  name:        'VARCHAR(255)',
  description: 'VARCHAR(255)',
  done:        'BOOL',
  date:        'DATE'
});

Task.textIndex('description');
Task.textIndex('name');
foreach(t in Task.all()) {
     alert(t.name);
   }




Task.all().forEach(function(t) {
  alert(t.name);
});
foreach(t in Task.all() where done == true) {
        alert(t.name);
      }




Task.all().filter("done", "=", true).forEach(function(t) {
  alert(t.name);
});
native interface
external entity MyEntity

external type MyType

external control contextMenu()

external screen specialScreen()

external sync function add(o : Object) : void

external style myStyle
external sync function add(o : Object) : void

<javascript>
__ns.add = function(o) {
    persistence.add(o);
};
</javascript>
load styles/default.css
load js/persistence.js
where do abstractions
    come from?
where do abstractions
    come from?

        domain
where do abstractions
    come from?

        domain

      experience
domain
screen



         domain
control

screen



         domain
control

screen              entity



         domain
control

screen              entity



         domain

 event
control

screen                 entity



         domain

 event              web service
experience
other DSLs



         experience
other DSLs



         experience


             programming
              paradigms
other DSLs                 annoyances



         experience


             programming
              paradigms
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
goal


       compiler small


library large (and extensible)
how?

- built-in types
- built-in controls

+ native interface
+ sufficiently low-level primitives
+ abstraction mechanisms (screens,
  controls, functions, types)
native interface
external type Object {
  sync function toString() : String
}

external type String : Object {
  length : Num
  sync function charAt(index : Num) : String
  sync function charCodeAt(index : Num) : Num
  ...
}

external   type   Num : Object { }
external   type   Bool : Object { }
external   type   Dynamic : Object { }
external   type   Style : String { }

external type Array<T> {
  length : Num

    sync function get(n : Num) : T
    sync function push(item : T) : void
    sync function join(sep : String) : String
    ...
}
low-level primitives


control image(url : String, onclick : Callback = null) {
  <img src=url onclick=onclick/>
}
low-level primitives

control slideupBlock() {
  div@<div onclick={
     div.slideUp();
  }>
     elements()
  </div>
}

...

slideupBlock {
  label("Click me to slide up")
}
low-level primitives

     control slideupBlock() {
JQuery div@<div onclick={
          div.slideUp();
       }>
          elements()
       </div>
     }

      ...

      slideupBlock {
        label("Click me to slide up")
      }
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
var doneTasks = Task.all()
var doneTasks = Task.all()
                .filter("done", "=", true)
                .order("date", false)
                .limit(10);
var doneTasks = Task.all()
var doneTasks = Task.all()
                where done == true
                order by date desc
                limit 10;
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
load styles/default.css
div.header {
  background: -webkit-gradient(linear, 0% 0%, 0% 100%,
                 from(rgb(72, 100, 180)), to(rgb(32, 60, 140)));
  background: -moz-linear-gradient(top, rgb(72, 100, 180),
                 rgb(32, 60, 140));
  padding: 0;
  height: 2.3em;
  font-size: 1.3em;
  line-height: 2.3em;
  font-weight: bold;
  text-align: center;
  text-shadow: #477 0px 1px 1px;
  color: white;
  font-weight: bold;
  margin: 0;
  z-index: 2;
}
issue

out of sight,
                        no checking
out of mind


    <div class="headerr">
    </div>
little abstraction

div.header {
  background: -webkit-gradient(linear, 0% 0%, 0% 100%,
                 from(rgb(72, 100, 180)), to(rgb(32, 60, 140)));
  background: -moz-linear-gradient(top, rgb(72, 100, 180),
                 rgb(32, 60, 140));
  padding: 0;
  height: 2.3em;
  font-size: 1.3em;
  line-height: 2.3em;
  font-weight: bold;
  text-align: center;
  text-shadow: #477 0px 1px 1px;
  color: white;
  font-weight: bold;
  margin: 0;
  z-index: 2;
}
little abstraction

div.header {                                             mixins
  background: -webkit-gradient(linear, 0% 0%, 0% 100%,
                 from(rgb(72, 100, 180)), to(rgb(32, 60, 140)));
  background: -moz-linear-gradient(top, rgb(72, 100, 180),
                 rgb(32, 60, 140));
  padding: 0;
  height: 2.3em;
  font-size: 1.3em;
  line-height: 2.3em;
  font-weight: bold;
  text-align: center;
  text-shadow: #477 0px 1px 1px;
  color: white;
  font-weight: bold;
  margin: 0;
  z-index: 2;
}
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
http://www.mobl-lang.org

Contenu connexe

Tendances

From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFabio Collini
 
Groovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトークGroovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトークTsuyoshi Yamamoto
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境とTakeshi Arabiki
 
RxSwift 시작하기
RxSwift 시작하기RxSwift 시작하기
RxSwift 시작하기Suyeol Jeon
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
RデバッグあれこれTakeshi Arabiki
 
Nosql hands on handout 04
Nosql hands on handout 04Nosql hands on handout 04
Nosql hands on handout 04Krishna Sankar
 
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While TestingQA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While TestingQAFest
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveEugene Zharkov
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Remy Sharp
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my dayTor Ivry
 
Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScriptniklal
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeMongoDB
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinFabio Collini
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureMike Fogus
 

Tendances (20)

From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
 
ES6, WTF?
ES6, WTF?ES6, WTF?
ES6, WTF?
 
Groovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトークGroovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトーク
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
RxSwift 시작하기
RxSwift 시작하기RxSwift 시작하기
RxSwift 시작하기
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
Rデバッグあれこれ
 
Nosql hands on handout 04
Nosql hands on handout 04Nosql hands on handout 04
Nosql hands on handout 04
 
Pdxpugday2010 pg90
Pdxpugday2010 pg90Pdxpugday2010 pg90
Pdxpugday2010 pg90
 
Baitap tkw
Baitap tkwBaitap tkw
Baitap tkw
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to Groovy
 
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While TestingQA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my day
 
Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScript
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of Clojure
 
Javascript
JavascriptJavascript
Javascript
 

En vedette

Avoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree HuggingAvoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree Huggingzefhemel
 
Frontrow conf
Frontrow confFrontrow conf
Frontrow confzefhemel
 
Internal DSLs
Internal DSLsInternal DSLs
Internal DSLszefhemel
 
Cloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js PoznańCloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js Poznańzefhemel
 
WebWorkFlow
WebWorkFlowWebWorkFlow
WebWorkFlowzefhemel
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Languagezefhemel
 

En vedette (6)

Avoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree HuggingAvoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree Hugging
 
Frontrow conf
Frontrow confFrontrow conf
Frontrow conf
 
Internal DSLs
Internal DSLsInternal DSLs
Internal DSLs
 
Cloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js PoznańCloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js Poznań
 
WebWorkFlow
WebWorkFlowWebWorkFlow
WebWorkFlow
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Language
 

Similaire à mobl - model-driven engineering lecture

Software Language Design & Engineering
Software Language Design & EngineeringSoftware Language Design & Engineering
Software Language Design & EngineeringEelco Visser
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingDevnology
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Domenic Denicola
 
Paris js extensions
Paris js extensionsParis js extensions
Paris js extensionserwanl
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageabilityDaniel Fisher
 
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseEclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseHeiko Behrens
 
Introduction to Scalding and Monoids
Introduction to Scalding and MonoidsIntroduction to Scalding and Monoids
Introduction to Scalding and MonoidsHugo Gävert
 
The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185Mahmoud Samir Fayed
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCpootsbook
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeLaurence Svekis ✔
 
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiMonitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiInfluxData
 
Software Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & SpoofaxSoftware Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & SpoofaxEelco Visser
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 

Similaire à mobl - model-driven engineering lecture (20)

mobl
moblmobl
mobl
 
Software Language Design & Engineering
Software Language Design & EngineeringSoftware Language Design & Engineering
Software Language Design & Engineering
 
mobl
moblmobl
mobl
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Paris js extensions
Paris js extensionsParis js extensions
Paris js extensions
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseEclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
 
Introduction to Scalding and Monoids
Introduction to Scalding and MonoidsIntroduction to Scalding and Monoids
Introduction to Scalding and Monoids
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
 
JQuery Flot
JQuery FlotJQuery Flot
JQuery Flot
 
The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiMonitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
 
Software Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & SpoofaxSoftware Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & Spoofax
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 

Dernier

Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfOverkill Security
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 

Dernier (20)

Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 

mobl - model-driven engineering lecture