Movatterモバイル変換


[0]ホーム

URL:


PDF, PPTX17,264 views

ECMAScript没proposal追悼式

ECMAScript没proposal追悼式

Embed presentation

Download as PDF, PPTX
ECMAScript没Proposal追悼式tyage@KMC
本日はお集まりいただきありがとうございます
司会担当
● id: tyage● 京大工学部情報学科3回● JavaScriptとか書いてる● 趣味○ 脆弱性報告○ CTF司会担当
ECMAScriptとは● JavaScriptやActionScriptの実装基盤となっている言語● Ecma Internationalによって標準化される● (例会講座でも一度紹介しました)
ECMAScript標準化の流れ● Strawman(仕様提案)● →Proposal(具体化・デモ・試案)● →Draft(仕様書作成)○ イマココ○ 3/4にRC2が出来た● →Candidate(実装・フィードバック)● →完成
ECMAScript Proposalとは● 様々な人から仕様に入れてほしい提案(Proposal)が送られてくる○ 提案を検討して、仕様に組み込んだり却下したり○ Proposalフェーズでなくても送られてくる
採用されたECMAScript Proposal● ECMAScript6勉強会でやりました○ class○ generator○ Symbol○ Map○ const○ Promise○ Proxy○ etc...
今日話すこと● Proposalだったが、ECMAScript6の仕様書(RC2)に入らなかったもの(死者)を一部紹介○ ※覚えてもメリットはないかも● 英語の誤訳が多数含まれているかと思いますがご了承下さい
1つ目
"use" keyword
"use" keyword● https://esdiscuss.org/topic/proposal-use-keyword○ 生年月日: 2014年7月25日○ 没年月日: 2014年7月26日● 「なんでPHPの”use”みたいな物が無いんや」
なんだそれは???
"use" keyword● PHP5.3くらいから追加されてたkeyword● 無名関数を宣言する際に、親のスコープから変数を引き継ぐことができる○ こんな機能使ったことないし知らなかったゾ...
"use" keyword> // 通常、無名関数は外のスコープの変数を参照できない> $message = ‘hoge’;> $fun = function() { echo $message; };> $fun();PHP Notice: Undefined variable: message in php shellcode on line 1
"use" keyword> // use keywordを使うと外のスコープの変数が参照できる> $message = ‘hoge’;> $fun = function() use ($message) { echo $message; };> $fun();hoge
なるほど
一方ECMAScriptでは// 暗黙的に外のスコープの変数を見に行くvar message = 'hoge';var fun = function() { console.log(message); };fun();hoge
あれ、”use” keyword要らなくね?
どうやらそうではないらしい引数を使わず、関数から別スコープにあるローカル変数が参照したいようだ(追記: dynamic scopeというらしい)
どうやらそうではないらしいfunction fun1() {var message = ‘hoge’;fun2.attachContext();};function fun2() {console.log(message);};fun1のスコープにあるmessageを参照できる
えっ、何これは・・・(ドン引き
皆様の反応● PHP関係ないやんけ● 何がしたいのかわからん
皆様の反応● デメリットのほうが圧倒的に大きいのでは○ 人間もコンピュータも解析しづらい● どう考えてもダメ
ご愁傷さまです
2つ目
typeof null
typeof null● http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null● typeof null が “null” を返すようにしてほしいという提案
typeof演算子● オブジェクトやプリミティブ値のデータ型を文字で返すtypeof 37 === “number”typeof “hoge” === “string”typeof {a: 1} === “object”typeof undefined === “undefined”
typeof null === ???ではこれは何になるでしょうかtypeof null
typeof null === ???ではこれは何になるでしょうかtypeof null === “object”※nullはプリミティブ値です
どうしてこうなった
歴史的経緯初期のJavaScriptの実装では各値の32bit領域中に以下のtype tagデータが入っていたhttp://www.2ality.com/2013/10/typeof-null.html● 000: object● 1: int● 010: double● 100: string● 110: boolean
歴史的経緯typeof演算子はtype tagでチェックしていたif (JSVAL_IS_VOID(v)) {type = JSTYPE_VOID;} else if (JSVAL_IS_OBJECT(v)) {…type = JSTYPE_OBJECT
歴史的経緯nullはnull pointer(0x00)で表されていたので、type tagがobjectと同じになる!!→ typeof null === “object”
歴史的経緯Brendan Eichが納期に追われて作ってしまったらしい...
糞言語かよ!!
typeof null● 10年くらい前からtypeof nullが”null”を返すように変更するかは議論されていた○ http://wiki.ecmascript.org/doku.php?id=discussion:typeof
typeof null● 当然ECMAScript6で修正しようという風潮はあったが...○ V8では実装されていたらしい
typeof null● typeof nullが”object”を返すことに依存したコードが多く存在した○ このまま仕様を変えると古いWebページが見れなくなるかも○ 古いコードの解釈が変わらないようにしないといけない■ 前方互換性
typeof null● typeof nullが”object”を返すことに依存したコードが多く存在した○ このまま仕様を変えると古いWebページが見れなくなるかも○ 古いコードの解釈が変わらないようにしないといけない■ 前方互換性
手遅れ
余談● この件に関して、Brendan EichとDouglas Crockfordの意見は当初の段階で分かれてるっぽい○ Brendan Eich: JavaScript作った人。偉い○ Douglas Crockford: JSONとか作った人。偉い
余談● Eich「前方互換性を壊すので慎重にすべき」● Crockford「古いコードが壊れてでもやるべき」
そのうち解決されますように...
3つ目
array & generatorcomprehensions
array & generator comprehensions● array comprehension○ [for (i of [1, 2, 3]) i * i] // => [1, 4, 9]● generator comprehension○ (for (i of [1, 2, 3]) i * i) // => 1, 4, 9を順に返すgeneratorあっ、これPythonで見たことあるやつだ!(Pythonだとリスト内包表記って呼ばれてるよね)
実は● ECMAScript勉強会でやりました○ http://kmc.hatenablog.jp/entry/2014/07/26/181228● 2014/7/26日時点(Rev26)では仕様に含まれていた○ Firefoxでは実装されてて動く● 個人的には便利そうだしかなり気に入ってた
悲劇は突然
つらい・・・
何があったのか● https://esdiscuss.org/notes/2014-07-30#4-7-revisit-comprehension-decision-from-last-meeting-● このミーティングでDave Hermanがcomprehensionの問題点を指摘○ JavaScriptで書いた3種類の数独ソルバーを提示■ no comprehension style■ LINQ style■ pythonic style
no comprehensions stylehttps://github.com/dherman/sudoku/blob/master/solver.methods.js
LINQ stylehttps://github.com/dherman/sudoku/blob/master/solver.linq.js
pythonic stylehttps://github.com/dherman/sudoku/blob/master/solver.pythonic.js
どれがよい?
no comprehensions style● iteratorにmapやfilter等の便利メソッドを追加した形● 今まで通りのJavaScriptって感じで読める
LINQ style● generator comprehensionを使ってLINQを意識した形● comprehensionとメソッドチェインが混ざっている
pythonic style● array comprehensionを使ってpythonを意識した形● comprehensionとメソッドチェインが混ざっている
流れ変わったな● これを見る前は支持していた人も多かったようだが...○ 既に仕様に入ってたし● 見たあとは○ comprehensions使わなくても書けるじゃん○ むしろ使いたくない
流れ変わったな
comprehensions、敗北
いや、まだ死んでない● 結局、ECMAScript7まで延期とのこと● 今後の状況では復活する可能性も○ が、現状ではほぼ死にかけな気がする
内包表記君、どこ行ってしもうたんや● 突然の消失に惜しむ声が多数○ https://esdiscuss.org/topic/comprehensions-where-art-thou
内包表記君、どこ行ってしもうたんや● ミーティングに参加していなかった人から不満が出てくる
内包表記君、どこ行ってしもうたんや「あんなコードはPythonicじゃないし、comprehensionが80文字を超えてる時点でなんか変でしょ」
内包表記君、どこ行ってしもうたんやBrendan Eich「求められていたのはArrayを(iterableや即時と遅延等に分けて)一般化することだった。それにデリミタ(区切り文字)が足りてないのに、わざわざ消費する必要はないよね」
comprehensionまたお会いしましょう
4つ目
Private Symbols
Symbol● SymbolオブジェクトがECMAScript6から導入された● RubyのSymbolとスコシニテル● 用途としては、文字列以外の特殊なプロパティとして使われることが想定されていそう○ obj[Symbol.toStringTag] = ‘tag’● ユニークなSymbolを生み出すことができる○ Symbol('foo') !== Symbol('foo')
Symbol● オブジェクトのプロパティのうち、キーがSymbolになっているものを取り出すことができるvar obj = {};var sym = Symbol();obj[sym] = 1;Object.getOwnPropertySymbols(obj)[0] === sym;
Private Symbol● https://esdiscuss.org/topic/proposal-about-private-symbol● 「getOwnPropertySymbolsで取り出せないPrivate Symbolが欲しい」● 提案したのは中国の高校生
Private SymbolPrivate Symbolがあればvar obj = function() {var privateSym = Symbol(‘hoge’, true);this[privateSym] = ‘秘密のデータ’};privateSymが分からないのでobjから秘密のデータが見えない
と、思いきや
Private SymbolPrivate Symbolがあればvar obj = function() {var privateSym = Symbol(‘hoge’, true);this[privateSym] = ‘秘密のデータ’};var x = {};obj.call(x); // => xにproxyを設定しておけばprivateSymがわかる
コード書きなおし
Private SymbolSymbolを外から参照できないようにするためだけなのに、長い!!
簡単に安全なコードをかけないようじゃダメ
余談● Private Symbolに関しては、過去にもっと条件をつけて提案した人がいたが、WeakMapとProxyの関係上失敗したらしい○ https://github.com/zenparsing/es-abstract-refs/issues/11#issuecomment-65723350
社会は厳しい
5つ目
いつの間にかなくなってたけど理由がはっきり分からないやつ
いつの間にかなくなってたけど理由がはっきり分からないやつ時間が足りませんでした!(土下座
Object Literal Extensions● http://wiki.ecmascript.org/doku.php?id=harmony:object_literals● Objectの文法拡張提案○ Set Literal [[Prototype]] Operator○ Object Literal Property Shorthands○ Object Literal Property Value Shorthand○ Object Literal Computed Property Keys○ Object Initialiser super References○ Object Extension Literal
Object Literal Extensions● http://wiki.ecmascript.org/doku.php?id=harmony:object_literals● Objectの文法拡張提案○ Set Literal [[Prototype]] Operator → 死亡○ Object Literal Property Shorthands → 一部死亡○ Object Literal Property Value Shorthand → 生存○ Object Literal Computed Property Keys → 生存○ Object Initialiser super References → 一部死亡○ Object Extension Literal → 死亡
Set Literal [[Prototype]] Operator
Set Literal [[Prototype]] Operator● http://wiki.ecmascript.org/doku.php?id=harmony:proto_operator● MemberExpression <| ProtoLiteral○ という構文
基本的な機能右の値(RHS)の[[Prototype]]に左のオブジェクト(LHS)を代入して返す(LHSを継承したRHSを返すみたいなイメージ)var obj = {c: 3};var newObj = obj <| {a: 1, b: 2};newObj.c // => 3
ただし、右が関数式の場合は
RHSにくるもので挙動が異なる!
なんとなく死んだ理由がわかった気がする...(そもそも <| って気持ち悪い)
要調査● class(ECMAScript6から追加された)のextendsとして生まれ変わったのかも?○ https://esdiscuss.org/topic/alternative-syntax-forclass Parent { … }class Child extends Parent { … }class Child2 extends (function() {}) { … }
Object Literal Property Shorthands
Object Literal Property Shorthandsvar old = {bar: 1,foo: function() { return 1 }};var new = {bar := 1,foo() { return 1 }};// ※newオブジェクトのpropertyは全てnon-writable
Object Literal Property Shorthandsvar old = {bar: 1,foo: function() { return 1 }};var new = {bar := 1, → 死亡foo() { return 1 } → 生存};// ※newオブジェクトのpropertyは全てnon-writable
なんでそうなったかは不明
Object Initialiser super References
Object Initialiser super References● http://wiki.ecmascript.org/doku.php?id=harmony:object_initialiser_super● super keywordを使って継承元のclassのメソッドが呼び出せる○ Pythonで見たことあるkeywordだな...
Object Initialiser super References生き残った例class Parent {foo() { … }}class Child extend Parent {foo() { super(); }}
Object Initialiser super References生き残った例2class Parent {foo() { … }}class Child extend Parent {bar() { super.foo(); }}
Object Initialiser super References死んだ例(当初はclassはなかったので、classがあったと想定)class Child extend Parent {get super set f(v) { f = v; }}
Object Initialiser super Referencesclass Child extend Parent {get super set f(v) { f = v; }}上と下は同じclass Child extend Parent {set f(v) { f=v; }get f() { return super.f; }}
get super set…うーん...(set super getもある)
Object Extension Literal
Object Extension Literal.を使ってオブジェクトを拡張できるリテラルvar obj = {};obj.{ a: 1, b: 2, c: 3 };obj.a // => 1
過激だ!
Object Extension Literal● そこそこ物議を醸した○ https://esdiscuss.org/topic/new-object-extension-literal-strawman● さらに、これを使ったclass定義を考える人も○ http://wiki.ecmascript.org/doku.php?id=harmony:object_extension_literal_class_pattern
Object Extension Literal
過激だ!!
ところで、生き残った構文は?
Object Literal Property ValueShorthand
Object Literal Property Value Shorthandオブジェクトの初期化時に、変数名とプロパティ名が同じ場合に使える省略記法var a = 1, b = 2;var old = { a: a, b: b };var new = { a, b };
Object Literal ComputedProperty Keys
Object Literal Computed Property Keysオブジェクトの初期化時に、プロパティ名に式の評価結果を与えることができるvar a = ‘key’;var old = {}; old[a] = 1;var new = { [a]: 1 };
個人的にはあまり使いたくない
終わりに
まとめ● Proposalにもいろいろある○ こんなん考えたんだけどどう?程度のものから○ Abstruct Syntax Tree入りの仕様を持ってくるものまで● コミュニティの皆様方、お疲れ様です...○ 特に前者のProposalは意図を把握するのが大変そう○ ミーティングが思ったより戦いっぽくて大変そう
死んでいったProposalに黙祷

Recommended

PDF
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
PPTX
C++のビルド高速化について
PDF
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
PDF
自由エネルギー原理から エナクティヴィズムへ
PDF
ジャストシステムJava100本ノックのご紹介
PDF
いつやるの?Git入門
PDF
レシピの作り方入門
PDF
Form認証で学ぶSpring Security入門
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
PDF
ゲームAI製作のためのワークショップ(II)
PDF
Ml system in_python
PDF
Node-REDのworldmapの活用
PPTX
F.E.A.Rにおけるゴール指向プランニング
PDF
【de:code 2020】 React Native で Windows アプリ開発 ~React Native for Windows~
PPTX
KillzoneにおけるNPCの動的な制御
PPTX
ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク
PDF
個人開発でも使ってみようAddressableAssetSystem
PPTX
Msを16倍出し抜くwpf開発1回目
PPTX
位置データもPythonで!!!
PDF
コロナで大打撃を受けた宿泊業のエンジニアの逆境との闘い
PDF
バーチャルリアリティ(VR)概要
PDF
JavaScript難読化読経
PPTX
UE4で実現できた理想のゲーム開発ワークフロー
PDF
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
PDF
やりなおせる Git 入門
PDF
ディープラーニングの2値化(Binarized Neural Network)
PDF
C++コミュニティーの中心でC++をDISる
PDF
Haxeについて

More Related Content

PDF
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
PPTX
C++のビルド高速化について
PDF
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
PDF
自由エネルギー原理から エナクティヴィズムへ
PDF
ジャストシステムJava100本ノックのご紹介
PDF
いつやるの?Git入門
PDF
レシピの作り方入門
PDF
Form認証で学ぶSpring Security入門
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
C++のビルド高速化について
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
自由エネルギー原理から エナクティヴィズムへ
ジャストシステムJava100本ノックのご紹介
いつやるの?Git入門
レシピの作り方入門
Form認証で学ぶSpring Security入門

What's hot

PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
PDF
ゲームAI製作のためのワークショップ(II)
PDF
Ml system in_python
PDF
Node-REDのworldmapの活用
PPTX
F.E.A.Rにおけるゴール指向プランニング
PDF
【de:code 2020】 React Native で Windows アプリ開発 ~React Native for Windows~
PPTX
KillzoneにおけるNPCの動的な制御
PPTX
ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク
PDF
個人開発でも使ってみようAddressableAssetSystem
PPTX
Msを16倍出し抜くwpf開発1回目
PPTX
位置データもPythonで!!!
PDF
コロナで大打撃を受けた宿泊業のエンジニアの逆境との闘い
PDF
バーチャルリアリティ(VR)概要
PDF
JavaScript難読化読経
PPTX
UE4で実現できた理想のゲーム開発ワークフロー
PDF
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
PDF
やりなおせる Git 入門
PDF
ディープラーニングの2値化(Binarized Neural Network)
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
ゲームAI製作のためのワークショップ(II)
Ml system in_python
Node-REDのworldmapの活用
F.E.A.Rにおけるゴール指向プランニング
【de:code 2020】 React Native で Windows アプリ開発 ~React Native for Windows~
KillzoneにおけるNPCの動的な制御
ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク
個人開発でも使ってみようAddressableAssetSystem
Msを16倍出し抜くwpf開発1回目
位置データもPythonで!!!
コロナで大打撃を受けた宿泊業のエンジニアの逆境との闘い
バーチャルリアリティ(VR)概要
JavaScript難読化読経
UE4で実現できた理想のゲーム開発ワークフロー
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
やりなおせる Git 入門
ディープラーニングの2値化(Binarized Neural Network)

Similar to ECMAScript没proposal追悼式

PDF
C++コミュニティーの中心でC++をDISる
PDF
Haxeについて
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PDF
Pfi Seminar 2010 1 7
PDF
JSX / Haxe / TypeScript
ODP
これから Haskell を書くにあたって
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
PDF
JavaScript.Next
PDF
JavaScript (ECMAScript) 2013
PDF
Kanazawa.js.Next
PDF
ECMAScript 6 Features(PDF 版)
 
PPTX
Nds meetup8 lt
PDF
JavaScript/CSS 2015 Autumn
PDF
ジェネリック関数の呼び出され方 #cocoa_kansai
PDF
DSL by JRuby at JavaOne2012 JVM language BoF #jt12_b101
PDF
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
PDF
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
PDF
Swift 2.0 大域関数の行方から #swift2symposium
PDF
Web技術勉強会 20110723
PPT
オブジェクト指向入門7
C++コミュニティーの中心でC++をDISる
Haxeについて
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Pfi Seminar 2010 1 7
JSX / Haxe / TypeScript
これから Haskell を書くにあたって
これからのJavaScriptー関数型プログラミングとECMAScript6
JavaScript.Next
JavaScript (ECMAScript) 2013
Kanazawa.js.Next
ECMAScript 6 Features(PDF 版)
 
Nds meetup8 lt
JavaScript/CSS 2015 Autumn
ジェネリック関数の呼び出され方 #cocoa_kansai
DSL by JRuby at JavaOne2012 JVM language BoF #jt12_b101
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
Swift 2.0 大域関数の行方から #swift2symposium
Web技術勉強会 20110723
オブジェクト指向入門7

More from 京大 マイコンクラブ

PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
PDF
暗号技術入門 秘密の国のアリス 総集編
PPTX
女の子になれなかった人のために
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
PDF
多倍長整数の乗算と高速フーリエ変換
PDF
つくってあそぼ ラムダ計算インタプリタ
PDF
Geometry with Unity
PDF
Pietで競プロしよう
ODP
もし太陽のコアがIntelCoreだったら
PDF
かわいくなろうとしたら語彙力が下がった話
PDF
エンジニアと健康
PDF
セミコロンレスc++
PDF
C#でゲームを作る2016 第8回
PDF
Common Lisp入門
PDF
No SSH (@nojima; KMC関東例会)
PPTX
hideya流 テストプレイ観察術
PDF
テキストファイルを読む💪 第1回
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
プログラムを高速化する話Ⅱ 〜GPGPU編〜
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
暗号技術入門 秘密の国のアリス 総集編
女の子になれなかった人のために
ドット絵でプログラミング!難解言語『Piet』勉強会
多倍長整数の乗算と高速フーリエ変換
つくってあそぼ ラムダ計算インタプリタ
Geometry with Unity
Pietで競プロしよう
もし太陽のコアがIntelCoreだったら
かわいくなろうとしたら語彙力が下がった話
エンジニアと健康
セミコロンレスc++
C#でゲームを作る2016 第8回
Common Lisp入門
No SSH (@nojima; KMC関東例会)
hideya流 テストプレイ観察術
テキストファイルを読む💪 第1回
DTM練習会2017第1.5回 「伴奏の付け方」

ECMAScript没proposal追悼式


[8]ページ先頭

©2009-2025 Movatter.jp