Capitol js
Upcoming SlideShare
Loading in...5
×
 

Capitol js

on

  • 14,760 views

My CapitolJS 2011 talk. Firefox add-on source for the Parallel JS demo: http://github.com/RiverTrail/RiverTrail

My CapitolJS 2011 talk. Firefox add-on source for the Parallel JS demo: http://github.com/RiverTrail/RiverTrail

Statistics

Views

Total Views
14,760
Slideshare-icon Views on SlideShare
14,247
Embed Views
513

Actions

Likes
16
Downloads
51
Comments
1

20 Embeds 513

http://www.redditmedia.com 197
http://paper.li 102
https://twitter.com 43
http://twitter.com 37
http://us-w1.rockmelt.com 29
http://lanyrd.com 29
http://tweetedtimes.com 29
http://nuevospowerpoints.blogspot.com 16
http://leapf.org 5
http://www.twylah.com 5
http://taliabale.tumblr.com 5
http://a0.twimg.com 4
http://mundo-powerpoints.blogspot.com 3
http://www.onlydoo.com 2
http://www.slideshare.net 2
http://www.tumblr.com 1
http://twicli.neocat.jp 1
http://trunk.ly 1
http://staging-assets.local.twitter.com 1
http://try.faavorite.com 1
More...

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Capitol js Capitol js Presentation Transcript

    • Capital^H^HolJS brendan@mozilla.orgSunday, September 18, 2011
    • Capital^H^HolJS brendan@mozilla.org • History, goalsSunday, September 18, 2011
    • Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it?Sunday, September 18, 2011
    • Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it? • Dart: I can’t wait!Sunday, September 18, 2011
    • Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it? • Dart: I can’t wait! • Harmony tune-upSunday, September 18, 2011
    • Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it? • Dart: I can’t wait! • Harmony tune-up • RiverTrail demoSunday, September 18, 2011
    • A very brief history mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) • December 1995: “JavaScript”, thanks to Bill Joy (a Sun Founder) mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) • December 1995: “JavaScript”, thanks to Bill Joy (a Sun Founder) • 1996-1997: ES1 thanks to ECMA (now Ecma) TC39 -- see my TXJS talk mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) • December 1995: “JavaScript”, thanks to Bill Joy (a Sun Founder) • 1996-1997: ES1 thanks to ECMA (now Ecma) TC39 -- see my TXJS talk • 1999: ES3: function expressions, RegExps, try/catch/finally, switch, do-while mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) • December 1995: “JavaScript”, thanks to Bill Joy (a Sun Founder) • 1996-1997: ES1 thanks to ECMA (now Ecma) TC39 -- see my TXJS talk • 1999: ES3: function expressions, RegExps, try/catch/finally, switch, do-while • 2005: the Ajax revolution, followed by “The Ajax Experience” mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) • December 1995: “JavaScript”, thanks to Bill Joy (a Sun Founder) • 1996-1997: ES1 thanks to ECMA (now Ecma) TC39 -- see my TXJS talk • 1999: ES3: function expressions, RegExps, try/catch/finally, switch, do-while • 2005: the Ajax revolution, followed by “The Ajax Experience” • 2008: ES4 RIP, Harmony founded in July at the Oslo TC39 meeting mozilla 2Sunday, September 18, 2011
    • A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java • September 1995: “LiveScript” (did Netscape marketing go to Microsoft after?) • December 1995: “JavaScript”, thanks to Bill Joy (a Sun Founder) • 1996-1997: ES1 thanks to ECMA (now Ecma) TC39 -- see my TXJS talk • 1999: ES3: function expressions, RegExps, try/catch/finally, switch, do-while • 2005: the Ajax revolution, followed by “The Ajax Experience” • 2008: ES4 RIP, Harmony founded in July at the Oslo TC39 meeting mozilla • 2009: ES5: “use strict”, JSON, Object.create, etc. 2Sunday, September 18, 2011
    • The Harmony goals mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications • code generators targeting the new edition mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications • code generators targeting the new edition • Better tests, if not a testable (executable) specification mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications • code generators targeting the new edition • Better tests, if not a testable (executable) specification • Adopt de facto standards where possible mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications • code generators targeting the new edition • Better tests, if not a testable (executable) specification • Adopt de facto standards where possible • Keep versioning as simple and linear as possible mozilla 3Sunday, September 18, 2011
    • The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications • code generators targeting the new edition • Better tests, if not a testable (executable) specification • Adopt de facto standards where possible • Keep versioning as simple and linear as possible • Support a statically verifiable, object-capability secure subset mozilla 3Sunday, September 18, 2011
    • Approved for ES6 mozilla 4Sunday, September 18, 2011
    • Approved for ES6 • let, const, function in block scope mozilla 4Sunday, September 18, 2011
    • Approved for ES6 • let, const, function in block scope • destructuring: let {x, y} = pt; let [s, v, o] = triple() mozilla 4Sunday, September 18, 2011
    • Approved for ES6 • 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 4Sunday, September 18, 2011
    • Approved for ES6 • 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 4Sunday, September 18, 2011
    • Approved for ES6 • 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 4Sunday, September 18, 2011
    • Approved for ES6 • 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 4Sunday, September 18, 2011
    • Approved for ES6 • 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 4Sunday, September 18, 2011
    • Approved for ES6 • 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 of A for b of B] 4Sunday, September 18, 2011
    • Yet more approved for ES6 mozilla 5Sunday, September 18, 2011
    • Yet more approved for ES6 • Binary data: mozilla 5Sunday, September 18, 2011
    • Yet more approved for ES6 • 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 5Sunday, September 18, 2011
    • Yet more approved for ES6 • 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 5Sunday, September 18, 2011
    • Yet more approved for ES6 • 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 5Sunday, September 18, 2011
    • Quasi-Literals mozilla 6Sunday, September 18, 2011
    • Quasi-Literals • Injection-safer string interpolation and domain-specific languages mozilla 6Sunday, September 18, 2011
    • Quasi-Literals • Injection-safer string interpolation and domain-specific languages • Backtick-quoted string desugars to a function call that operates on the literal portions and substitution results: mozilla 6Sunday, September 18, 2011
    • Quasi-Literals • Injection-safer string interpolation and domain-specific languages • Backtick-quoted string desugars to a function call that operates on the literal portions and substitution results: • quasi`literalPart1${substitution}literalPart2` desugars to mozilla 6Sunday, September 18, 2011
    • Quasi-Literals • Injection-safer string interpolation and domain-specific languages • Backtick-quoted string desugars to a function call that operates on the literal portions and substitution results: • quasi`literalPart1${substitution}literalPart2` desugars to • quasi({raw: ["literalPart1", "literalPart1"], unescaped: ["literalPart1", "literalPart1"]}, substitution) mozilla 6Sunday, September 18, 2011
    • Quasi-Literals • Injection-safer string interpolation and domain-specific languages • Backtick-quoted string desugars to a function call that operates on the literal portions and substitution results: • quasi`literalPart1${substitution}literalPart2` desugars to • quasi({raw: ["literalPart1", "literalPart1"], unescaped: ["literalPart1", "literalPart1"]}, substitution) • Multiline string literals w/o prefix: `literalPart1${substitution} (yes, that was a newline!) literalPart2` mozilla 6Sunday, September 18, 2011
    • Quasi-Literals • Injection-safer string interpolation and domain-specific languages • Backtick-quoted string desugars to a function call that operates on the literal portions and substitution results: • quasi`literalPart1${substitution}literalPart2` desugars to • quasi({raw: ["literalPart1", "literalPart1"], unescaped: ["literalPart1", "literalPart1"]}, substitution) • Multiline string literals w/o prefix: `literalPart1${substitution} (yes, that was a newline!) literalPart2` mozilla • Multiline regexp literals: re`literalPart1${substitution} (yes, that was a newline!) w+ literalPart2` 6Sunday, September 18, 2011
    • Classes made it, barely (Yay, I think? Why am I sad?) mozilla 7Sunday, September 18, 2011
    • Classes made it, barely (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: mozilla 7Sunday, September 18, 2011
    • Classes made it, barely (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: • class Point { constructor(x, y) { private x = x, y = y; public closed_r() { return Math.sqrt(x*x + y*y); } } get x() { return @x; } get y() { return @y; } equals(p) { return @x === p@x && @y === p@y; } proto_r() { return Math.sqrt(@x * @x + @y * @y); } } mozilla 7Sunday, September 18, 2011
    • Classes made it, barely (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: • class Point { constructor(x, y) { private x = x, y = y; public closed_r() { return Math.sqrt(x*x + y*y); } } get x() { return @x; } get y() { return @y; } equals(p) { return @x === p@x && @y === p@y; } proto_r() { return Math.sqrt(@x * @x + @y * @y); } } • Private member reference syntax (@x, p@x) still up in the air... mozilla 7Sunday, September 18, 2011
    • Classes made it, barely (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: • class Point { constructor(x, y) { private x = x, y = y; public closed_r() { return Math.sqrt(x*x + y*y); } } get x() { return @x; } get y() { return @y; } equals(p) { return @x === p@x && @y === p@y; } proto_r() { return Math.sqrt(@x * @x + @y * @y); } } • Private member reference syntax (@x, p@x) still up in the air... • extends, prototype, and super work the way you want mozilla 7Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax mozilla 8Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later) mozilla 8Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later) • Just like CoffeeScript: let identity = (x) -> x mozilla 8Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax • 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 8Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax • 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 8Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax • 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 8Sunday, September 18, 2011
    • Not yet in Harmony: arrow function syntax • 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 8Sunday, September 18, 2011
    • Not yet in Harmony: block lambda revival • Inspired by Smalltalk via Ruby let empty = {||}; // no need for space between bars assert(empty() === undefined); assert(typeof empty === "function"); // native and implements [[Call]] assert(empty.length === 0);   let identity = {|x| x}; // completion is return value   assert(identity(42) === 42); assert(identity.length === 1);   let a = [1, 2, 3, 4]; let b = a.map {|e| e * e} // paren-free call with block is // idiomatic control structure so // no semicolon at end mozilla print(b); // [1, 4, 9, 16] 9Sunday, September 18, 2011
    • More block lambda revival • Paren-free calls, control effects: you know you want it... b = a.map {|e| // newline in block ok e * e * e} // newline after ends call   function find_first_odd(a) { a.forEach { |e, i| if (e & 1) return i; } // returns from function return -1; }   function escape_return() { return {|e| return e}; } b = escape_return(); try { b(42); } catch (e) {} // error, return from // inactive function mozilla 10Sunday, September 18, 2011
    • Syntax, yay mozilla 11Sunday, September 18, 2011
    • Syntax, yay • Do we need shorter function syntax at all? mozilla 11Sunday, September 18, 2011
    • Syntax, yay • Do we need shorter function syntax at all? • Some say no. @mikeal: “I got 99 problems and JavaScript syntax ain’t one.” mozilla 11Sunday, September 18, 2011
    • Syntax, yay • Do we need shorter function syntax at all? • Some say no. @mikeal: “I got 99 problems and JavaScript syntax ain’t one.” • Others say yes, but divide into roughly three camps: mozilla 11Sunday, September 18, 2011
    • Syntax, yay • Do we need shorter function syntax at all? • Some say no. @mikeal: “I got 99 problems and JavaScript syntax ain’t one.” • Others say yes, but divide into roughly three camps: • Arrow function syntax, as in CoffeeScript. mozilla 11Sunday, September 18, 2011
    • Syntax, yay • Do we need shorter function syntax at all? • Some say no. @mikeal: “I got 99 problems and JavaScript syntax ain’t one.” • Others say yes, but divide into roughly three camps: • Arrow function syntax, as in CoffeeScript. • Block lambdas. @jashkenas: “For the record, I too favor [block lambdas] if arrows in JS will need curlies to delimit blocks. Curlies or arrows, not both.” mozilla 11Sunday, September 18, 2011
    • Syntax, yay • Do we need shorter function syntax at all? • Some say no. @mikeal: “I got 99 problems and JavaScript syntax ain’t one.” • Others say yes, but divide into roughly three camps: • Arrow function syntax, as in CoffeeScript. • Block lambdas. @jashkenas: “For the record, I too favor [block lambdas] if arrows in JS will need curlies to delimit blocks. Curlies or arrows, not both.” • Some leading ugly character, maybe -- unsure about this, return. mozilla 11Sunday, September 18, 2011
    • Dart to the heartSunday, September 18, 2011
    • Dart to the heart • Some things I’ve heard & readSunday, September 18, 2011
    • Dart to the heart • Some things I’ve heard & read • “If JavaScript does not have {classes, “guards”}, then it will be REPLACED!” [May 2010 TC39 meeting]Sunday, September 18, 2011
    • Dart to the heart • Some things I’ve heard & read • “If JavaScript does not have {classes, “guards”}, then it will be REPLACED!” [May 2010 TC39 meeting] • “better performance profile”Sunday, September 18, 2011
    • Dart to the heart • Some things I’ve heard & read • “If JavaScript does not have {classes, “guards”}, then it will be REPLACED!” [May 2010 TC39 meeting] • “better performance profile” • “amenable to tooling”, “(e.g. with optional types)”Sunday, September 18, 2011
    • Dart to the heart • Some things I’ve heard & read • “If JavaScript does not have {classes, “guards”}, then it will be REPLACED!” [May 2010 TC39 meeting] • “better performance profile” • “amenable to tooling”, “(e.g. with optional types)” • “Fundamental problems [like the] single Number primitive....”Sunday, September 18, 2011
    • iOS, lolwut? mozilla 13Sunday, September 18, 2011
    • iOS, lolwut? • Leaked memo: “The emergence of compelling alternative platforms like iOS has meant that the web platform must compete on its merits, not just its reach.” mozilla 13Sunday, September 18, 2011
    • iOS, lolwut? • Leaked memo: “The emergence of compelling alternative platforms like iOS has meant that the web platform must compete on its merits, not just its reach.” • m-k-s on Hacker News: “If they think per the leaked mail that devs are choosing iOS over browsers because of JS, they have their heads in the sand. Those choices are happening due to iOS as a platform not because devs are somehow so much more happier learning/using Objective-C! The best thing that Google could do is to KEEP working hard on improving the browser platform.” mozilla 13Sunday, September 18, 2011
    • Food for thought mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] • Optional runtime guards, as proposed for Harmony but not in ES6 mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] • Optional runtime guards, as proposed for Harmony but not in ES6 • Syntax: let i :: int = 0; function f(a :: G)... mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] • Optional runtime guards, as proposed for Harmony but not in ES6 • Syntax: let i :: int = 0; function f(a :: G)... • Semantics are runtime-pluggable, tie into trademarks proposal (nominal) mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] • Optional runtime guards, as proposed for Harmony but not in ES6 • Syntax: let i :: int = 0; function f(a :: G)... • Semantics are runtime-pluggable, tie into trademarks proposal (nominal) • Proposals came at last minute (May TC39 meeting), not ready for ES6 mozilla 14Sunday, September 18, 2011
    • Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] • Optional runtime guards, as proposed for Harmony but not in ES6 • Syntax: let i :: int = 0; function f(a :: G)... • Semantics are runtime-pluggable, tie into trademarks proposal (nominal) • Proposals came at last minute (May TC39 meeting), not ready for ES6 • Why not int32, int64, bignum, as well as number (double)? mozilla 14Sunday, September 18, 2011
    • The trouble with numbers mozilla 15Sunday, September 18, 2011
    • The trouble with numbers • How to introduce a sane numeric tower for JS? mozilla 15Sunday, September 18, 2011
    • The trouble with numbers • How to introduce a sane numeric tower for JS? • Suffixes: 4294967295u + 1 === 0u, 2147483647i + 1 === -2147483648i; // WTF! mozilla 15Sunday, September 18, 2011
    • The trouble with numbers • How to introduce a sane numeric tower for JS? • Suffixes: 4294967295u + 1 === 0u, 2147483647i + 1 === -2147483648i; // WTF! • Promotion rules as in C, but with dynamic types mozilla 15Sunday, September 18, 2011
    • The trouble with numbers • How to introduce a sane numeric tower for JS? • Suffixes: 4294967295u + 1 === 0u, 2147483647i + 1 === -2147483648i; // WTF! • Promotion rules as in C, but with dynamic types • This smells like trouble mozilla 15Sunday, September 18, 2011
    • The trouble with numbers • How to introduce a sane numeric tower for JS? • Suffixes: 4294967295u + 1 === 0u, 2147483647i + 1 === -2147483648i; // WTF! • Promotion rules as in C, but with dynamic types • This smells like trouble • Better: use bignum arithmetic; use int arithmetic; etc. mozilla 15Sunday, September 18, 2011
    • Better performance predictability mozilla 16Sunday, September 18, 2011
    • Better performance predictability • JS engines currently have performance predictability problems, it’s true mozilla 16Sunday, September 18, 2011
    • Better performance predictability • JS engines currently have performance predictability problems, it’s true • Speculation can go wrong, fall back on slow paths mozilla 16Sunday, September 18, 2011
    • Better performance predictability • JS engines currently have performance predictability problems, it’s true • Speculation can go wrong, fall back on slow paths • Array holes, prototype properties being deleted, unshadowing/fore-shadowing all hurt a bit mozilla 16Sunday, September 18, 2011
    • Better performance predictability • JS engines currently have performance predictability problems, it’s true • Speculation can go wrong, fall back on slow paths • Array holes, prototype properties being deleted, unshadowing/fore-shadowing all hurt a bit • But JS engines are still improving rapidly (e.g. the SpiderMonkey Type Inference work by Brian Hackett) mozilla 16Sunday, September 18, 2011
    • Better performance predictability • JS engines currently have performance predictability problems, it’s true • Speculation can go wrong, fall back on slow paths • Array holes, prototype properties being deleted, unshadowing/fore-shadowing all hurt a bit • But JS engines are still improving rapidly (e.g. the SpiderMonkey Type Inference work by Brian Hackett) • It’s way too soon to throw in the towel mozilla 16Sunday, September 18, 2011
    • Better performance predictability • JS engines currently have performance predictability problems, it’s true • Speculation can go wrong, fall back on slow paths • Array holes, prototype properties being deleted, unshadowing/fore-shadowing all hurt a bit • But JS engines are still improving rapidly (e.g. the SpiderMonkey Type Inference work by Brian Hackett) • It’s way too soon to throw in the towel • We could add more opt-into-high-performance knobs, but: No. mozilla 16Sunday, September 18, 2011
    • Harmony tune-up mozilla 17Sunday, September 18, 2011
    • Harmony tune-up • It’s good to question the process mozilla 17Sunday, September 18, 2011
    • Harmony tune-up • It’s good to question the process • Harmony is both conservative (consensus is hard to achieve) and path- dependent (because macro research takes time, we’re adding syntactic special forms that could be macros -- if only we had macros) mozilla 17Sunday, September 18, 2011
    • Harmony tune-up • It’s good to question the process • Harmony is both conservative (consensus is hard to achieve) and path- dependent (because macro research takes time, we’re adding syntactic special forms that could be macros -- if only we had macros) • Should we take the Dart clues to heart, without over-reacting? mozilla 17Sunday, September 18, 2011
    • Harmony tune-up • It’s good to question the process • Harmony is both conservative (consensus is hard to achieve) and path- dependent (because macro research takes time, we’re adding syntactic special forms that could be macros -- if only we had macros) • Should we take the Dart clues to heart, without over-reacting? • My suggestion is to prototype in SpiderMonkey and V8 some of the strawman proposals that did not make ES6 now, and see if any deserve promotion to ES6 mozilla 17Sunday, September 18, 2011
    • RiverTrail: Parallel JS mozilla 18Sunday, September 18, 2011
    • RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. mozilla 18Sunday, September 18, 2011
    • RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. • map, reduce, combine, filter, partition, scan, scatter -- all produce fresh ParallelArray results mozilla 18Sunday, September 18, 2011
    • RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. • map, reduce, combine, filter, partition, scan, scatter -- all produce fresh ParallelArray results • Relies on commutativity to parallelize arithmetic operations (this does inject some f.p. non-determinism). mozilla 18Sunday, September 18, 2011
    • RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. • map, reduce, combine, filter, partition, scan, scatter -- all produce fresh ParallelArray results • Relies on commutativity to parallelize arithmetic operations (this does inject some f.p. non-determinism). • A Firefox add-on that runs a Narcissus-based JS-to-OpenCL compiler over ParallelArray code mozilla 18Sunday, September 18, 2011
    • RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. • map, reduce, combine, filter, partition, scan, scatter -- all produce fresh ParallelArray results • Relies on commutativity to parallelize arithmetic operations (this does inject some f.p. non-determinism). • A Firefox add-on that runs a Narcissus-based JS-to-OpenCL compiler over ParallelArray code • Source: github.com/RiverTrail/RiverTrail (user id should’ve been IntelLabs) mozilla 18Sunday, September 18, 2011
    • RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. • map, reduce, combine, filter, partition, scan, scatter -- all produce fresh ParallelArray results • Relies on commutativity to parallelize arithmetic operations (this does inject some f.p. non-determinism). • A Firefox add-on that runs a Narcissus-based JS-to-OpenCL compiler over ParallelArray code • Source: github.com/RiverTrail/RiverTrail (user id should’ve been IntelLabs) • Demo code is funny: it contains a "DO NOT use strict”; directive! mozilla 18Sunday, September 18, 2011
    • RiverTrail demo sample code • the ParallelArray constructor builds on typed arrays: NBody.private.initVel = new Array(numBodies); NBody.private.initVelTA = new Float32Array(numBodies * 4); var initAsteroidPos = new Array(50); for (i = 0; i < 50; i++) {     initAsteroidPos[i] = new ParallelArray([                                             NBody.private.posTA[i * 3 + 0],     // x                                             NBody.private.posTA[i * 3 + 1],                                             NBody.private.posTA[i * 3 + 2],                                             ]); }   . . . NBody.private.asteroidPos = new ParallelArray(Float32Array, initAsteroidPos);   . . . NBody.private.vel = new ParallelArray(Float32Array, NBody.private.initVel); mozilla 19Sunday, September 18, 2011
    • ParallelArray methods in action • combine method is a workhorse (takes variable number of args) "animateTickParallel": function animateTickParallel() {     // increment (+=) velocity by acceleration     var newVel = NBody.private.vel.combine(                  1,                      low_precision(NBody.bodyVelocityLoopified),                      NBody.private.pos,                      numBodies,                      NBody.Constant.deltaTime,                      NBody.Constant.epsSqr,                      NBody.time,                      NBody.private.asteroidPos                  );   . . . mozilla 20Sunday, September 18, 2011
    • Always bet on JSSunday, September 18, 2011
    • Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps”Sunday, September 18, 2011
    • Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps” • Then they said it couldn’t be fastSunday, September 18, 2011
    • Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps” • Then they said it couldn’t be fast • Then they said it couldn’t be fixedSunday, September 18, 2011
    • Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps” • Then they said it couldn’t be fast • Then they said it couldn’t be fixed • Then it couldn’t do multicore/GPUSunday, September 18, 2011
    • Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps” • Then they said it couldn’t be fast • Then they said it couldn’t be fixed • Then it couldn’t do multicore/GPU • Wrong every time!Sunday, September 18, 2011
    • Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps” • Then they said it couldn’t be fast • Then they said it couldn’t be fixed • Then it couldn’t do multicore/GPU • Wrong every time! • My advice: always bet on JSSunday, September 18, 2011
    • Q&A • @BrendanEich on twitter • brendan@mozilla.org • es-discuss@mozilla.org mozilla 22Sunday, September 18, 2011