Capital^H^HolJS                                brendan@mozilla.orgSunday, September 18, 2011
Capital^H^HolJS                                              brendan@mozilla.org                   •         History, goal...
Capital^H^HolJS                                              brendan@mozilla.org                   •         History, goal...
Capital^H^HolJS                                              brendan@mozilla.org                   •         History, goal...
Capital^H^HolJS                                              brendan@mozilla.org                   •         History, goal...
Capital^H^HolJS                                              brendan@mozilla.org                   •         History, goal...
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           ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
A very brief history         • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java         • ...
The Harmony goals                             mozilla         3Sunday, September 18, 2011
The Harmony goals         • Be a better language for writing:                                               mozilla       ...
The Harmony goals         • Be a better language for writing:               • complex applications                        ...
The Harmony goals         • Be a better language for writing:               • complex applications               • librari...
The Harmony goals         • Be a better language for writing:               • complex applications               • librari...
The Harmony goals         • Be a better language for writing:               • complex applications               • librari...
The Harmony goals         • Be a better language for writing:               • complex applications               • librari...
The Harmony goals         • Be a better language for writing:               • complex applications               • librari...
The Harmony goals         • Be a better language for writing:               • complex applications               • librari...
Approved for ES6                             mozilla         4Sunday, September 18, 2011
Approved for ES6         • let, const, function in block scope                                                 mozilla    ...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Approved for ES6         • let, const, function in block scope         • destructuring: let {x, y} = pt; let [s, v, o] = t...
Yet more approved for ES6                                     mozilla         5Sunday, September 18, 2011
Yet more approved for ES6         • Binary data:                                     mozilla         5Sunday, September 18...
Yet more approved for ES6         • Binary data:               • const Point2D = new StructType({ x: uint32, y: uint32 }),...
Yet more approved for ES6         • Binary data:               • const Point2D = new StructType({ x: uint32, y: uint32 }),...
Yet more approved for ES6         • Binary data:               • const Point2D = new StructType({ x: uint32, y: uint32 }),...
Quasi-Literals                             mozilla         6Sunday, September 18, 2011
Quasi-Literals         • Injection-safer string interpolation and domain-specific languages                                ...
Quasi-Literals         • Injection-safer string interpolation and domain-specific languages         • Backtick-quoted strin...
Quasi-Literals         • Injection-safer string interpolation and domain-specific languages         • Backtick-quoted strin...
Quasi-Literals         • Injection-safer string interpolation and domain-specific languages         • Backtick-quoted strin...
Quasi-Literals         • Injection-safer string interpolation and domain-specific languages         • Backtick-quoted strin...
Quasi-Literals         • Injection-safer string interpolation and domain-specific languages         • Backtick-quoted strin...
Classes made it, barely (Yay, I think? Why am I sad?)                                                           mozilla   ...
Classes made it, barely (Yay, I think? Why am I sad?)         • Sugar for prototypal object pattern, also supports closure...
Classes made it, barely (Yay, I think? Why am I sad?)         • Sugar for prototypal object pattern, also supports closure...
Classes made it, barely (Yay, I think? Why am I sad?)         • Sugar for prototypal object pattern, also supports closure...
Classes made it, barely (Yay, I think? Why am I sad?)         • Sugar for prototypal object pattern, also supports closure...
Not yet in Harmony: arrow function syntax                                                     mozilla         8Sunday, Sep...
Not yet in Harmony: arrow function syntax         • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later...
Not yet in Harmony: arrow function syntax         • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later...
Not yet in Harmony: arrow function syntax         • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later...
Not yet in Harmony: arrow function syntax         • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later...
Not yet in Harmony: arrow function syntax         • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later...
Not yet in Harmony: arrow function syntax         • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later...
Not yet in Harmony: block lambda revival         • Inspired by Smalltalk via Ruby             let empty = {||};           ...
More block lambda revival         • Paren-free calls, control effects: you know you want it...                b = a.map {|...
Syntax, yay                             mozilla         11Sunday, September 18, 2011
Syntax, yay         • Do we need shorter function syntax at all?                                                        mo...
Syntax, yay         • Do we need shorter function syntax at all?         • Some say no. @mikeal: “I got 99 problems and Ja...
Syntax, yay         • Do we need shorter function syntax at all?         • Some say no. @mikeal: “I got 99 problems and Ja...
Syntax, yay         • Do we need shorter function syntax at all?         • Some say no. @mikeal: “I got 99 problems and Ja...
Syntax, yay         • Do we need shorter function syntax at all?         • Some say no. @mikeal: “I got 99 problems and Ja...
Syntax, yay         • Do we need shorter function syntax at all?         • Some say no. @mikeal: “I got 99 problems and Ja...
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  ...
Dart to the heart                 •     Some things I’ve heard & read                 •     “If JavaScript does not have  ...
Dart to the heart                 •     Some things I’ve heard & read                 •     “If JavaScript does not have  ...
Dart to the heart                 •     Some things I’ve heard & read                 •     “If JavaScript does not have  ...
iOS, lolwut?                             mozilla         13Sunday, September 18, 2011
iOS, lolwut?         • Leaked memo: “The emergence of compelling alternative platforms like iOS has           meant that t...
iOS, lolwut?         • Leaked memo: “The emergence of compelling alternative platforms like iOS has           meant that t...
Food for thought                             mozilla         14Sunday, September 18, 2011
Food for thought         • The “REPLACED” threat and “optional types” suggest either                                      ...
Food for thought         • The “REPLACED” threat and “optional types” suggest either               • Optional static types...
Food for thought         • The “REPLACED” threat and “optional types” suggest either               • Optional static types...
Food for thought         • The “REPLACED” threat and “optional types” suggest either               • Optional static types...
Food for thought         • The “REPLACED” threat and “optional types” suggest either               • Optional static types...
Food for thought         • The “REPLACED” threat and “optional types” suggest either               • Optional static types...
Food for thought         • The “REPLACED” threat and “optional types” suggest either               • Optional static types...
The trouble with numbers                                    mozilla         15Sunday, September 18, 2011
The trouble with numbers         • How to introduce a sane numeric tower for JS?                                          ...
The trouble with numbers         • How to introduce a sane numeric tower for JS?         • Suffixes: 4294967295u + 1 === 0u...
The trouble with numbers         • How to introduce a sane numeric tower for JS?         • Suffixes: 4294967295u + 1 === 0u...
The trouble with numbers         • How to introduce a sane numeric tower for JS?         • Suffixes: 4294967295u + 1 === 0u...
The trouble with numbers         • How to introduce a sane numeric tower for JS?         • Suffixes: 4294967295u + 1 === 0u...
Better performance predictability                                             mozilla         16Sunday, September 18, 2011
Better performance predictability         • JS engines currently have performance predictability problems, it’s true      ...
Better performance predictability         • JS engines currently have performance predictability problems, it’s true      ...
Better performance predictability         • JS engines currently have performance predictability problems, it’s true      ...
Better performance predictability         • JS engines currently have performance predictability problems, it’s true      ...
Better performance predictability         • JS engines currently have performance predictability problems, it’s true      ...
Better performance predictability         • JS engines currently have performance predictability problems, it’s true      ...
Harmony tune-up                             mozilla         17Sunday, September 18, 2011
Harmony tune-up         • It’s good to question the process                                               mozilla         ...
Harmony tune-up         • It’s good to question the process         • Harmony is both conservative (consensus is hard to a...
Harmony tune-up         • It’s good to question the process         • Harmony is both conservative (consensus is hard to a...
Harmony tune-up         • It’s good to question the process         • Harmony is both conservative (consensus is hard to a...
RiverTrail: Parallel JS                                   mozilla         18Sunday, September 18, 2011
RiverTrail: Parallel JS         • A ParallelArray library, like typed arrays but immutable.                               ...
RiverTrail: Parallel JS         • A ParallelArray library, like typed arrays but immutable.               • map, reduce, c...
RiverTrail: Parallel JS         • A ParallelArray library, like typed arrays but immutable.               • map, reduce, c...
RiverTrail: Parallel JS         • A ParallelArray library, like typed arrays but immutable.               • map, reduce, c...
RiverTrail: Parallel JS         • A ParallelArray library, like typed arrays but immutable.               • map, reduce, c...
RiverTrail: Parallel JS         • A ParallelArray library, like typed arrays but immutable.               • map, reduce, c...
RiverTrail demo sample code         • the ParallelArray constructor builds on typed arrays:              NBody.private.ini...
ParallelArray methods in action         • combine method is a workhorse (takes variable number of args)              "anim...
Always bet on JSSunday, September 18, 2011
Always bet on JS             •     First they said JS couldn’t be useful                   for buildling “rich Internet ap...
Always bet on JS             •     First they said JS couldn’t be useful                   for buildling “rich Internet ap...
Always bet on JS             •     First they said JS couldn’t be useful                   for buildling “rich Internet ap...
Always bet on JS             •     First they said JS couldn’t be useful                   for buildling “rich Internet ap...
Always bet on JS             •     First they said JS couldn’t be useful                   for buildling “rich Internet ap...
Always bet on JS             •     First they said JS couldn’t be useful                   for buildling “rich Internet ap...
Q&A         • @BrendanEich on twitter         • brendan@mozilla.org         • es-discuss@mozilla.org                      ...
Upcoming SlideShare
Loading in...5
×

Capitol js

14,767

Published on

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

Published in: Technology, News & Politics
1 Comment
16 Likes
Statistics
Notes
No Downloads
Views
Total Views
14,767
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
52
Comments
1
Likes
16
Embeds 0
No embeds

No notes for slide

Transcript of "Capitol js"

  1. 1. Capital^H^HolJS brendan@mozilla.orgSunday, September 18, 2011
  2. 2. Capital^H^HolJS brendan@mozilla.org • History, goalsSunday, September 18, 2011
  3. 3. Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it?Sunday, September 18, 2011
  4. 4. Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it? • Dart: I can’t wait!Sunday, September 18, 2011
  5. 5. Capital^H^HolJS brendan@mozilla.org • History, goals • ES6, what’s in it? • Dart: I can’t wait! • Harmony tune-upSunday, September 18, 2011
  6. 6. 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
  7. 7. A very brief history mozilla 2Sunday, September 18, 2011
  8. 8. A very brief history • Ten days in May 1995: “Mocha”, form validation, img rollovers, scripting of Java mozilla 2Sunday, September 18, 2011
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. 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
  16. 16. The Harmony goals mozilla 3Sunday, September 18, 2011
  17. 17. The Harmony goals • Be a better language for writing: mozilla 3Sunday, September 18, 2011
  18. 18. The Harmony goals • Be a better language for writing: • complex applications mozilla 3Sunday, September 18, 2011
  19. 19. The Harmony goals • Be a better language for writing: • complex applications • libraries (including the DOM) shared by those applications mozilla 3Sunday, September 18, 2011
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. Approved for ES6 mozilla 4Sunday, September 18, 2011
  26. 26. Approved for ES6 • let, const, function in block scope mozilla 4Sunday, September 18, 2011
  27. 27. Approved for ES6 • let, const, function in block scope • destructuring: let {x, y} = pt; let [s, v, o] = triple() mozilla 4Sunday, September 18, 2011
  28. 28. 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
  29. 29. 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
  30. 30. 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
  31. 31. 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
  32. 32. 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
  33. 33. 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
  34. 34. Yet more approved for ES6 mozilla 5Sunday, September 18, 2011
  35. 35. Yet more approved for ES6 • Binary data: mozilla 5Sunday, September 18, 2011
  36. 36. 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
  37. 37. 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
  38. 38. 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
  39. 39. Quasi-Literals mozilla 6Sunday, September 18, 2011
  40. 40. Quasi-Literals • Injection-safer string interpolation and domain-specific languages mozilla 6Sunday, September 18, 2011
  41. 41. 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
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. Classes made it, barely (Yay, I think? Why am I sad?) mozilla 7Sunday, September 18, 2011
  47. 47. 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
  48. 48. 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
  49. 49. 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
  50. 50. 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
  51. 51. Not yet in Harmony: arrow function syntax mozilla 8Sunday, September 18, 2011
  52. 52. Not yet in Harmony: arrow function syntax • Arrow function syntax, instead of λ, ƒ, or # (want to save # for later) mozilla 8Sunday, September 18, 2011
  53. 53. 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
  54. 54. 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
  55. 55. 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
  56. 56. 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
  57. 57. 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
  58. 58. 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
  59. 59. 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
  60. 60. Syntax, yay mozilla 11Sunday, September 18, 2011
  61. 61. Syntax, yay • Do we need shorter function syntax at all? mozilla 11Sunday, September 18, 2011
  62. 62. 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
  63. 63. 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
  64. 64. 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
  65. 65. 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
  66. 66. 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
  67. 67. Dart to the heartSunday, September 18, 2011
  68. 68. Dart to the heart • Some things I’ve heard & readSunday, September 18, 2011
  69. 69. 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
  70. 70. 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
  71. 71. 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
  72. 72. 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
  73. 73. iOS, lolwut? mozilla 13Sunday, September 18, 2011
  74. 74. 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
  75. 75. 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
  76. 76. Food for thought mozilla 14Sunday, September 18, 2011
  77. 77. Food for thought • The “REPLACED” threat and “optional types” suggest either mozilla 14Sunday, September 18, 2011
  78. 78. Food for thought • The “REPLACED” threat and “optional types” suggest either • Optional static types a la Strongtalk [Bracha & Griswold] mozilla 14Sunday, September 18, 2011
  79. 79. 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
  80. 80. 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
  81. 81. 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
  82. 82. 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
  83. 83. 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
  84. 84. The trouble with numbers mozilla 15Sunday, September 18, 2011
  85. 85. The trouble with numbers • How to introduce a sane numeric tower for JS? mozilla 15Sunday, September 18, 2011
  86. 86. 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
  87. 87. 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
  88. 88. 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
  89. 89. 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
  90. 90. Better performance predictability mozilla 16Sunday, September 18, 2011
  91. 91. Better performance predictability • JS engines currently have performance predictability problems, it’s true mozilla 16Sunday, September 18, 2011
  92. 92. 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
  93. 93. 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
  94. 94. 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
  95. 95. 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
  96. 96. 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
  97. 97. Harmony tune-up mozilla 17Sunday, September 18, 2011
  98. 98. Harmony tune-up • It’s good to question the process mozilla 17Sunday, September 18, 2011
  99. 99. 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
  100. 100. 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
  101. 101. 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
  102. 102. RiverTrail: Parallel JS mozilla 18Sunday, September 18, 2011
  103. 103. RiverTrail: Parallel JS • A ParallelArray library, like typed arrays but immutable. mozilla 18Sunday, September 18, 2011
  104. 104. 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
  105. 105. 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
  106. 106. 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
  107. 107. 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
  108. 108. 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
  109. 109. 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
  110. 110. 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
  111. 111. Always bet on JSSunday, September 18, 2011
  112. 112. Always bet on JS • First they said JS couldn’t be useful for buildling “rich Internet apps”Sunday, September 18, 2011
  113. 113. 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
  114. 114. 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
  115. 115. 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
  116. 116. 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
  117. 117. 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
  118. 118. Q&A • @BrendanEich on twitter • brendan@mozilla.org • es-discuss@mozilla.org mozilla 22Sunday, September 18, 2011
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×