先月はECMAScript 2015 (ECMAScript 6)が採択され、また、WebAssemblyが発表された。多分これらは現代のWebプログラミング言語の歴史に残る出来事だろう。しかし、ここ10年ぐらいのJavaScript/ECMAScriptの歴史と背景事情みたいのをまとめた文章のようなものをあまり見かけないので、ちょっとだけ書いてみることにする。(というよりは「ちょっとだけ調べてみた」の方が適切。あんまりまとまってないし)
以下の文章中には、「ECMAScriptの通称としてのJavaScript」と「ECMAScript言語のMozillaによる実装としてのJavaScript」が混在している。バージョン番号がついたやつは後者である。
古代のJavaScript
そんなものは知らん。
Ajax — 2005年2月18日
Google SuggestやGoogle Mapsに代表されるように、ページをリロードせずに非同期で情報を取ってこれるWebアプリケーションが登場した。そして、そういう技術に対するAjaxという言葉が出てきた。Wikipedia先生によると以下の記事が初出らしい。
Ajaxは、ECMAScriptの言語仕様的な意味ではあまり関係ないが、多分象徴的な意味があるのでこの記事で触れておく。
Prototype.js — 2005年
Ajaxが流行って、JavaScriptフレームワークがいろいろ出てきた。Prototype.jsはその代表的なものであろう。
Prototype.jsはECMAScriptの組み込みオブジェクトにいろいろな関数・メソッドを追加していたが、その中の一つにFunction.prototype.bindメソッドがあった。
Function.prototype.bindはその後、ECMAScript 5で、細部の仕様が異なる形で標準化された。
初期のPrototype.js
で、実際どういう経緯で標準化されるに至ったのか調べようとしたのだが、Prototype.jsの初期のバージョンがどこで入手できるのか分からない。公式のダウンロードページには1.5.0 (Jan 2007)以降のダウンロードリンクしかない。GitHubリポジトリをさかのぼっても、最初のコミットが2007年である。最初のコミットメッセージ:”prototype: Reorganize the source tree.”じゃあないんだよ。
Wikipediaには「prototype.jsはRuby on Railsのために書かれた」と書かれていて、Ruby on Railsの昔のバージョンにprototype.jsがバンドルされているらしい。というわけで、RoRの古いバージョンを調べてみたところ、v0.11.0(2005年3月22日)からprototype.jsが付属するようである。そのprototype.jsはバージョン1.0.1だ。そして、RoRのリポジトリにコミットされた当初のprototype.js(2005年3月21日)はバージョンは1.0.0。
で、バージョン1.0.0の当時からFunction.prototype.bindが含まれている。リンク先を見てわかるように、当初は至って素朴な実装であったようだ。
Function.prototype.bindのECMAScriptへの導入
ECMAScript 3にFunction.prototype.bindがなく、ECMAScript 5に入っているということは、途中の時点で誰かが入れたはずである。
es-discussの2008年3月10日のメールに添付されているECMAScript 4のdraftには、すでにFunction.prototype.bindが入っている。これ以上古い言及はちょっと見つけられなかった。
どの時点で今の仕様になったのかも気になるが、調べるのが面倒くさい。
10年前のインターネット上の情報を漁るのは辛すぎるし、この辺の話は関係者に聞いたほうが早いと思われる。
JavaScript 1.6 — 2005年11月
JavaScript 1.6を実装したFirefox 1.5が登場した。ここでのJavaScriptというのはECMAScriptのMozillaによる実装のことである。
JavaScript 1.5はECMAScript 3rd ed.に相当し、JavaScript 1.6以降はそれにMozillaの独自拡張を施したものとなる。
JavaScript 1.6は以下の新機能を実装していた:
- E4X
- 今は亡きECMAScript for XMLである。
- Array extras
- Array.prototype.indexOfとかArray.prototype.forEachとか仲間たちである。ECMAScript 5で導入されたArray.prototype.reduceはまだ入っていない。
- Array generics, String generics
E4X以外はその後のECMAScript 5で標準化された。E4Xは一応別のECMA規格で標準化されているが、普及しないままFirefoxからも削除された。サヨナラ!
この記事を書こうとした人は疲れてしまいました — 2015年7月
下に書く諸々も補えば、いい感じのJavaScript近代史になると思う。誰か書いてくれ。あと、それぞれの技術の年表・相関図もあると良い。
- JSONの普及(いつごろ?)
- 初のRFC:RFC4627 (2006年)
- →ECMAScript 5のJSONモジュール
- ECMAScript 5リリース(2009年)
- WebGLによるTyped Arrays導入(いつだっけ?)
- →ECMAScript 6に導入
- Emscriptenの登場(登場:2010年ごろ、正式リリース:2012年11月11日(1.0.1))
- (背景:LLVMとclang)
- →Math.imulの導入 (ES6)
- es-discussでの提案(2012年11月2日): additional Math function
- →asm.js
- asm.jsの登場(2013年)
- ←Emscripten
- →Math.froundの導入 (ES6)
- 当初:Math.toFloat32 関連
- 名称変更:Math.roundFloat32 関連
- 名称変更:Math.fround 関連
- Bugzilla: 900125 – Float32: add Math.fround to the interpreter
- Efficient float32 arithmetic in JavaScript | JavaScript
- →WebAssembly
- ECMAScript 2015リリース
- WebAssemblyの登場(ついこの間)
- ←asm.js
- ←Native Clientのノウハウ?
- →輝かしい未来へ(?)
- とりあえずBrendan Eich氏の記事へのリンクを貼っておく。
- Node.jsの登場(いつだっけ?)
- (背景:GoogleのV8 Engine)
- →モジュール(ES6)への影響?
altJSの台頭
- CoffeeScript(いつ?)
- Dart(2011年)
- TypeScript(2012年)
- ES6の一部機能を先取りした。
MozillaのJavaScript拡張
標準化されなくても、仕様の叩き台にはなってるのだろうか。
- JavaScript 1.7 (Firefox 2, Oct 2006)
- イテレーターとジェネレーター→仕様が違うものがES6に入った
- 配列内包表記(array comprehensions)
- let文→仕様が微妙に違うものがES6に入った
- for文のループ変数に使った時の挙動がJavaScript 1.7とES6で微妙に違う。(だよね?)
- 分割代入(destructuring assignment)→ES6に入ったものと大体同じ?
- JavaScript 1.8 (Firefox 3)
- Expression Closures→標準に入らなかった。ES6の矢印関数が気持ちとしては似ているかも。
- ジェネレーター式
- Array.prototype.reduce, Array.prototype.reduceRight→ES5
その他欲があったら書きたいこと
ECMAScriptの黎明期(JavaScript vs JScript)や、プラグイン系の技術(Java applet, ActiveX, Flash, Silverlightなど。NaClも入れる?)とその滅亡(プラグインを一切サポートしない環境の台頭、セキュリティー上の懸念)も、「ブラウザで動くプログラミング言語・環境」的な意味で書いておくといいかもしれない。