V8リリース v5.1
V8のリリースプロセスの最初のステップは、ChromiumがChrome Betaマイルストーン(約6週間ごと)のために分岐を行う直前に、Gitのマスターから新しいブランチを作成することです。我々の最新のリリースブランチはV8 v5.1であり、Chrome 51 Stableと連携して安定版をリリースするまでベータ版の状態を維持します。このバージョンのV8における開発者向けの新機能のハイライトをご紹介します。
ECMAScriptサポートの向上
V8 v5.1には、ES2017ドラフト仕様の準拠に向けた多くの変更が含まれています。
Symbol.species
例えば、Array.prototype.mapのような配列メソッドは、その出力としてサブクラスのインスタンスを構築しますが、Symbol.speciesを変更してこれをカスタマイズすることが可能です。同様の変更が他の組み込みクラスにも適用されています。
instanceofのカスタマイズ
コンストラクタは、独自のSymbol.hasInstanceメソッドを実装でき、デフォルトの動作をオーバーライドすることができます。
イテレータのクローズ処理
for-ofループ(またはスプレッド演算子のような他の組み込みイテレーション)の一部として作成されたイテレータは、ループが早期終了した場合にクローズメソッドが呼び出されるようにチェックされるようになりました。これにより、イテレーション終了後のクリーンアップが可能です。
RegExpサブクラスのexecメソッド
RegExpサブクラスは、execメソッドをオーバーライトして、コアのマッチングアルゴリズムを変更できます。これにより、String.prototype.replaceのような高レベルの関数が呼び出されることが保証されます。
関数名推論
関数式に推論された関数名が、通常nameプロパティに反映されるようになり、ES2015でのこれらのルールの形式化に従っています。この変更は、既存のスタックトレースに影響を与える可能性があり、過去のV8バージョンと異なる名前が付けられる場合があります。また、計算されたプロパティ名を持つプロパティやメソッドにも有用な名前が付けられます。
class Container {
...
[Symbol.iterator]() { ... }
...
}
const c = new Container;
console.log(c[Symbol.iterator].name);
// → '[Symbol.iterator]'
Array.prototype.values
valuesメソッドは、他のコレクションタイプと同様に、配列の内容を反復するイテレータを返します。
パフォーマンスの向上
V8 v5.1では、以下のJavaScriptの機能にいくつかの注目すべきパフォーマンス改良をもたらしました。
for-inのようなループの実行Object.assign- PromiseおよびRegExpのインスタンス化
Object.prototype.hasOwnPropertyの呼び出しMath.floor、Math.round、およびMath.ceilArray.prototype.pushObject.keysArray.prototype.joinおよびArray.prototype.toString- 文字列の繰り返しのフラット化(例:
'.'.repeat(1000))
WebAssembly(Wasm)
V8 v5.1ではWebAssemblyの初期サポートが導入されました。d8で--expose_wasmフラグを有効にすることで使用できます。また、Chrome 51(ベータチャネル)でWasmデモを試すことも可能です。
メモリ
V8はOrinocoのさらなるスライスを実装しました:
- パラレルな若い世代のエバキュエーション
- スケーラブルなリメンバードセット
- ブラックアロケーション
これにより、必要に応じてジャンクを削減し、メモリ消費量を削減する効果があります。
V8 API
API変更の概要をご確認ください。この文書は、各主要リリースの数週間後に定期的に更新されます。
アクティブなV8リポジトリを持つ開発者は、git checkout -b 5.1 -t branch-heads/5.1を使用してV8 v5.1の新機能を試すことができます。また、Chromeのベータチャネルに登録して、新機能を自分で試すことも可能です。