SpiderNode, V8Monkey, and You                                          mozilla          1Thursday, May 5, 2011
What?                        mozilla          2Thursday, May 5, 2011
What?           In which we put a v8 API on top of spidermonkey without futzing with a separate build           system. Pr...
Why?                        mozilla          3Thursday, May 5, 2011
Why?          • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)                                 ...
Why?          • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)          • SpiderMonkey (born 19...
Why?          • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)          • SpiderMonkey (born 19...
Why?          • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)          • SpiderMonkey (born 19...
Why?          • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)          • SpiderMonkey (born 19...
Why?          • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much)          • SpiderMonkey (born 19...
Approved for ES.next                                 mozilla          4Thursday, May 5, 2011
Approved for ES.next          • let, const, function in block scope                                                  mozil...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Approved for ES.next          • let, const, function in block scope          • destructuring: let {x, y} = pt; let [s, v, ...
Yet more approved for ES.next                                          mozilla          5Thursday, May 5, 2011
Yet more approved for ES.next          • Binary data:                                          mozilla          5Thursday,...
Yet more approved for ES.next          • Binary data:               • const Point2D = new StructType({ x: uint32, y: uint3...
Yet more approved for ES.next          • Binary data:               • const Point2D = new StructType({ x: uint32, y: uint3...
Yet more approved for ES.next          • Binary data:               • const Point2D = new StructType({ x: uint32, y: uint3...
Hot, but not yet in Harmony                                        mozilla          6Thursday, May 5, 2011
Hot, but not yet in Harmony          • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later)            ...
Hot, but not yet in Harmony          • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later)            ...
Hot, but not yet in Harmony          • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later)            ...
Hot, but not yet in Harmony          • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later)            ...
Hot, but not yet in Harmony          • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later)            ...
Hot, but not yet in Harmony          • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later)            ...
What else?                        mozilla          7Thursday, May 5, 2011
What else?          • CoffeeScript classes, for prototypal inheritance sugar               • Or a different classes as clo...
What else?          • CoffeeScript classes, for prototypal inheritance sugar               • Or a different classes as clo...
What else?          • CoffeeScript classes, for prototypal inheritance sugar               • Or a different classes as clo...
What else?          • CoffeeScript classes, for prototypal inheritance sugar               • Or a different classes as clo...
Demo: generators for callback-free i/o          • https://github.com/dherman/taskjs              var {task} = require(./ta...
Demo: generators, continued          • NodeReadFile.prototype = new task.Wait();              task.spawn(function () {    ...
Even shorter generator anti-nesting demo          • let {Wait, spawn, choose} = require(./taskjs/lib/task.js).task;       ...
Thanks, contact, more demos, Q&A          • Thanks to @robarnold @sdwilsh @zpao @john_h_ford and @andreasgal          • ir...
Upcoming SlideShare
Loading in …5
×

Mozilla's NodeConf talk

5,584 views
5,321 views

Published on

Mozilla's NodeConf talk: SpiderNode, V8Monkey, and You

Published in: Technology, News & Politics
1 Comment
7 Likes
Statistics
Notes
  • Blogged with commentary at http://brendaneich.com/2011/05/mozillas-nodeconf-presentation/.

    /be
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
5,584
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
54
Comments
1
Likes
7
Embeds 0
No embeds

No notes for slide

Mozilla's NodeConf talk

  1. 1. SpiderNode, V8Monkey, and You mozilla 1Thursday, May 5, 2011
  2. 2. What? mozilla 2Thursday, May 5, 2011
  3. 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 2Thursday, May 5, 2011
  4. 4. Why? mozilla 3Thursday, May 5, 2011
  5. 5. Why? • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much) mozilla 3Thursday, May 5, 2011
  6. 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 3Thursday, May 5, 2011
  7. 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 3Thursday, May 5, 2011
  8. 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 3Thursday, May 5, 2011
  9. 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 3Thursday, May 5, 2011
  10. 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 3Thursday, May 5, 2011
  11. 11. Approved for ES.next mozilla 4Thursday, May 5, 2011
  12. 12. Approved for ES.next • let, const, function in block scope mozilla 4Thursday, May 5, 2011
  13. 13. Approved for ES.next • let, const, function in block scope • destructuring: let {x, y} = pt; let [s, v, o] = triple() mozilla 4Thursday, May 5, 2011
  14. 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 4Thursday, May 5, 2011
  15. 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 4Thursday, May 5, 2011
  16. 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 4Thursday, May 5, 2011
  17. 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 4Thursday, May 5, 2011
  18. 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 4Thursday, May 5, 2011
  19. 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)] 4Thursday, May 5, 2011
  20. 20. Yet more approved for ES.next mozilla 5Thursday, May 5, 2011
  21. 21. Yet more approved for ES.next • Binary data: mozilla 5Thursday, May 5, 2011
  22. 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 5Thursday, May 5, 2011
  23. 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 5Thursday, May 5, 2011
  24. 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 5Thursday, May 5, 2011
  25. 25. Hot, but not yet in Harmony mozilla 6Thursday, May 5, 2011
  26. 26. Hot, but not yet in Harmony • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later) mozilla 6Thursday, May 5, 2011
  27. 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 6Thursday, May 5, 2011
  28. 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 6Thursday, May 5, 2011
  29. 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 6Thursday, May 5, 2011
  30. 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 6Thursday, May 5, 2011
  31. 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 6Thursday, May 5, 2011
  32. 32. What else? mozilla 7Thursday, May 5, 2011
  33. 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 7Thursday, May 5, 2011
  34. 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 7Thursday, May 5, 2011
  35. 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 7Thursday, May 5, 2011
  36. 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 7Thursday, May 5, 2011
  37. 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 8Thursday, May 5, 2011
  38. 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 9Thursday, May 5, 2011
  39. 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/); 10Thursday, May 5, 2011
  40. 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 11Thursday, May 5, 2011

×