GoogleのV8 JavaScriptエンジンの最新リリースであるV8 8.0は、ポインタ圧縮を採用することで、パフォーマンスを低下することなく、ヒープを40パーセントにまで削減している。?.
演算子を使用したOptional Chainingと、??
によるNullish Coalescenceも追加された。V8 v8.0はChromeバージョン80で正式に公開される。
V8 8.0では、ヒープやSmall Integerへのポインタ表現に使用されるJavaScript Tagged Valueの圧縮を行っている。64bit CPUのポインタ表現に必要な64bitすべてを用いる代わりに、下位bitのみを使用して、上位bitと合成する方法を採用した。ポインタ圧縮に関する具体的な方法は公開されていないが、このテクニックは、Javaなど他のプラットフォームでも使用されている。その基本的な概念は、メモリをバイト単位ではなくワード単位で管理する、という考え方だ。8byteのワードを使用する場合であれば、ロケーション0、7、15、23などから始まるアドレスを表現できればよい。アドレスの上位(または下位、基盤となるアーキテクチャに依存する)bitは、このシナリオでは常に0であるので、省略しても問題なく、ポインタサイズを削減することが可能になる。
この方法で重要なのは、V8チームによれば、ポインタ圧縮がパフォーマンスコストを伴わないことだ。この主張は、先に紹介したJavaで採用されている圧縮ポインタが、比較的高速なオペレーションであるビットシフトのみを伴うものである、という点から来ているものと思われる。V8のケースでは、ガベージコレクションの高速化という副次的なメリットもある。予備的なベンチマークによると、この変更を行ったV8 v8.0は、FacebookやCNN、Google Mapといった現実のWebサイトにおいて、モバイルおよびデスクトップデバイスのいずれも速度が向上している。
JavaScriptの面では、V8 v8.0ではOptional ChaniningとNullish Coalesceneという、2つの有用な構文規則のサポートが導入されている。
Optional Chaniningは、途中のオブジェクトがnull
あるいはundefined
であった場合に例外が発生するリスクを回避することで、プロパティへの直列的な参照を容易にするものだ。この種エラーの発生を避けるには、例えば次のコードのように、中間のプロパティがすべて正しく定義されていることを事前にチェックする必要がある。
if (resource && resource.address && resource.address.types)
return resource.address.types.length
Optional Chaining演算子?.
を使うことで、これを次のようなコードに置き換えることが可能になる。中間のコンポーネントがnull
またはundefined
であれば、式全体がundefined
に短絡化されることが保証される。
return resource?.address?.types?.length
Nullish Coalescence演算子??
は、次のようなコンテキストで使用される||
を改善するものだ。
let iterations = settings.iterations || 4;
上記の||
演算子には、設定しようとする値、上記の例であればsettings.iterations
がfalse
と評価される場合、例えばsettings.iterations==0
の場合には使用できない、というデメリットがある。この例では、結果としてデフォルト値、上記の式ならば4
が設定されることになる。Nullish Coalescing演算子??
を使用すれば、このようなケースにも対処することができる。例えば、
let iterations = settings.iterations ??4;
これによって、a??b
は、a
がnull
またはundefined
の場合のみb
と評価されるが、それ以外はa
と評価される。
V8 v8.0はまだ公式な安定版V8リリースではないが、数週間の内にChrome 80安定版とともに提供される予定である。現時点では、git checkout -b 8.0 -t branch-heads/8.0
を使えばアクセスできる。