Txjs talk
Upcoming SlideShare
Loading in...5
×
 

Txjs talk

on

  • 5,861 views

My #txjs talk, with apologies to Sergio Leone, Clint, Eli, and Lee.

My #txjs talk, with apologies to Sergio Leone, Clint, Eli, and Lee.

Statistics

Views

Total Views
5,861
Views on SlideShare
5,586
Embed Views
275

Actions

Likes
5
Downloads
38
Comments
0

13 Embeds 275

http://brendaneich.com 148
http://lanyrd.com 30
http://vimeo.com 27
http://t.co 22
http://www.techgig.com 15
http://www.google.com 14
http://twitter.com 7
https://twitter.com 7
http://paper.li 1
http://us-w1.rockmelt.com 1
http://hootsuite.com 1
https://www.google.ru 1
https://www.google.nl 1
More...

Accessibility

Categories

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
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Txjs talk Txjs talk Presentation Transcript

  • Ecma TC39:The Good, The Bad, and the UglySaturday, June 11, 2011
  • Ecma TC39:The Good, The Bad, and the Ugly • A Sweaty Standards SagaSaturday, June 11, 2011
  • Ecma TC39:The Good, The Bad, and the Ugly • A Sweaty Standards Saga • Third part of a trilogy...Saturday, June 11, 2011
  • Ecma TC39:The Good, The Bad, and the Ugly • A Sweaty Standards Saga • Third part of a trilogy... • Brendan Eich brendan@mozilla.orgSaturday, June 11, 2011
  • Standards CommitteesSaturday, June 11, 2011
  • HistorySaturday, June 11, 2011
  • History • ECMA founded May 1961Saturday, June 11, 2011
  • History • ECMA founded May 1961 • ECMA-234 standardized Windows API, driven by European governmentsSaturday, June 11, 2011
  • History • ECMA founded May 1961 • ECMA-234 standardized Windows API, driven by European governments • Netscape took JS to ECMA in November 1996 (pictured: Jan van den Beld, S-G ECMA at the time)Saturday, June 11, 2011
  • History • ECMA founded May 1961 • ECMA-234 standardized Windows API, driven by European governments • Netscape took JS to ECMA in November 1996 (pictured: Jan van den Beld, S-G ECMA at the time) • Sun failed to repeat w/ JavaSaturday, June 11, 2011
  • The GoodSaturday, June 11, 2011
  • Good PartsSaturday, June 11, 2011
  • Good Parts • Expert shooters (@awbjs, crock, erights, @littlecalculist, @samth, @slightlylate, Waldemar Horwat, many more)Saturday, June 11, 2011
  • Good Parts • Expert shooters (@awbjs, crock, erights, @littlecalculist, @samth, @slightlylate, Waldemar Horwat, many more) • Care & love for JS as a good in itself, free of biz. agendasSaturday, June 11, 2011
  • Good Parts • Expert shooters (@awbjs, crock, erights, @littlecalculist, @samth, @slightlylate, Waldemar Horwat, many more) • Care & love for JS as a good in itself, free of biz. agendas • Consensus-driven -> “intersubjectivity” (Husserl)Saturday, June 11, 2011
  • Good Parts • Expert shooters (@awbjs, crock, erights, @littlecalculist, @samth, @slightlylate, Waldemar Horwat, many more) • Care & love for JS as a good in itself, free of biz. agendas • Consensus-driven -> “intersubjectivity” (Husserl) • "Logic presumes a separation of subject from object; therefore logic is not final wisdom.This is Zen. This is my motorcycle maintenance. " — Robert M. Pirsig (Zen and the Art of Motorcycle Maintenance: An Inquiry Into Values)Saturday, June 11, 2011
  • The School of AthensSaturday, June 11, 2011
  • Saturday, June 11, 2011
  • Hermeneutic CyclesSaturday, June 11, 2011
  • Hermeneutic Cycles • Language design requires interpretation: of tradition, culture, technical specs, also of one another as subjects among the TC39 membersSaturday, June 11, 2011
  • Hermeneutic Cycles • Language design requires interpretation: of tradition, culture, technical specs, also of one another as subjects among the TC39 members • Interpretation must circle (Heidegger) or spiral (Gadamer, Schön)Saturday, June 11, 2011
  • Hermeneutic Cycles • Language design requires interpretation: of tradition, culture, technical specs, also of one another as subjects among the TC39 members • Interpretation must circle (Heidegger) or spiral (Gadamer, Schön) • Global optimization, balanceSaturday, June 11, 2011
  • The BadSaturday, June 11, 2011
  • Bad PartsSaturday, June 11, 2011
  • Bad Parts • Zero-sum gaming (“cannot have X and independent Y”)Saturday, June 11, 2011
  • Bad Parts • Zero-sum gaming (“cannot have X and independent Y”) • Horse-trading like congress-critters (“I give you X, you give me Y”)Saturday, June 11, 2011
  • Bad Parts • Zero-sum gaming (“cannot have X and independent Y”) • Horse-trading like congress-critters (“I give you X, you give me Y”) • Premature/piece-wise complexity-budget bean-counting. Risks getting stuck hill-climbing at local maxima (see the Hermeneutic spiral)Saturday, June 11, 2011
  • Bad Parts • Zero-sum gaming (“cannot have X and independent Y”) • Horse-trading like congress-critters (“I give you X, you give me Y”) • Premature/piece-wise complexity-budget bean-counting. Risks getting stuck hill-climbing at local maxima (see the Hermeneutic spiral) • “Scenario-solving” without decomposition into sound and orthogonal primitives that work with the rest of the language (E4X is one example)Saturday, June 11, 2011
  • The UglySaturday, June 11, 2011
  • Competitive DriveSaturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas:Saturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas: • M-d #14: “This language doesn’t really need X”Saturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas: • M-d #14: “This language doesn’t really need X” • M-d #39: “This will forever change the way JS is used”Saturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas: • M-d #14: “This language doesn’t really need X” • M-d #39: “This will forever change the way JS is used” • M-d #27: “Won’t this confuse n00bs?”Saturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas: • M-d #14: “This language doesn’t really need X” • M-d #39: “This will forever change the way JS is used” • M-d #27: “Won’t this confuse n00bs?” • All valid:YAGNI, don’t-make-it-Java, keep-it-approachableSaturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas: • M-d #14: “This language doesn’t really need X” • M-d #39: “This will forever change the way JS is used” • M-d #27: “Won’t this confuse n00bs?” • All valid:YAGNI, don’t-make-it-Java, keep-it-approachable • All meta-endless, without specific arguments, evidenceSaturday, June 11, 2011
  • Competitive Drive • Meta-discussions that can hide business agendas: • M-d #14: “This language doesn’t really need X” • M-d #39: “This will forever change the way JS is used” • M-d #27: “Won’t this confuse n00bs?” • All valid:YAGNI, don’t-make-it-Java, keep-it-approachable • All meta-endless, without specific arguments, evidence • Better: address concrete use-cases, fill language gapsSaturday, June 11, 2011
  • Approved for ES.next mozilla 13Saturday, June 11, 2011
  • Approved for ES.next • let, const, function in block scope mozilla 13Saturday, June 11, 2011
  • Approved for ES.next • let, const, function in block scope • destructuring: let {x, y} = pt; let [s, v, o] = triple() mozilla 13Saturday, June 11, 2011
  • 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 13Saturday, June 11, 2011
  • 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 13Saturday, June 11, 2011
  • 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 13Saturday, June 11, 2011
  • 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 NewMath { export function fast_sin(x) {...} } mozilla 13Saturday, June 11, 2011
  • 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 NewMath { export function fast_sin(x) {...} } • iterators, generators: function* gen() { yield 1; yield 2; } mozilla 13Saturday, June 11, 2011
  • 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 NewMath { 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)] 13Saturday, June 11, 2011
  • Yet more approved for ES.next mozilla 14Saturday, June 11, 2011
  • Yet more approved for ES.next • Binary data: mozilla 14Saturday, June 11, 2011
  • 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 14Saturday, June 11, 2011
  • 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 14Saturday, June 11, 2011
  • 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 14Saturday, June 11, 2011
  • Classes made it (Yay, I think? Why am I sad?) mozilla 15Saturday, June 11, 2011
  • Classes made it (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: mozilla 15Saturday, June 11, 2011
  • Classes made it (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: • class Point { constructor(x, y) { private x = x; private 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 15Saturday, June 11, 2011
  • Classes made it (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: • class Point { constructor(x, y) { private x = x; private 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 15Saturday, June 11, 2011
  • Classes made it (Yay, I think? Why am I sad?) • Sugar for prototypal object pattern, also supports closure patterns: • class Point { constructor(x, y) { private x = x; private 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 15Saturday, June 11, 2011
  • Private Name objects mozilla 16Saturday, June 11, 2011
  • Private Name objects • A built-in module providing unique property naming: mozilla 16Saturday, June 11, 2011
  • Private Name objects • A built-in module providing unique property naming: • module Name = require "@name"; const key = Name.create("secret"); function MyClass(privateData) { this[key] = privateData; } MyClass.prototype = { doStuff() { ... this[key] ... } }; mozilla 16Saturday, June 11, 2011
  • Private Name objects • A built-in module providing unique property naming: • module Name = require "@name"; const key = Name.create("secret"); function MyClass(privateData) { this[key] = privateData; } MyClass.prototype = { doStuff() { ... this[key] ... } }; • No loss of privacy via Proxies: key becomes key.public when passed as id to a trap; only the keymaster can tell by testing key.public === id mozilla 16Saturday, June 11, 2011
  • Quasis • 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` 17Saturday, June 11, 2011
  • HarmonySaturday, June 11, 2011
  • Harmony • Yes, we are a commiteeSaturday, June 11, 2011
  • Harmony • Yes, we are a commitee • We try to avoid design by committee bySaturday, June 11, 2011
  • Harmony • Yes, we are a commitee • We try to avoid design by committee by • De-facto standards codificationSaturday, June 11, 2011
  • Harmony • Yes, we are a commitee • We try to avoid design by committee by • De-facto standards codification • The “Champions” modelSaturday, June 11, 2011
  • Harmony • Yes, we are a commitee • We try to avoid design by committee by • De-facto standards codification • The “Champions” model • Developers matter to browser vendors more than everSaturday, June 11, 2011
  • Harmony • Yes, we are a commitee • We try to avoid design by committee by • De-facto standards codification • The “Champions” model • Developers matter to browser vendors more than ever • Make your voices heard with cogent arguments (avoid rehashing, no trolling: es-discuss@mozilla.org)Saturday, June 11, 2011
  • Languages are like friends (and enemies)Saturday, June 11, 2011
  • Languages are like friends (and enemies) • Package deal: bad parts along with goodSaturday, June 11, 2011
  • Languages are like friends (and enemies) • Package deal: bad parts along with good • You can subsetSaturday, June 11, 2011
  • Languages are like friends (and enemies) • Package deal: bad parts along with good • You can subset • You do sometimes debug your friendsSaturday, June 11, 2011
  • Languages are like friends (and enemies) • Package deal: bad parts along with good • You can subset • You do sometimes debug your friends • You can unfriend, betray, change alliancesSaturday, June 11, 2011
  • Languages are like friends (and enemies) • Package deal: bad parts along with good • You can subset • You do sometimes debug your friends • You can unfriend, betray, change alliances • JS wants to remain your BFF!Saturday, June 11, 2011
  • Stand-off / Q&ASaturday, June 11, 2011