読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

ECMA262 Edition 5.1読書会 ここまでのおさらい まとめ #ecma262

ECMAScript

ecma262reading.doorkeeper.jp

ECMA-262 Edition 5.1を読む

ECMA-262 Edition 5.1を読む

タイムスケジュール変わってた

ECMA262-Edition5.1読書会

ECMA262-Edition5.1読書会 | Doorkeeper

JavaScript(ECMAScript)の仕様書をみなで読み進める読書会

groups.google.com

日本語の本

ECMA-262 Edition 5.1を読む

ECMA-262 Edition 5.1を読む

HTML

http://www.ecma-international.org/ecma-262/5.1/

過去の開催内容

  • 第1条 適用範囲 - 第12条 文まで

第1条はさわりだけ1ページで、本格的なところは第4条から。。。後ろにいくほどしんどくなる

ドルアーガの塔

ドルアーガの塔

第4条 概要

  • ECMAScriptの概要
  • ECMAScriptはオブジェクト指向言語
  • 最初はWebスクリプティング言語として(実装から始まって後付でルールが決まった)
  • 仕様では外部データや出力先は指定せず(ECMAという仕様があって、各計算環境で必要なオブジェクトを追加して欲しいという仕様)
  • 計算環境がホストオブジェクトをも提供することを想定

言語の概要

  • ECMAScriptはOOP
  • 基本言語とホスト機能はオブジェクトで提供
  • ECMAはオブジェクトの集合体
  • オブジェクト=プロパティのコレクションで、0個以上で構成

プロパティ

  • プリミティブ値と関数を格納するコンテナ
  • プリミティブ値とは言語仕様の最も低いレベルで直接表現されるデータ
  • undefined null boolean number string

オブジェクトとメソッド

  • 呼び出し可能なオブジェクト→関数
  • プロパティを通してオブジェクトに関連付けられた関数→メソッド

関数とメソッドは違うものとして定義されている

オブジェクト

  • ECMAではC++とかJavaみたくクラスというものが使われない
  • かわりにリテラル表記やコンストラクタでオブジェクトを生成できる
  • プロトタイプベースの継承 共有プロパティを実装するために使われるprototypeという名前の関数
  • new式でコンストラクタを使用することでオブジェクトは作られる

nodeで動かしてみる

> typeof(new Date())
'object'
> typeof(Date())
'string'

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

  • プロパティのコレクション
  • プロパティ
  • 名前つきのデータプロパティ
  • 名前付きのアクセサプロパティ
  • 内部プロパティ(二重括弧で括って表現 それを実装していないオブジェクトはTypeError)

継承のような振る舞い

> A = function() { return { func : function() { console.log('hello'); } } }
[Function]
> B = function() { return new A(); }
[Function]
> C = new B();
{ func: [Function] }
> C.func()
hello
undefined
> C.func = function() { return 123; }
[Function]
> C.func()
123

データ型

  • プリミティブ値 undefined bool number など
  • 仕様書型(見慣れない…)
  • Reference
  • List
  • Completion
  • Property Descriptor
  • Property Identifier
  • Lexical Environment
  • Envirnment Record

このあたりを抑えておかないと言語仕様を理解するのがしんどい…かもしれない…

仕様書型

  • セマンティクスで記述されているアルゴリズム内で使われるメタな値に相当
  • 仕様書型は仕様上の中間生成物 任意の特定の要素に対応しているとは限らない
  • 評価の中間結果を記述するために使用されるがオブジェクトのプロパティや変数の値として格納できない(=プログラマが使えない)

Reference仕様書型

  • Referenceは解決された名前のバインディング
  • 値をバインディングするためのもの
  • base値 レファレンス値 boolean値 の3つの構成要素
  • base値 Obejctを覗いてプリミティブ値が入る
  • base値がundefinedというのはリファレンスがバインディングで解決されない
  • 何も参照されていない値はundefined扱いされるが、そういう場合はリファレンスがバインディングで解決されていないという状態
  • GetValue()/PutValue()はリファレンスを操作するための抽象操作(なのでやっぱり仕様書の言語仕様でプログラマが直接いじれるレイヤーではない)

Completion仕様書型

  • 言語仕様の中で嫌というほど出てくる 制御の非局所的な転送を行うやつ
  • (break continue return throw)の振る舞いを説明
  • (type, value, target)のタプルで構成
  • typeはnormal break continue return throw
  • valueは言語の値もしくはempty
  • targetは言語の識別子もしくはempty
  • 中途完了という用語は、typeがnormalである以外のすべての完了を表す

Property Descripter / Identifier仕様書型

  • 名前付きプロパティの属性の操作と具体化を説明するのに使われる
  • プロパティの属性 規定された属性のフィールド名とフィールド値から構成
  • Property Descriptor型は特定のフィールドの有無や使い方によって、データプロパティ記述子とアクセサプロパティ記述子に分類
  • データプロパティ Value Writableという名前を含む
  • アクセサプロパティ Get Setという名前を持つもの
  • この両方を兼ねるものはNG
> o={}
{}
> o.a=1
1
> Object.getOwnPropertyDescriptor(o, "a")
{ value: 1, writable: true, enumerable: true, configurable: true }

オブジェクトの内部メソッドのアルゴリズム

  • 仕様上どういうふうな書かれ方をしているのか。。。
  • P66
  • Oはオブジェクト Pはプロパティ Dはdesc まあ擬似言語なので実際の文字はなんでもよかった

  • 読み方とかはこんなかんじ。。。

www.webzoit.net

9条(型変換とテスト)

  • 特筆すべきところはあまり…

10条(実行可能コードと実行コンテキスト)

  • global ソースコードそのもの
  • eval 組み込みのeval関数に指定されたソースコード
  • function 関数
  • strictモード

レキシカル環境

  • Identifier(識別子)から変数と関数の関連を定義するために用いられる仕様書型
  • 環境レコードとnullである可能性のある「外側の」レキシカル環境への参照から構成
  • ECMAScriptコードの構造に関連付けられており、新しいレキシカル環境はそういったコードが評価されるたびに作られる try catchなど、それぞれのブロックに環境が構築される
  • レキシカル環境と環境レコード値は中間生成物に対応する必要はないので、プログラマはこの部分を弄ることは出来ない。

重要なところ

  • Completion仕様書型
  • 仕様書の読み解き方

とっかかり

> var a = [1,2,3,4]
undefined
> a.propertyIsEnumerable()
false
> a.propertyIsEnumerable(0)
true
> a.propertyIsEnumerable(1)
true
> a.propertyIsEnumerable(4)
false

getの実装

> Object.defineProperty(o,"b",{get:function() {return 1}})
{ a: 1 }
> Object.defineProperty(o,"c",{get:function() {return 1}})
{ a: 1 }
> o.c
1
> o.c = 2
2
> o.c
1
> o.a
1
> o.a = 2
2
> o.a
2

propertyIsEnumerable メソッド (Object) (JavaScript)

仕様書型をトレースできるECMAScriptの実装

Narcissus - Wikipedia

ナルキッソスはちょっと違う。

仕様書を決めるのは読書会の目的じゃなかった。