V8リリース v7.5
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.init
やtable.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 75では、ネットワークの「データパイプ」を直接V8に接続することで、ネットワークデータを直接ストリーミング解析中に読み込むことが可能になり、メインスレッドへの依存がなくなりました。
これにより、ストリーミングコンパイルが早期に完了するようになり、ストリーミングコンパイルを使用するページの読み込み時間が改善されるほか、並行する(ただし停止している)ストリーミング解析タスクの数が減り、メモリ消費が削減されます。
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のベータチャンネルに登録し、自分自身で新機能を試すこともできます。