• Like
Mozilla's NodeConf talk
Upcoming SlideShare
Loading in...5
×

Mozilla's NodeConf talk

  • 4,695 views
Uploaded on

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • Blogged with commentary at http://brendaneich.com/2011/05/mozillas-nodeconf-presentation/.

    /be
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
4,695
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
50
Comments
1
Likes
7

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. SpiderNode, V8Monkey, and You mozilla 1Thursday, May 5, 2011
  • 2. What? mozilla 2Thursday, May 5, 2011
  • 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. Why? mozilla 3Thursday, May 5, 2011
  • 5. Why? • We at Mozilla <3 V8 (we <3 WebKit/JavaScriptCore too; Chakra not so much) mozilla 3Thursday, 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 3Thursday, 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 3Thursday, 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 3Thursday, 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 3Thursday, 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 3Thursday, May 5, 2011
  • 11. Approved for ES.next mozilla 4Thursday, May 5, 2011
  • 12. Approved for ES.next • let, const, function in block scope mozilla 4Thursday, 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 4Thursday, 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 4Thursday, 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 4Thursday, 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 4Thursday, 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 4Thursday, 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 4Thursday, 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)] 4Thursday, May 5, 2011
  • 20. Yet more approved for ES.next mozilla 5Thursday, May 5, 2011
  • 21. Yet more approved for ES.next • Binary data: mozilla 5Thursday, 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 5Thursday, 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 5Thursday, 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 5Thursday, May 5, 2011
  • 25. Hot, but not yet in Harmony mozilla 6Thursday, May 5, 2011
  • 26. Hot, but not yet in Harmony • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later) mozilla 6Thursday, 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 6Thursday, 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 6Thursday, 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 6Thursday, 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 6Thursday, 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 6Thursday, May 5, 2011
  • 32. What else? mozilla 7Thursday, 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 7Thursday, 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 7Thursday, 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 7Thursday, 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 7Thursday, 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 8Thursday, 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 9Thursday, 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/); 10Thursday, 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 11Thursday, May 5, 2011