3. What?
In which we put a v8 API on top of spidermonkey without futzing with a separate build
system. Prep work for spidernode. (from an autoupdated unofďŹcial mozilla-central clone)
mozilla
2
Thursday, May 5, 2011
5. Why?
⢠We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)
mozilla
3
Thursday, May 5, 2011
6. Why?
⢠We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)
⢠SpiderMonkey (born 1996, reborn 2008 [TraceMonkey], 2010 [JaegerMonkey],
2011 [TypeInferenceMonkey], 2012 [IonMonkey] -- âMy afterlife is *so* boring!â -
Heathers) really needs a better API
mozilla
3
Thursday, May 5, 2011
7. Why?
⢠We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)
⢠SpiderMonkey (born 1996, reborn 2008 [TraceMonkey], 2010 [JaegerMonkey],
2011 [TypeInferenceMonkey], 2012 [IonMonkey] -- âMy afterlife is *so* boring!â -
Heathers) really needs a better API
⢠V8 has a nice âC++ the good partsâ API
mozilla
3
Thursday, May 5, 2011
8. Why?
⢠We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)
⢠SpiderMonkey (born 1996, reborn 2008 [TraceMonkey], 2010 [JaegerMonkey],
2011 [TypeInferenceMonkey], 2012 [IonMonkey] -- âMy afterlife is *so* boring!â -
Heathers) really needs a better API
⢠V8 has a nice âC++ the good partsâ API
⢠Template types, RAII storage class auto helpers, GC all the way down
mozilla
3
Thursday, May 5, 2011
9. Why?
⢠We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)
⢠SpiderMonkey (born 1996, reborn 2008 [TraceMonkey], 2010 [JaegerMonkey],
2011 [TypeInferenceMonkey], 2012 [IonMonkey] -- âMy afterlife is *so* boring!â -
Heathers) really needs a better API
⢠V8 has a nice âC++ the good partsâ API
⢠Template types, RAII storage class auto helpers, GC all the way down
⢠JS the language is evolving -- Harmony coming in ES.next
mozilla
3
Thursday, May 5, 2011
10. Why?
⢠We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)
⢠SpiderMonkey (born 1996, reborn 2008 [TraceMonkey], 2010 [JaegerMonkey],
2011 [TypeInferenceMonkey], 2012 [IonMonkey] -- âMy afterlife is *so* boring!â -
Heathers) really needs a better API
⢠V8 has a nice âC++ the good partsâ API
⢠Template types, RAII storage class auto helpers, GC all the way down
⢠JS the language is evolving -- Harmony coming in ES.next
⢠Node is a great testbed for new JS features
mozilla
3
Thursday, May 5, 2011
12. Approved for ES.next
⢠let, const, function in block scope
mozilla
4
Thursday, May 5, 2011
13. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
mozilla
4
Thursday, May 5, 2011
14. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
⢠parameter default values: function f(x, y=1, z=0) {...}
mozilla
4
Thursday, May 5, 2011
15. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
⢠parameter default values: function f(x, y=1, z=0) {...}
⢠rest, spread: function g(i, j, ...r) { return r.slice(i, j); }
let a = [0,1,2,3],
o = new any_constructor(...a)
mozilla
4
Thursday, May 5, 2011
16. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
⢠parameter default values: function f(x, y=1, z=0) {...}
⢠rest, spread: function g(i, j, ...r) { return r.slice(i, j); }
let a = [0,1,2,3],
o = new any_constructor(...a)
⢠proxies, weak maps: Proxy.create(handler, proto), new WeakMap
mozilla
4
Thursday, May 5, 2011
17. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
⢠parameter default values: function f(x, y=1, z=0) {...}
⢠rest, spread: function g(i, j, ...r) { return r.slice(i, j); }
let a = [0,1,2,3],
o = new any_constructor(...a)
⢠proxies, weak maps: Proxy.create(handler, proto), new WeakMap
⢠modules: module M { export function fast_sin(x) {...} }
mozilla
4
Thursday, May 5, 2011
18. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
⢠parameter default values: function f(x, y=1, z=0) {...}
⢠rest, spread: function g(i, j, ...r) { return r.slice(i, j); }
let a = [0,1,2,3],
o = new any_constructor(...a)
⢠proxies, weak maps: Proxy.create(handler, proto), new WeakMap
⢠modules: module M { export function fast_sin(x) {...} }
⢠iterators, generators: function* gen() { yield 1; yield 2; }
mozilla
4
Thursday, May 5, 2011
19. Approved for ES.next
⢠let, const, function in block scope
⢠destructuring: let {x, y} = pt; let [s, v, o] = triple()
⢠parameter default values: function f(x, y=1, z=0) {...}
⢠rest, spread: function g(i, j, ...r) { return r.slice(i, j); }
let a = [0,1,2,3],
o = new any_constructor(...a)
⢠proxies, weak maps: Proxy.create(handler, proto), new WeakMap
⢠modules: module M { export function fast_sin(x) {...} }
⢠iterators, generators: function* gen() { yield 1; yield 2; }
mozilla
⢠comprehensions: return [a+b for (a in A) for (b in B)]
4
Thursday, May 5, 2011
21. Yet more approved for ES.next
⢠Binary data:
mozilla
5
Thursday, May 5, 2011
22. Yet more approved for ES.next
⢠Binary data:
⢠const Point2D = new StructType({ x: uint32, y: uint32 }),
Color = new StructType({ r: uint8, g: uint8,
b: uint8 }),
Pixel = new StructType({ point: Point2D,
color: Color });
mozilla
5
Thursday, May 5, 2011
23. Yet more approved for ES.next
⢠Binary data:
⢠const Point2D = new StructType({ x: uint32, y: uint32 }),
Color = new StructType({ r: uint8, g: uint8,
b: uint8 }),
Pixel = new StructType({ point: Point2D,
color: Color });
⢠const Triangle = new ArrayType(Pixel, 3);
mozilla
5
Thursday, May 5, 2011
24. Yet more approved for ES.next
⢠Binary data:
⢠const Point2D = new StructType({ x: uint32, y: uint32 }),
Color = new StructType({ r: uint8, g: uint8,
b: uint8 }),
Pixel = new StructType({ point: Point2D,
color: Color });
⢠const Triangle = new ArrayType(Pixel, 3);
⢠new Triangle([{ point: { x: 0, y: 0 },
color: { r: 255, g: 255, b: 255 } },
{ point: { x: 5, y: 5 },
color: { r: 128, g: 0, b: 0 } },
{ point: { x: 10, y: 0 },
color: { r: 0, g: 0, b: 128 } }]);
mozilla
5
Thursday, May 5, 2011
25. Hot, but not yet in Harmony
mozilla
6
Thursday, May 5, 2011
26. Hot, but not yet in Harmony
⢠Arrow function syntax, instead of Îť, Ć, or # (want to save # for later)
mozilla
6
Thursday, May 5, 2011
27. Hot, but not yet in Harmony
⢠Arrow function syntax, instead of Îť, Ć, or # (want to save # for later)
⢠Just like CoffeeScript: let identity = (x) -> x
mozilla
6
Thursday, May 5, 2011
28. Hot, but not yet in Harmony
⢠Arrow function syntax, instead of Îť, Ć, or # (want to save # for later)
⢠Just like CoffeeScript: let identity = (x) -> x
⢠Expression body: const square = (x) -> (x * x)
mozilla
6
Thursday, May 5, 2011
29. Hot, but not yet in Harmony
⢠Arrow function syntax, instead of Îť, Ć, or # (want to save # for later)
⢠Just like CoffeeScript: let identity = (x) -> x
⢠Expression body: const square = (x) -> (x * x)
⢠Statement body: let countUsed = (str) -> {
if (str in usedWords)
usedWords[str]++;
else
usedWords[str] = 1;
}
mozilla
6
Thursday, May 5, 2011
30. Hot, but not yet in Harmony
⢠Arrow function syntax, instead of Îť, Ć, or # (want to save # for later)
⢠Just like CoffeeScript: let identity = (x) -> x
⢠Expression body: const square = (x) -> (x * x)
⢠Statement body: let countUsed = (str) -> {
if (str in usedWords)
usedWords[str]++;
else
usedWords[str] = 1;
}
⢠Fat arrow too: callback = (msg) => ( this.vmail.push(msg) )
mozilla
6
Thursday, May 5, 2011
31. Hot, but not yet in Harmony
⢠Arrow function syntax, instead of Îť, Ć, or # (want to save # for later)
⢠Just like CoffeeScript: let identity = (x) -> x
⢠Expression body: const square = (x) -> (x * x)
⢠Statement body: let countUsed = (str) -> {
if (str in usedWords)
usedWords[str]++;
else
usedWords[str] = 1;
}
⢠Fat arrow too: callback = (msg) => ( this.vmail.push(msg) )
⢠Binding forms: let f() -> âwritableâ
const K() -> âreadonlyâ mozilla
6
Thursday, May 5, 2011
33. What else?
⢠CoffeeScript classes, for prototypal inheritance sugar
⢠Or a different classes as closure pattern sugar proposal?
⢠Or (and this is somewhat Coffee-like) extended object initialisers?
mozilla
7
Thursday, May 5, 2011
34. What else?
⢠CoffeeScript classes, for prototypal inheritance sugar
⢠Or a different classes as closure pattern sugar proposal?
⢠Or (and this is somewhat Coffee-like) extended object initialisers?
⢠Coffeeâs @foo for this.foo
⢠Or some private names or âsoft ďŹeldsâ @ usage?
mozilla
7
Thursday, May 5, 2011
35. What else?
⢠CoffeeScript classes, for prototypal inheritance sugar
⢠Or a different classes as closure pattern sugar proposal?
⢠Or (and this is somewhat Coffee-like) extended object initialisers?
⢠Coffeeâs @foo for this.foo
⢠Or some private names or âsoft ďŹeldsâ @ usage?
⢠Paren-free syntax: if x > y return x
while i < n { a.push(i++); }
mozilla
7
Thursday, May 5, 2011
36. What else?
⢠CoffeeScript classes, for prototypal inheritance sugar
⢠Or a different classes as closure pattern sugar proposal?
⢠Or (and this is somewhat Coffee-like) extended object initialisers?
⢠Coffeeâs @foo for this.foo
⢠Or some private names or âsoft ďŹeldsâ @ usage?
⢠Paren-free syntax: if x > y return x
while i < n { a.push(i++); }
⢠More operators: ?? ??= div mod divmod is isnt
mozilla
7
Thursday, May 5, 2011
37. Demo: generators for callback-free i/o
⢠https://github.com/dherman/taskjs
var {task} = require('./taskjs/lib/task.js');
var fs = require('fs');
function readFile(path) {
return new NodeReadFile(path);
}
function NodeReadFile(path) {
this.path = path;
var wait = this;
fs.readFile(path, function (err, data) {
if (err) {
wait.throw(err);
} else {
wait.return(data);
}
}
}); mozilla
8
Thursday, May 5, 2011
38. Demo: generators, continued
⢠NodeReadFile.prototype = new task.Wait();
task.spawn(function () {
try {
var data = yield readFile('gen.js');
console.log(data.toString('ascii'));
} catch (e) {
console.log(e);
}
});
⢠You have to write yield a bit (donât forget it!)
⢠But you donât have to write function(){...} nests
mozilla
9
Thursday, May 5, 2011
39. Even shorter generator anti-nesting demo
⢠let {Wait, spawn, choose} = require('./taskjs/lib/task.js').task;
let newRequest = new Wait();
require('http').createServer(function (req, res) {
newRequest.return([req, res]);
}).listen(10337, "127.0.0.1");
spawn(function () {
let i = 0;
while (true) {
let [req, res] = yield newRequest;
if (req.url === '/') {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World: ' + i + 'n');
i++;
}
}
}) mozilla
console.log('Server running at http://127.0.0.1:10337/');
10
Thursday, May 5, 2011
40. Thanks, contact, more demos, Q&A
⢠Thanks to @robarnold @sdwilsh @zpao @john_h_ford and @andreasgal
⢠irc.mozilla.org #spidernode
⢠spidernode@mozilla.org (mailman subscribe request)
⢠More demos
⢠NodeChat running at SSID spidernode 169.254.64.209
⢠Questions?
mozilla
11
Thursday, May 5, 2011