├── build ├── build.css └── build.js ├── images ├── 1994-tv-shows.jpg ├── ES6_Math_fun.jpg ├── Gosling-IR-paper.png ├── Gosling-code-sample.png ├── Java-Duke.jpg ├── Margaret-Jacks-hall.jpg ├── alwaysbetonjs.png ├── alwaysbetonjsandwasm.png ├── applet-loading.png ├── beachball_mac.png ├── beich1.gif ├── bruce_campbell_army_of_darkness.jpg ├── friends_chandler_006.jpg ├── hackers_1995_rollerblading.jpg ├── html5_supes.jpg ├── java-7-as-dynlang-vm.jpg ├── java-vs-js-bytecode.png ├── mature-jackie-chan.jpg ├── obi-wan-and-vader.jpg ├── sbbod.gif ├── swingers-vince.jpg ├── tc39-on-github.png └── young-jackie-chan.jpg └── index.html /build/build.css: -------------------------------------------------------------------------------- 1 | h1 a{border:none}h1.name{font-size:1.3em;margin:0}.bespoke-slide{z-index:1}pre{padding:2em!important}pre,code{margin:0!important}.bespoke-backdrop-after{-webkit-transition-delay:0;transition-delay:0}.backdrop--html5_supes{background-image:url("../images/html5_supes.jpg");background-position:0 0}.backdrop--html5_supes .bespoke-backdrop-active{opacity:.4}.backdrop--html5_supes .bespoke-backdrop-before{-webkit-transition-delay:2s;transition-delay:2s}.bullet .expand{-webkit-transition:all 2s ease;transition:all 2s ease;opacity:0;overflow-x:hidden;overflow-y:visible;max-width:0;display:inline-block;white-space:nowrap;text-align:center;line-height:1.1em;position:relative;top:.2em}.bullet .expand .bespoke-bullet-active{opacity:1;max-width:500px}code[class*="language-"],pre[class*="language-"]{color:#000;font-family:Consolas,Monaco,'Andale Mono',monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"]{position:relative;margin:.5em 0;box-shadow:-1px 0 0 0 #358ccb,0 0 0 1px #dfdfdf;border-left:10px solid #358ccb;background-color:#fdfdfd;background-image:-webkit-linear-gradient(transparent 50%,rgba(69,142,209,.04)50%);background-image:linear-gradient(transparent 50%,rgba(69,142,209,.04)50%);background-size:3em 3em;background-origin:content-box;overflow:visible;max-height:30em}code[class*="language"]{max-height:inherit;height:100%;padding:0 1em;display:block;overflow:auto}:not(pre)>code[class*="language-"],pre[class*="language-"]{background-color:#fdfdfd;-moz-box-sizing:border-box;box-sizing:border-box;margin-bottom:1em}:not(pre)>code[class*="language-"]{position:relative;padding:.2em;-o-border-radius:.3em;border-radius:.3em;color:#c92c2c;border:1px solid rgba(0,0,0,.1)}pre[class*="language-"]:before,pre[class*="language-"]:after{content:'';z-index:-2;display:block;position:absolute;bottom:.75em;left:.18em;width:40%;height:20%;box-shadow:0 13px 8px #979797;-webkit-transform:rotate(-2deg);transform:rotate(-2deg)}:not(pre)>code[class*="language-"]:after,pre[class*="language-"]:after{right:.75em;left:auto;-webkit-transform:rotate(2deg);transform:rotate(2deg)}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#7D8B99}.token.punctuation{color:#5F6364}.token.property,.token.tag,.token.boolean,.token.number,.token.function-name,.token.constant,.token.symbol,.token.deleted{color:#c92c2c}.token.selector,.token.attr-name,.token.string,.token.char,.token.function,.token.builtin,.token.inserted{color:#2f9c0a}.token.operator,.token.entity,.token.url,.token.variable{color:#a67f59;background:rgba(255,255,255,.5)}.token.atrule,.token.attr-value,.token.keyword,.token.class-name{color:#1990b8}.token.regex,.token.important{color:#e90}.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,.5)}.token.important{font-weight:400}.token.entity{cursor:help}.namespace{opacity:.7}@media screen and (max-width:767px){pre[class*="language-"]:before,pre[class*="language-"]:after{bottom:14px;box-shadow:none}}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1}pre[class*="language-"].line-numbers{padding-left:0}pre[class*="language-"].line-numbers code{padding-left:3.8em}pre[class*="language-"].line-numbers .line-numbers-rows{left:0} -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | !function e(t,n,i){function a(o,s){if(!n[o]){if(!t[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);throw new Error("Cannot find module '"+o+"'")}var c=n[o]={exports:{}};t[o][0].call(c.exports,function(e){var n=t[o][1][e];return a(n?n:e)},c,c.exports,e,t,n,i)}return n[o].exports}for(var r="function"==typeof require&&require,o=0;on?"before":"after")):a(t,"active")}}function i(e,t){e.classList.remove("bespoke-backdrop-"+t)}function a(e,t){e.classList.add("bespoke-backdrop-"+t)}var r;r=e.slides.map(t),e.on("activate",function(){r.forEach(n)})}}},{}]},{},[1])(1)})}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(e,t){self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{};var n=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(b instanceof i)){c.lastIndex=0;var h=c.exec(b);if(h){u&&(f=h[1].length);var m=h.index-1+f,h=h[0].slice(f),k=h.length,v=m+k,y=b.slice(0,m+1),w=b.slice(v+1),x=[g,1];y&&x.push(y);var E=new i(o,p?t.tokenize(h,p):h,d);x.push(E),w&&x.push(w),Array.prototype.splice.apply(a,x)}}}}}return a},hooks:{all:{},add:function(e,n){var i=t.hooks.all;i[e]=i[e]||[],i[e].push(n)},run:function(e,n){var i=t.hooks.all[e];if(i&&i.length)for(var a,r=0;a=i[r++];)a(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,i,a){if("string"==typeof e)return e;if("[object Array]"==Object.prototype.toString.call(e))return e.map(function(t){return n.stringify(t,i,e)}).join("");var r={type:e.type,content:n.stringify(e.content,i,a),tag:"span",classes:["token",e.type],attributes:{},language:i,parent:a};if("comment"==r.type&&(r.attributes.spellcheck="true"),e.alias){var o="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(r.classes,o)}t.hooks.run("wrap",r);var s="";for(var l in r.attributes)s+=l+'="'+(r.attributes[l]||"")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'" '+s+">"+r.content+""},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),i=n.language,a=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(a,t.languages[i])))),self.close()},!1),self.Prism):self.Prism;var i=document.getElementsByTagName("script");return i=i[i.length-1],i&&(t.filename=i.src,document.addEventListener&&!i.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof t&&t.exports&&(t.exports=n),n.languages.markup={comment://g,prolog:/<\?.+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/\&#?[\da-z]{1,8};/gi},n.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),n.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},n.languages.markup&&(n.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/|<\/style>/gi,inside:n.languages.markup.tag.inside},rest:n.languages.css},alias:"language-css"}}),n.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').+?\1/gi,inside:{"attr-name":{pattern:/^\s*style/gi,inside:n.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/gi,inside:n.languages.css}},alias:"language-css"}},n.languages.markup.tag)),n.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//g,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*?(\r?\n|$)/g,lookbehind:!0}],string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/gi,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|of|on|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/gi,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g},n.languages.javascript=n.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|on|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g}),n.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}}),n.languages.markup&&n.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/gi,inside:{tag:{pattern:/|<\/script>/gi,inside:n.languages.markup.tag.inside},rest:n.languages.javascript},alias:"language-javascript"}}),function(){if(self.Prism&&self.document&&document.querySelector){var e={js:"javascript",html:"markup",svg:"markup",xml:"markup",py:"python",rb:"ruby"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){var i=t.getAttribute("data-src"),a=(i.match(/\.(\w+)$/)||[,""])[1],r=e[a]||a,o=document.createElement("code");o.className="language-"+r,t.textContent="",o.textContent="Loading…",t.appendChild(o);var s=new XMLHttpRequest;s.open("GET",i,!0),s.onreadystatechange=function(){4==s.readyState&&(s.status<400&&s.responseText?(o.textContent=s.responseText,n.highlightElement(o)):o.textContent=s.status>=400?"✖ Error "+s.status+" while fetching file: "+s.statusText:"✖ Error: File does not exist or is empty")},s.send(null)})}}()},{}],3:[function(e,t){t.exports=function(e){return function(t){var n,i,a=t.slides.map(function(t){return[].slice.call(t.querySelectorAll("string"==typeof e?e:"[data-bespoke-bullet]"),0)}),r=function(){var e=n+1;return l(1)?(s(n,i+1),!1):(a[e]&&s(e,0),void 0)},o=function(){var e=n-1;return l(-1)?(s(n,i-1),!1):(a[e]&&s(e,a[e].length-1),void 0)},s=function(e,t){n=e,i=t,a.forEach(function(n,i){n.forEach(function(n,a){n.classList.add("bespoke-bullet"),e>i||i===e&&t>=a?(n.classList.add("bespoke-bullet-active"),n.classList.remove("bespoke-bullet-inactive")):(n.classList.add("bespoke-bullet-inactive"),n.classList.remove("bespoke-bullet-active")),i===e&&a===t?n.classList.add("bespoke-bullet-current"):n.classList.remove("bespoke-bullet-current")})})},l=function(e){return void 0!==a[n][i+e]};t.on("next",r),t.on("prev",o),t.on("slide",function(e){s(e.index,0)}),s(0,0)}}},{}],4:[function(e,t){t.exports=function(){return function(e){var t=function(){var t=window.location.hash.slice(1),i=parseInt(t,10);t&&(i?n(i-1):e.slides.forEach(function(e,i){e.getAttribute("data-bespoke-hash")===t&&n(i)}))},n=function(t){var n=t>-1&&t0?"after":"before";["before(-\\d+)?","after(-\\d+)?","active","inactive"].map(n.bind(null,i)),i!==r&&["inactive",s,s+"-"+Math.abs(o)].map(t.bind(null,i))};t(e.parent,"parent"),e.slides.map(function(e){t(e,"slide")}),e.on("activate",function(a){e.slides.map(i),t(a.slide,"active"),n(a.slide,"inactive")})}}},{}],3:[function(e,t){var n={};t.exports=function(e,t){if(!n[e]){n[e]=!0;var i=document.createElement("style");i.setAttribute("type","text/css"),"textContent"in i?i.textContent=e:i.styleSheet.cssText=e;var a=document.getElementsByTagName("head")[0];t&&t.prepend?a.insertBefore(i,a.childNodes[0]):a.appendChild(i)}}},{}]},{},[1])(1)})}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],9:[function(e,t){t.exports=function(e){return function(t){var n,i,a="vertical"==e?"Y":"X";t.parent.addEventListener("touchstart",function(e){1==e.touches.length&&(n=e.touches[0]["page"+a],i=0)}),t.parent.addEventListener("touchmove",function(e){1==e.touches.length&&(e.preventDefault(),i=e.touches[0]["page"+a]-n)}),t.parent.addEventListener("touchend",function(){Math.abs(i)>50&&t[i>0?"prev":"next"]()})}}},{}],10:[function(e,t){var n=function(e,t){var n=1===e.nodeType?e:document.querySelector(e),i=[].filter.call(n.children,function(e){return"SCRIPT"!==e.nodeName}),a=i[0],r={},o=function(e,t){i[e]&&(p("deactivate",u(a,t)),a=i[e],p("activate",u(a,t)))},s=function(e,t){return arguments.length?(p("slide",u(i[e],t))&&o(e,t),void 0):i.indexOf(a)},l=function(e,t){var n=i.indexOf(a)+e;p(e>0?"next":"prev",u(a,t))&&o(n,t)},c=function(e,t){return(r[e]||(r[e]=[])).push(t),function(){r[e]=r[e].filter(function(e){return e!==t})}},p=function(e,t){return(r[e]||[]).reduce(function(e,n){return e&&n(t)!==!1},!0)},u=function(e,t){return t=t||{},t.index=i.indexOf(e),t.slide=e,t},f={on:c,fire:p,slide:s,next:l.bind(null,1),prev:l.bind(null,-1),parent:n,slides:i};return(t||[]).forEach(function(e){e(f)}),o(0),f};t.exports={from:n}},{}],11:[function(e){var t=e("bespoke"),n=e("bespoke-theme-cube"),i=e("bespoke-keys"),a=e("bespoke-touch"),r=e("bespoke-bullets"),o=e("./../../bower_components/bespoke-backdrop/dist/bespoke-backdrop.js"),s=e("bespoke-scale"),l=e("bespoke-hash"),c=e("bespoke-progress");t.from("article",[n(),i(),a(),r("li, .bullet"),o(),s(),l(),c()]),e("./../../bower_components/prism/prism.js")},{"./../../bower_components/bespoke-backdrop/dist/bespoke-backdrop.js":1,"./../../bower_components/prism/prism.js":2,bespoke:10,"bespoke-bullets":3,"bespoke-hash":4,"bespoke-keys":5,"bespoke-progress":6,"bespoke-scale":7,"bespoke-theme-cube":8,"bespoke-touch":9}]},{},[11]); -------------------------------------------------------------------------------- /images/1994-tv-shows.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/1994-tv-shows.jpg -------------------------------------------------------------------------------- /images/ES6_Math_fun.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/ES6_Math_fun.jpg -------------------------------------------------------------------------------- /images/Gosling-IR-paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/Gosling-IR-paper.png -------------------------------------------------------------------------------- /images/Gosling-code-sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/Gosling-code-sample.png -------------------------------------------------------------------------------- /images/Java-Duke.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/Java-Duke.jpg -------------------------------------------------------------------------------- /images/Margaret-Jacks-hall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/Margaret-Jacks-hall.jpg -------------------------------------------------------------------------------- /images/alwaysbetonjs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/alwaysbetonjs.png -------------------------------------------------------------------------------- /images/alwaysbetonjsandwasm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/alwaysbetonjsandwasm.png -------------------------------------------------------------------------------- /images/applet-loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/applet-loading.png -------------------------------------------------------------------------------- /images/beachball_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/beachball_mac.png -------------------------------------------------------------------------------- /images/beich1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/beich1.gif -------------------------------------------------------------------------------- /images/bruce_campbell_army_of_darkness.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/bruce_campbell_army_of_darkness.jpg -------------------------------------------------------------------------------- /images/friends_chandler_006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/friends_chandler_006.jpg -------------------------------------------------------------------------------- /images/hackers_1995_rollerblading.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/hackers_1995_rollerblading.jpg -------------------------------------------------------------------------------- /images/html5_supes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/html5_supes.jpg -------------------------------------------------------------------------------- /images/java-7-as-dynlang-vm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/java-7-as-dynlang-vm.jpg -------------------------------------------------------------------------------- /images/java-vs-js-bytecode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/java-vs-js-bytecode.png -------------------------------------------------------------------------------- /images/mature-jackie-chan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/mature-jackie-chan.jpg -------------------------------------------------------------------------------- /images/obi-wan-and-vader.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/obi-wan-and-vader.jpg -------------------------------------------------------------------------------- /images/sbbod.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/sbbod.gif -------------------------------------------------------------------------------- /images/swingers-vince.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/swingers-vince.jpg -------------------------------------------------------------------------------- /images/tc39-on-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/tc39-on-github.png -------------------------------------------------------------------------------- /images/young-jackie-chan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrendanEich/BrazilJS-2015/089fa37706a3d08e5cf48ef04366c7d3161c683b/images/young-jackie-chan.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | JavaScript at 20 7 | 8 | 9 | 10 |
11 |
12 |

JavaScript at 20

13 |

Brendan Eich

14 |
15 |
16 |

Standardization

17 |

"Things that are impossible just take longer." - Hixie

18 |
19 |
20 |

1995: Eich recruited to Netscape

21 |

"Come and put Scheme in the browser!"

22 |
23 |
24 |

2015: John Carmack put Racket in Oculus VR

25 |
26 |
27 |
28 |
29 |
30 |
31 |

What was it like to hack JS in 10 days?

32 |
33 |
34 |

Painful.

35 |
36 |
37 |
38 |
    39 |
  • Morrissey?
  • 40 |
  • Vince Vaughn?
  • 41 |
42 |
43 |
44 |
45 |

Java was the big Web VM

46 |

JavaScript was "little brother"

47 |
48 |
49 |
50 | 51 | 52 |
53 |
54 |

Think back to 1995... what was on TV then?

55 |
56 |
57 |
58 |

I had my big break that year...

59 |
60 |
61 |
62 |

Even @pmarca roller-bladed then.

63 |
64 |
65 |
66 |

I'd go to a real library to read Computer Science papers.

67 |
68 |
69 |
70 |

John Doerr claims that even an idiot could have been a successful VC in the 1980s:

71 |

"All you had to do was hang around Margaret Jacks Hall."

72 |
73 |
74 |

Java's bytecode design influenced my work on JS.

75 |
76 |
77 |
78 |

Java is typed (or statically typed) and has mostly-typed bytecode

79 |

JS is untyped (or dynamically typed)

80 |
81 |
82 |
83 |

So in 10 days in May 1995, I wrote

84 |
    85 |
  • A lexical scanner and parser for early JS
  • 86 |
  • The parser emitted stack-machine bytecode
  • 87 |
  • Which ran in a bytecode interpreter
  • 88 |
  • Function.prototype.toString bytecode decompiler
  • 89 |
  • The standard library was poor
  • 90 |
  • Array was Object with .length property
  • 91 |
  • Date hand-ported (h/t ksmith@netscape.com) from java.util.Date
  • 92 |
93 |
94 |
95 |

Mistakes were made (WTFJS, WAT)

96 |
97 |
98 |

But enough was good that JS survived

99 |
100 |
101 |

http://whitetailbutte.com/ case study

102 |

Early DOM mattered as much as JS

103 |
104 |
105 |

Much progress since then

106 |
    107 |
  • asm.js was discovered
  • 108 |
  • ES6 is all but done
  • 109 |
  • typed arrays from WebGL are in ES6
  • 110 |
  • typed objects coming in ES7
  • 111 |
  • TypeScript, and now Flow
  • 112 |
113 |
114 |
115 |
class vector {
116 |   constructor(n) { this.arr = new Int32Array(n); }
117 |   sum() {
118 |     let la = this.arr;
119 |     let S = 0;
120 |     for (let i = la.length|0; (i=(i-1)|0) >= 0;)
121 |       S = (S + la[i|0])|0;
122 |     return S;
123 |   }
124 | }
125 | 
126 |
127 |
128 |
129 |

JS is untyped (dynamically typed), however:

130 |

asm.js is typed "bytecode" with deterministic performance

131 |
132 |
133 |

JS, a dynamically typed language, is often written with latent static types

134 |

Especially when "written" by compilers

135 |
136 |
137 |

Compiling to JS is not new

138 | 145 |
146 |
147 |

JS VMs compile to the metal

148 |

(just like Java but without declaring all types)

149 |
150 |
151 |

And the Java VM supports dynamic languages too:

152 |
153 |
154 |

from Mikhail Stoynov and Svetlin Nakov

155 |
156 |
157 |

The circle is now complete

158 |
159 |
160 |

WebAssembly

161 |
162 |
163 |
    164 |
  • Consensus from Apple/Google/Microsoft/Mozilla that the design repo is approaching completeness
  • 165 |
  • An executable OCaml spec and test suite in a new spec repo
  • 166 |
  • Apple/Google/Mozilla are actively writing prototype wasm support in their engines' public repos
  • 167 |
  • WebAssembly means 1VM with 2 syntaxes, .js and .wasm
  • 168 |
169 |
170 |
171 |

What does WebAssembly look like?

172 |

It is hard to see binary

173 |
174 |
175 |
enum class I32 : uint8_t {
176 |   LitPool, LitImm, GetLoc, GetGlo, SetLoc, SetGlo,
177 |   SLoad8, SLoadOff8, ULoad8, ULoadOff8,
178 |   SLoad16, SLoadOff16, ULoad16, ULoadOff16,
179 |   Load32, LoadOff32,
180 |   Store8, StoreOff8, Store16, StoreOff16, Store32, StoreOff32,
181 |   CallInt, CallInd, CallImp,
182 |   Cond, Comma,
183 |   FromF32, FromF64,
184 |   Neg, Add, Sub, Mul, SDiv, UDiv, SMod, UMod,
185 |   BitNot, BitOr, BitAnd, BitXor, Lsh, ArithRsh, LogicRsh,
186 |   Clz,
187 |   LogicNot,
188 |   EqI32, EqF32, EqF64, NEqI32, NEqF32, NEqF64,
189 |   SLeThI32, ULeThI32, LeThF32, LeThF64,
190 |   ...
191 | };
192 | 
193 |
194 |
195 |
switch (i32) {
196 |   ...
197 |   case I32::FromF32: ...(s, prec, ctx, Result::NoIsh, Ctx::Default, "~~"); break;
198 |   ak;
199 |   case I32::FromF64: ...(s, prec, ctx, Result::NoIsh, Ctx::Default, "~~"); break;
200 |   case I32::Neg:     ...(s, prec, ctx, Result::Intish, Ctx::Default, "-"); break;
201 |   case I32::BitNot:  ...(s, prec, ctx, Result::NoIsh, Ctx::ToI32, "~"); break;
202 |   ...
203 | }
204 | 
205 | 
206 |
207 |
208 |

ES6 well-covered by other speakers

209 |
210 |
211 |

ES6/2015, ES7/2016, ES8...

212 |

Rapid(er) standards release process

213 |
214 |
215 |

ES7 async functions

216 |
217 |
218 |
function chainAnimationsPromise(elem, animations) {
219 |   let ret = null;
220 |   let p = currentPromise;
221 |   for (let anim of animations) {
222 |     p = p.then(function(val) {
223 |       ret = val;
224 |       return anim(elem);
225 |     });
226 |   }
227 |   return p.catch(e => { /* ignore and keep going */ })
228 |           .then(() => { return ret; });
229 | }
230 | 
231 |
232 |
233 |
function chainAnimationsGenerator(elem, animations) {
234 |   return spawn(function*() {
235 |     let ret = null;
236 |     try {
237 |       for (let anim of animations) {
238 |         ret = yield anim(elem);
239 |       }
240 |     } catch(e) { /* ignore and keep going */ }
241 |     return ret;
242 |   });
243 | }
244 | 
245 |
246 |
247 |
async function chainAnimationsAsync(elem, animations) {
248 |   let ret = null;
249 |   try {
250 |     for (let anim of animations) {
251 |       ret = await anim(elem);
252 |     }
253 |   } catch(e) { /* ignore and keep going */ }
254 |   return ret;
255 | }
256 | 
257 |
258 |
259 |

More on board for ES7+

260 |
    261 |
  • SIMD
  • 262 |
  • typed objects
  • 263 |
  • value objects, including
  • 264 |
  • int64 and uint64
  • 265 |
  • user-defined operators and literals
  • 266 |
  • async generators
  • 267 |
268 |
269 |
270 |

Hygienic macros: Sweet.js

271 |
272 |
273 |

Demos

274 |
275 |
276 |
277 |
278 | 279 | 280 | --------------------------------------------------------------------------------