uhyohyo.net

JavaScript初級者から中級者になろう

十六章第二十二回 TC39とJavaScriptの標準化

このページの最終更新日:

おめでとうございます、今回が長かった第16章の最後です。とてもうれしいですね。

とはいえ、前回まででES2017までの言語機能の紹介はほぼ終わりました。今回は新機能の説明ではありません。今回は、TC39によるECMAScriptの仕様策定プロセスを紹介します。

ECMAScript

最近は、ES5とかES2015というように、JavaScriptを指してES、すなわちECMAScriptという名称が使われる場面が増えました。

まずこの名称の由来ですが、これはECMA Internationalという標準化団体の名前に由来しています。標準化団体というのは、様々な技術に対する業界標準を定める団体です。つまり、広く使われるものは、それをどのように使えばいいのかをしっかりと定義し、利用者たちの認識を共通化してあげる必要があります。人やソフトウェアによって認識が違うと、例えばGoogle Chromeでちゃんと動作するJavaScriptがFirefoxでは動かないみたいな困った事態が発生することになります。利用者たちの共通認識となる業界標準を作るのが標準化団体です。

標準化団体はいくつもあります。ECMAScriptを標準化するECMA Internationalのほかに、HTMLやDOMを標準化するWHATWGやW3Cなどがあります。これらの標準化団体にはGoogle、Microsoft、Mozillaなどのブラウザベンダが実際参画しているため、定められた標準が有効に働き、ブラウザ間での統一が成されているのです。

そして、数ある標準化団体の中で、JavaScriptの標準化を担当しているのがECMA Internationalというわけです。なお、ECMA Internationalが標準化しているのはJavaScript (ECMAScript)だけではありません。他にもいくつもの規格がECMAによって標準化されています。このような規格は番号によって区別されています。そこで、ECMAScriptはその番号を用いてECMA-262と呼ばれることもあります。

これがJavaScriptではなくECMAScriptと呼ばれているのは歴史的経緯によるものです。太古の昔(1995年あたり)、はじめてJavaScriptが世に登場しました。それまで動かないHTMLで書かれたページしか無かったウェブに動くページが登場するという大革命です。ちなみに、JavaScriptをはじめて搭載したブラウザはNetscapeというブラウザです。当時は、当然ながらJavaScriptはNetscapeでしか動かないものでした。そこで、他のブラウザも負けてられぬと似たような機能をブラウザに追加しました。似たようなというのがポイントです。全く同じものを実装すると丸パクリになってしまうわけですね。例えば、当時ライバルブラウザのひとつだったかの悪名高いInternet Explorerは、JScriptという名前で似たような機能を実装したのです。また、似たような機能ということは、つまり微妙に違うということです。また、相手のブラウザに負けてられないということで各ブラウザは独自の機能の追加を進めました。

こうなると、あるブラウザで動くものが他のブラウザでは動かないという事態が発生します。これはまずい雲行きですね。それもこれも、誕生したばかりのJavaScriptには業界標準なんて存在しなかったからです。ということで、さっそくJavaScriptの標準化が開始され、1997年には最初の標準がリリースされました。ここでECMAScriptという名前がついたわけです。ここで名前がECMAScriptとなったのは、当時JavaScriptとJScriptの2つが主に争っていたので一方の名前を付けられなかったのかもしれません。これにより、ECMAScriptという業界標準が誕生し、JavaScript(あとJScript)はその標準に準拠したプログラミング言語という扱いになったのです。

IEを擁するMicrosoftもいつしかJScriptという看板を捨ててJavaScriptに合流したので、JavaScriptがECMAScriptに準拠した唯一の言語となり、JavaScriptとECMAScriptはほぼ同一のものとして扱われるようになりました。実際に我々が書いているのはJavaScriptですが、仕様に関する文脈ではECMAScriptと呼ぶのが主流であるように思います。言語機能なども、特に新しいものはECMAScriptのどのバージョンで導入されたかで覚えられることが多いので、「クラスはES2015由来の機能」などというようにECMAScriptの名前が使われることが多いようです。

余談ですが、一時期ActionScriptという言語がECMAScriptに準拠した形で作られていましたがいつのまにか別物になりました。

なお、こういった内容はECMAScript仕様書の一番最初、Introductionに書いてあります。興味があったら読んでみてください。

ECMAScriptの仕様策定プロセス

ECMAScriptはバージョンアップしていきます。標準がバージョンアップするということは、それを実装するソフトウェアたちもそれに追随していくということです。これにより、JavaScriptというプログラミング言語(あるいはECMAScriptという仕様)に新たな機能の追加が成されるわけです。

