Windows Internet Explorer 9 |
標準規約に準拠したアプリケーションを開発することは互換性という面で重要だが、それが必ずしも現実に則しているとは言いがたいこともある。また、標準規約に誤りがあり矛盾した記述がなされていることや、問題を先送りにして規約として説明していないもの、そもそも標準化されていないものなどもある。開発者はこうした「規約」と「現実」という2つの側面を見ながら、ほかのアプリケーションと互換性が高く標準規約へも準拠しつつ、さらに現実の問題に対処できる実装という「落とし所」を見つけなければならない。
IEBlogにおいてChakra: Interoperability Means More Than Just Standardsのタイトルのもと、IE9の新しいJavaScriptエンジンChakraを開発するにあたって、こうした標準規約と現実との乖離を加味しつつ、どういった決定をおこなって仕様が曖昧な部分や問題が発生する部分の実装方針を決定したかが紹介されている。どういった判断基準で開発を進めているのかがわかり参考になる。紹介されている事例は次の4つ。
1. 標準規約採用を見送ったケース: 正規表現
ECMAScript 5 (ES5)仕様では次の表記の正規表現はエラーとして処理される。]の表記は\]のようにエスケープして使わなければならない。しかしほかのブラウザでは次の表記でも意図通りに動作する。先に[が記載されていない場合、]が[と組み合わせて使われる指定ではなく、]単体で使われることが明確にわかるためだ。
next = /]/.exec(buffer);
IE9ではほかのブラウザと同じように]単体の表記はエスケープしなくても利用できるように実装。こうした記述を採用したページが多く、ES5に従った実装を採用すると動作しなくなるサイトが多いためだと理由を紹介している。将来のバージョンのES5でこの記述が正式なものとして採用されるように働きかけていくと説明がある。
2. 標準規約を優先したケース: ゲッタメソッドとセッタメソッド
ES5以前ではゲッタメソッドとセッタメソッドの実装に__defineGetter__と__defineSetter__が使われている。TC39はこの表記をES5で採用するかどうか検討した結果、ゲッタメソッドとセッタメソッドは採用するものの、表記は別のものを採用することに決定した。これは__*__実装を標準規約にすると、規約の内容に準拠するためにブラウザの実装を変更する必要が生まれ、これまで__*__を使って動作していたコードが動作しなくなるため、これを防ぐ狙いがある。
IE9は__*__の実装は見送り、ES5で規定されるObject.definePropertyのみを採用。IE9における__*__メソッドの実装要望は多いが、将来の互換性を考えると現在完璧な互換性が実現していない__*__をサポートすることは将来に禍根を残すものとしてサポートしないとしている。
3. 従来の実装を踏襲したケース: 関数宣言の位置
ES5では制御構文内における関数の定義をサポートしていない。制御構文の中で関数定義を実施すると、その結果としてさまざまな挙動が考えられ、実装に互換性を持たせることが難しいためだとしている。IE9はこの規約をそのまま取り込まずに、IE8以前と同じ実装のままにしておく方針を採用。これはすでに制御構文内で関数定義を実施しているJavaScriptコードが多すぎるためで、この機能をサポートしないと現実にサイトの多くが動作しなくなるためだという。規約に従うことは重要だが、すでにそこにあるものの方が優先されるわけで、これにはほとんど選択の余地がないと説明している。
4. サポートを見送ったケース: const
ほかのブラウザは定数を宣言するためのconst指定をサポートしている。IE9ではこれをサポートしないことに決定。これはconstに関する既存のブラウザの挙動がばらばらであり、TC39でも標準規約として取り込むことにまだ慎重な姿勢をみせているためだという。たとえば同じ名前の変数にconst指定した場合、ブラウザによって次のように別々の動作をみせるという。
- シンタックスエラーとみなしローディングを実施しない。
- 関数がコールされた段階で例外を発生する。
- 定数の上書きは成功し、変数としての上書きは処理しない。
- ただの変数として処理する。
Chakra: Interoperability Means More Than Just Standardsの説明を読む限りでは、基本的には標準規約を優先する方針を見せつつ、それが現実に沿わない場合にはほかのブラウザとの互換性や将来性、現実に必要不可欠な機能であるかどうかなどを加味して文脈ごとに採用の可否を判断していることがわかる。