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 unofficial 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 fields” @ 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 fields” @ 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 fields” @ 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