V8リリースv9.2
V8では、リリースプロセスの一環として、6週間ごとに新しいブランチを作成しています。各バージョンは、Chrome Betaマイルストーン直前にV8のGitマスターから分岐されます。本日、最新のブランチV8バージョン9.2を発表します。このバージョンはChrome 92 Stableとの調整後、数週間後にリリースされる予定ですが、それまではベータ版です。V8 v9.2は開発者向けのさまざまな機能を備えています。この投稿では、リリースを期待してハイライトを紹介します。
JavaScript
at
メソッド
新しいat
メソッドが、配列、TypedArray、そして文字列で利用可能になりました。負の値を渡すと、インデックス可能なものの終端からの相対インデックス付けを行います。正の値を渡した場合、プロパティアクセスと同様の動作をします。例えば、[1,2,3].at(-1)
は3
です。詳細は解説記事をご覧ください。
共有ポインタ圧縮ケージ
V8は、x64やarm64を含む64ビットプラットフォームでポインタ圧縮をサポートしています。これは64ビットポインタを2つの部分に分割することで実現されています。上位32ビットはベースと見なされ、下位32ビットはそのベースへのインデックスと見なされます。
|----- 32 bits -----|----- 32 bits -----|
Pointer: |________base_______|_______index_______|
現在、IsolateはすべてのメモリアロケーションをGCヒープ内の4GB仮想メモリ「ケージ」で実行します。これにより、すべてのポインタが同じ上位32ビットのベースアドレスを持つことが保証されます。ベースアドレスが一定であるため、64ビットポインタは32ビットインデックスのみを使用して渡すことができ、完全なポインタを再構築できます。
v9.2から、デフォルト設定が変更され、プロセス内のすべてのIsolateが同じ4GB仮想メモリケージを共有するようになりました。これは、JSにおける実験的な共有メモリ機能のプロトタイプを行うことを想定して行われました。それぞれのワーカースレッドが独自のIsolateを持ち、それにより独自の4GB仮想メモリケージを持つ場合、ポインタは異なるIsolate間では共有できませんでした。この変更は、ワーカーを起動する際の仮想メモリへの負荷を軽減するという追加の利点もあります。
この変更のトレードオフとして、プロセス内のすべてのスレッドでのV8ヒープサイズが最大4GBに制限されます。この制限は、プロセスごとに多くのスレッドを生成するサーバー向けワークロードにとっては望ましくない場合があります。その場合、仮想メモリが以前より早く枯渇します。埋め込み側は、GN引数v8_enable_pointer_compression_shared_cage = false
を使用してポインタ圧縮ケージの共有を無効にすることができます。
V8 API
git log branch-heads/9.1..branch-heads/9.2 include/v8.h
を使用して、API変更のリストを取得してください。
アクティブなV8チェックアウトを持つ開発者は、git checkout -b 9.2 -t branch-heads/9.2
を使用してV8 v9.2の新機能を試験的に使用できます。または、ChromeのBetaチャンネルに登録し、近日中に新しい機能を試してみることも可能です。