Your SlideShare is downloading. ×
0
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Mozilla's NodeConf talk
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Mozilla's NodeConf talk

4,983

Published on

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

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
4,983
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
54
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

×