この講座を通しで読んだ皆さんは、2回の大きなバージョンアップを経験したはずです。第11章で扱ったES5、そして本章で扱ったES2015です。ES5以前のJavaScriptはES3として、2002年に完成したものです。そして、ES5は紆余曲折あって2009年に登場しました。ES2015はその名の通り2015年の登場です。なお、ES4は諸事情により欠番となりました。

これらのバージョンアップはご存知の通り大規模なバージョンアップでした。大規模なだけあって、その策定には見ての通り時間がかかっています。

しかし、近年ウェブアプリケーションの開発はどんどん加速するばかりです。業界標準というのは業界の成長を牽引する原動力であるわけですから、次のバージョンアップが何年後かすら定かでない状況というのは望ましくないのです。そこで、ES2015以降、ECMAScriptは1年に1度バージョンアップすることになりました。この記事の執筆時点で、ES2016、ES2017が既に登場しています。皆さんも本章でES2016やES2017の機能を学びましたね。

バージョンアップということは当然新しい機能が追加されるということです。ECMAScriptに新しい機能が追加されるまでには、その機能がどのような課題を解決するのかとか、その問題を解決するには本当にこの仕様でいいのかとかを議論する必要があります。しかし、時として議論はなかなかまとまらず先に進まないものです。とはいえ、議論が行き詰まっているからといってECMAScriptのバージョンアップが停滞するのはやはりよろしくありません。

そこで、ES2015以上のバージョンアップにおいては、追加したい機能は細かい提案 (proposal) に分割され、個別に議論していくことになりました。議論が完了して完成した提案から順次ECMAScriptに組み込まれていきます。1年ごとのバージョンアップによってECMAScriptに追加されるのは、その1年の間に完成した提案の中身なのです。

例えば、前回紹介したasync/awaitもひとつの提案でした。また、Object.entriesとObject.valuesもまた別の提案でした。これらは両方ともES2016が出てからES2017が出るまでの間に完成したため、ES2017に追加されたわけです。

そして、各提案に対する議論を主導するのがTC39です。これはECMA Internationalに属する委員会のひとつで、ECMAScriptの標準化を担当しています。

各提案は、ステージ0からステージ4までの5段階に区分されます。ステージ0はまだ正式な提案となっていない有象無象で、ステージ4は完成した提案です。提案がステージ4になると、それは次のECMAScriptに追加されることになります。

提案が上のステージに上昇するにはTC39による認可が必要です。このシステムによりTC39は提案の発展を主導しているのです。

ざっくり言えば、ステージ1はアイデア段階です。ステージ0の何かが提案たりえるとTC39に認められればステージ1になります。そして、提案がある程度仕様として形がまとまるとステージ2に上がります。さらに細かいところを詰めて仕様としてほぼ完成するとステージ3になります。実は、ステージ3に上がった提案は、まだ正式にECMAScriptの仕様となったわけではありませんが、徐々にブラウザ等に実装され始めます。実際に実装してみて問題がなさそうなことを確認しないとステージ4には上がれないのです。順番が逆という気もしますが、使えないものをECMAScript標準に加えるわけにもいかないので仕方ありません。

逆に言えば、ステージ3まで上がった提案はECMAScriptへの正式採用が間近ということです(それでも平気で1年以上ステージ3で留まったりしますが)。

もうほとんど最新鋭のJavaScriptまで学んでしまった皆さんは、さらに先を知りたければこのような提案を見て回るとよいでしょう。特にステージ3の提案はほぼそのままの形で仕様となる可能性が高いですから、見ておくと予習になります。この講座は中級講座なので仕様を直に読めとはいいませんが、そのような提案は新しい文法や機能を例を通して説明してあるので十分理解できると思います。ただし、もちろん提案は全て英語で書かれています。

提案はGitHubのtc39/proposalsリポジトリにあります。Finished Proposals(終了した提案たち)を見ると既にレベル4になった提案も見ることができます。すでにこの講座で紹介済みの機能の提案も見ることができるでしょう。

以上で仕様策定プロセスの話は終わりです。これでこれからのJavaScriptの発展にもついていけるでしょう(もちろん新しい機能の解説はこの講座にも追加していきますが)。

そしてこの章もついに終わりです。ただし、これでJavaScriptの学習は終わりではありません。皆さんはJavaScript自体の言語機能はほぼ網羅してしまいましたが、DOMを始めとする、ウェブアプリケーションなどを作るのに必要なAPIはまだ解説していないことがたくさんあります。今後はそのようなものを解説していきます。