メインコンテンツまでスキップ

V8リリース v7.5

· 約5分
Dan Elphick, 廃止された機能の恐怖

6週間ごとに、V8の新しいブランチをリリースプロセスの一環として作成します。各バージョンは、Chromeのベータ版マイルストーン直前にV8のGitマスターからブランチされます。本日、最新のブランチであるV8バージョン7.5を発表できることを嬉しく思います。このバージョンは、数週間後にChrome 75 Stableと連動してリリースされるまでベータ版です。V8 v7.5は、開発者向けのあらゆる機能が盛り込まれています。本投稿では、リリースに先立ち、いくつかの注目点を紹介します。

WebAssembly

暗黙的キャッシュ

Chrome 75で、WebAssemblyコンパイルアーティファクトの暗黙的なキャッシュの展開を予定しています。これにより、同じページを2回目に訪れる際には、すでに見たWebAssemblyモジュールを再コンパイルする必要がなくなります。代わりに、それらはキャッシュから読み込まれます。これはChromiumのJavaScriptコードキャッシュに似ています。

V8埋め込みで同様の機能を使用したい場合は、Chromiumの実装を参考にしてください。

大量メモリ操作

大量メモリ提案は、メモリまたはテーブルの大きな領域を更新するための新しいWebAssembly命令を追加します。

memory.copyは、領域が重複していても、ある領域から別の領域へデータをコピーします(Cのmemmoveのように)。memory.fillは、指定されたバイトで領域を埋めます(Cのmemsetのように)。memory.copyと同様に、table.copyは1つのテーブル領域から別の領域にコピーします。これも領域が重複していても動作します。

;; 1000番地から500バイトを0番地にコピー
(memory.copy (i32.const 0) (i32.const 1000) (i32.const 500))

;; 100番地から1000バイトを値`123`で埋める
(memory.fill (i32.const 100) (i32.const 123) (i32.const 1000))

;; 5番地から15番地にテーブル要素10個をコピー
(table.copy (i32.const 15) (i32.const 5) (i32.const 10))

提案は、一定領域を線形メモリまたはテーブルにコピーする方法も提供します。そのためにはまず、「パッシブ」セグメントを定義する必要があります。「アクティブ」セグメントとは異なり、これらのセグメントはモジュール生成時に初期化されることはありません。代わりに、memory.inittable.init命令を使用して、メモリやテーブル領域にコピーすることができます。

;; パッシブデータセグメントを定義
(data $hello passive "Hello WebAssembly")

;; 10番地のメモリに"Hello"をコピー
(memory.init (i32.const 10) (i32.const 0) (i32.const 5))

;; 1000番地のメモリに"WebAssembly"をコピー
(memory.init (i32.const 1000) (i32.const 6) (i32.const 11))

JavaScriptでの数値セパレータ

大きな数値リテラルは、多くの繰り返し数字がある場合、目で素早く解析するのが困難です。

1000000000000
1019436871.42

読みやすさを向上させるために、新しいJavaScript言語機能は、数値リテラルでアンダースコアをセパレータとして有効にします。これにより、以下のように桁ごとに数字をグループ化できます:

1_000_000_000_000
1_019_436_871.42

これで、最初の数字が1兆であり、2番目の数字が約10億のオーダーであることを簡単に把握できます。

数値セパレータの他の例や追加情報については、解説を参照してください。

パフォーマンス

ネットワークからのスクリプトストリーミング

Chrome 75では、V8はネットワークからストリーミングパーサーにスクリプトを直接ストリーミングできるようになり、Chromeのメインスレッドを待つ必要がありません。

以前のChromeバージョンではストリーミング解析とコンパイルがありましたが、ネットワークからのスクリプトソースデータは、ストリーマーに転送される前に常にChromeのメインスレッドに到達する必要がありました。この理由は歴史的なものです。このため、多くの場合、ストリーミングパーサーは、すでにネットワークから届いたデータを待つことになる一方で、それはメインスレッド(HTML解析、レイアウト、他のJavaScript実行など)が原因でまだストリーミングタスクに転送されていませんでした。

Chrome 74以前では、バックグラウンド解析タスクが停止している

Chrome 75では、ネットワークの「データパイプ」を直接V8に接続することで、ネットワークデータを直接ストリーミング解析中に読み込むことが可能になり、メインスレッドへの依存がなくなりました。

Chrome 75以降、メインスレッドの活動によるバックグラウンド解析タスクのブロックがなくなった

これにより、ストリーミングコンパイルが早期に完了するようになり、ストリーミングコンパイルを使用するページの読み込み時間が改善されるほか、並行する(ただし停止している)ストリーミング解析タスクの数が減り、メモリ消費が削減されます。

V8 API

git log branch-heads/7.4..branch-heads/7.5 include/v8.h を使用してAPIの変更点を確認してください。

有効なV8チェックアウトを持つ開発者は、git checkout -b 7.5 -t branch-heads/7.5 を使用してV8 v7.5の新機能を試すことができます。または、Chromeのベータチャンネルに登録し、自分自身で新機能を試すこともできます。