ECMAScript 2015 Language SpecificationのIntroductionから4章まで


[ECMAScript 2015 Language Specification](http://www.ecma-international.org/ecma-262/6.0/)一人輪読会資料。（やりたいチームメンバーがいればいつでもウェルカムなので、もしかしたらそのうち普通の輪読会になるかも）

## Introduction

- このECMA標準はECMAScript 2015を定義するものである
- 1997年に第1版が出て、今回で第6版
- ECMAScript2015のゴール
	- 大規模アプリケーション開発、ライブラリ開発、多言語のコンパイルターゲットとしての利用へのより良いサポート
- ECMAScriptの歴史
	- [Wikipedia](https://ja.wikipedia.org/wiki/ECMAScript)見たほうが図があっていいかも

## 1 Scope

- この標準はECMAScript2015多目的プログラミング言語を定義している

## 2 Conformance

適合条件っぽい。
conformance => 適合・準拠

- ECMAScriptに適合する実装は、
	- （ES5と変わらないとこ）
		- 本仕様に記述されている全ての型、値、オブジェクト、プロパティ、関数、文法・セマンティックを提供しなければならない
		- この仕様で記述されている以上に型、値、オブジェクト、プロパティ、関数を追加してもよい。特に、仕様にないプロパティやオブジェクト、それらのための仕様にない値を追加してもよい。
		- この仕様に記述されていないプログラムや正規表現をサポートしてもよい。特に、11.6.2.2にリストされている予約語を使った文法をサポートしてもいい。
			- is permitted toがmayになっているがニュアンスがちょっと違う？「認められる」と「してもよい」くらいの違いなのか？英語詳しい人おしえてー
	- （ES5と変わったとこ）
		- ソーステキストをUnicode 5.1.0かそれ以降とISO/IEC 10646で解釈しなければならない。採用したISO/IEC 10646-1のサブセットにおいて他に何も指定していなければ、Unicodeのcollection 10646と解釈される
			- shall interpretがmust interpretになっている
			- ES5ではUnicode3とか、結構変わってるっぽい
		- 16.1に禁止拡張（a Forbidden Extension）としてリストされているものを実装してはならない
			- 詳しくはその章の時に深堀りするが、strictモード時のarrow functionとかメソッド定義で`caller`や`arguments`っていう名前のプロパティを作るなとか書いてある

## 3 Normative references

このドキュメントの適用に不可欠なドキュメントは下記。日付のあるものはその版のみが適用されて、日付のないものは最新版が適用される。（JSONの仕様は常に最新版を適用って感じかな？）

- ISO/IEC 10646:2003（改定、訂正、後続を含む）
- [ECMA-402, ECMAScript 2015 Internationalization API Specification.](http://www.ecma-international.org/publications/standards/Ecma-402.htm)
- [ECMA-404, The JSON Data Interchange Format](http://www.ecma-international.org/publications/standards/Ecma-404.htm)

## 4 Overview

- ECMAScriptはオブジェクト指向言語
- ECMAScriptはそれ自身で自己完結する言語ではない。
	- この仕様も外部の入出力に関する規定はない。
	- なので、この仕様にあるオブジェクトやその他の機能だけでなく、固有の環境に依存したオブジェクトを提供することが想定されている
		- そのオブジェクトの説明や挙動は本仕様の対象外
	- ECMAScriptはもともとWebのスクリプト言語としてデザインされているので、特定のホスト環境に依らないコアな言語がこの仕様には定義されている
- ECMAScriptの用途はシンプルなスクリプト言語としての利用を越え、今では多種多様な環境・規模でのプログラミングの全領域で使われるようになった。
- ECMAScriptのいくつかの機能は他のプログラミング言語で使われているものとよく似ている。特に、C、Java、Self、Schemeなどと。

[ES5](http://tsofthome.appspot.com/ecmascript/ecma-262.5_04.html)とほとんど一緒だけど、ECMAScriptの用途の範囲が広がっているよというのがより強調されている感じ。

### 4.1 Web Scripting

（ES5から全く変わってないっぽい）

- ECMAScriptをサポートするWebブラウザやサーバは、ECMAScriptの実行環境を満たす個々のホスト環境を提供している
	- ブラウザはDOMとか、サーバはファイル操作とかを、ECMASCriptの関数やオブジェクトで表現している

### 4.2 ECMASCript Overview

- 言語概要、参考情報（a informal overview）なので、言語の全てを説明しているわけではないのであしからず
- ECMAScriptはオブジェクトベースで、プログラムはオブジェクト同士のコミュニケーションの集合である
- ECMAScriptでオブジェクトとは、0以上のプロパティを持つコレクションで、それぞれのプロパティはそのプロパティをどう利用できるかの属性を持っている（writableとか）
- プロパティには別のオブジェクト、プリミティブ値（Undefined, Null, Boolean, Number, String、**Symbol**）関数を束縛できる
	- 関数がオブジェクトのプロパティにある場合は、methodって呼ぶ
- ECMAScriptで定義されている組み込みオブジェクト
	- グローバルオブジェクト
	- Object, Function, Boolean, Symbol, 様々なErrorオブジェクト
	- Math, Number, Date, String, RegExp
	- Array, TypedArray
	- Map, Set
	- JSON, ArrayBuffer, DataView
	- Promise
	- Proxy, Reflect
- ECMAScriptで定義されている演算子
	- 単項演算子
	- 乗算演算子
	- 加算演算子
	- ビットシフト演算子
	- 関係演算子
	- 等価演算子
	- バイナリビット演算子
	- バイナリ論理演算
	- 代入演算子
	- カンマ演算子
- ECMAScriptのシンタックスはJavaに似ているが、スクリプト言語として使いやすくするためにゆるくなっている（変数の型宣言が必要ないとか）

ES5と「Language Overview」あんまり変わってないが、プリミティブ値にSymbol、組み込みオブジェクトにPromise、generator、Map、Set、Proxy、Reflectが追加されている

#### 4.2.1 Objects

プロトタイプチェーンとかについて書かれてる。ES5とほとんど同じだが、class記法についての記述が追加されてた。

- ECMAScriptにはclass記法がある（2015からだけど）が、ECMAScriptのオブジェクトは基本的にC++やSmalltalk, Javaのようなクラスベースのものではない。
- その代わり、様々な方法でオブジェクトが生成される。リテラル記法（`{}`）やコンストラクタなどで。
- コンストラクタは、
	- `prototype`というプロパティを持つ関数
		- `prototype`はプロトタイプベースの継承、プロパティの共有を行うために使われる
	- オブジェクトを生成・初期化する
	- new式（`new contructor`）でオブジェクトが生成される
- コンストラクタから生成されたオブジェクトは、そのコンストラクタの`prototype`プロパティの値への暗黙的な参照を持っている。
- さらにprototypeもそのprototypeへの暗黙的な参照を持っている。これがプロトタイプチェーン。
- 以下、例。

```javascript
function CF() {}
CF.prototype.P1 = 'P1';
CF.prototype.P2 = 'P2';

// cf1はCF.prototypeへの暗黙的な参照を持っている
var cf1 = new CF();
// なので、P1, P2プロパティがcf1にない場合
// その参照をたどってCF.prototypeにあるP1, P2を参照する
console.log(cf1.P1, cf1.P2); // P1 P2

// cf2はCF.prototypeへの暗黙的な参照を持っている
var cf2 = new CF();
// P1プロパティはcf2に定義されているので、それを返し、
// P2プロパティはcf2に無いのでCF.prototypeのものを返す
cf2.P1 = "cf2's P1";
console.log(cf2.P1, cf2.P2); // cf2's P1 P2
```

- ECMAScriptのオブジェクトはクラスベースではないが、コンストラクタ関数やprototypeオブジェクトをベースにクラスっぽい抽象化をするのに役に立つ
- ECMAScriptの組み込みオブジェクト自身はそれらのクラスライクなパターンを従っている
- ECMAScript2015から導入されたclass記法では組み込みオブジェクトのようにクラスライクな抽象化パターンをオブジェクトに実装可能にする

#### 4.2.2 The Strict Variant of ECMAScript

strictモードについて。ES5と全く同じなんでざっと。

- セキュリティの観点や、エラーになりやすい機能を避けるなどのために、言語のいくつかの機能の利用を制限したい場合がある
- そのためにECMAScriptはstrictモードという、ECMAScriptの厳格なやーつを定義している。
- 非strictモードではエラーにならないようなものも、strictモードでは例外を投げるようにがエラーが追加されている。
- strictモードの適用は個々のコードで明示的に行われる（`"use strict";`）ので、非strictモードのコードと組み合わせて使うことができる

### 4.3 Terms and definitions

用語と定義。スキップ。

### 4.4 Organization of This Specification

4章以降の構成について

- 5章ではこの仕様で通して使う表記法について定義する
- 6~9章は実行環境を定義する
- 10~16章はエンコーディングやセマンティックについて
- 17~26章はECMAScriptの標準ライブラリを定義する


## まとめ

- 4章までは全体の概要で、5章からが本番っぽい。
- ES5とほとんど変わらないとこが多かったが、新しく追加された機能について全体的に触れている
- ECMAScriptの実行環境が増えていて、今までのニーズから変わりつつあるよということを強調している感じがあった。

## 反省点

- 翻訳をだらだらやってしまう傾向にあるので、読むのとまとめるのを分けたほうが良さそう。
- どう訳せばいいかわからない英文は[ES5の訳文](http://tsofthome.appspot.com/ecmascript.html)を参考にしながらやると結構うまくいったし、ES5との比較も同時に出来てよかった。

次回は5章、いい感じに進んだら6章までやりたい。