Перейти к основному содержимому

Версия V8 v9.0

· 4 мин. чтения
Ингвар Степанян ([@RReverser](https://twitter.com/RReverser)), на линии

Каждые шесть недель мы создаем новую ветку V8 в рамках нашего процесса релиза. Каждая версия отделяется от главной ветки Git V8 перед очередной бета-версией Chrome. Сегодня мы рады анонсировать нашу новую ветку, V8 версии 9.0, которая будет находится в бета-версии до выпуска вместе с Chrome 90 Stable через несколько недель. V8 v9.0 наполнена множеством нововведений для разработчиков. Этот пост предлагает предварительный обзор наиболее интересных моментов в ожидании релиза.

JavaScript

Индексы совпадений в RegExp

Начиная с версии 9.0, разработчики могут получать массив с начальными и конечными позициями захваченных групп в совпадениях регулярных выражений. Этот массив доступен через свойство .indices в объектах совпадений, если у регулярного выражения указан флаг /d.

const re = /(a)(b)/d;      // Обратите внимание на флаг /d.
const m = re.exec('ab');
console.log(m.indices[0]); // Индекс 0 - это полное совпадение.
// → [0, 2]
console.log(m.indices[1]); // Индекс 1 - это 1-я захваченная группа.
// → [0, 1]
console.log(m.indices[2]); // Индекс 2 - это 2-я захваченная группа.
// → [1, 2]

Пожалуйста, ознакомьтесь с нашим объяснением для более детального изучения.

Более быстрый доступ к свойствам super

Доступ к свойствам super (например, super.x) был оптимизирован с использованием системы кеша V8 и поколения оптимизированного кода в TurboFan. Благодаря этим изменениям, доступ к super свойствам теперь приближен к скорости доступа к обычным свойствам, что можно увидеть на графиках ниже.

Сравнение доступа к свойствам super с обычным доступом, оптимизировано

Пожалуйста, ознакомьтесь с посвященным блогу для получения дополнительных подробностей.

for ( async of недопустимо

Недавно была обнаружена двусмысленность в грамматике, которая была исправлена в V8 версии 9.0.

Последовательность for ( async of теперь больше не анализируется.

WebAssembly

Более быстрые вызовы JS-to-Wasm

V8 использует различные представления для параметров функций WebAssembly и JavaScript. Поэтому, когда JavaScript вызывает экспортированную функцию WebAssembly, вызов проходит через так называемый обертку JS-to-Wasm, которая адаптирует параметры из JavaScript и результаты в обратном направлении.

К сожалению, это сопровождалось затратами на производительность, из-за чего вызовы из JavaScript в WebAssembly были медленнее, чем вызовы из JavaScript в JavaScript. Для минимизации этого накладного расхода обертка JS-to-Wasm теперь может быть встроена прямо на месте вызова, упрощая код и устраняя этот дополнительный фрейм.

Предположим, у нас есть функция WebAssembly для сложения двух чисел с плавающей точкой двойной точности, как эта:

double addNumbers(double x, double y) {
return x + y;
}

и мы вызываем ее из JavaScript для сложения векторов (представленных как типизированные массивы):

const addNumbers = instance.exports.addNumbers;

function vectorSum(len, v1, v2) {
const result = new Float64Array(len);
for (let i = 0; i < len; i++) {
result[i] = addNumbers(v1[i], v2[i]);
}
return result;
}

const N = 100_000_000;
const v1 = new Float64Array(N);
const v2 = new Float64Array(N);
for (let i = 0; i < N; i++) {
v1[i] = Math.random();
v2[i] = Math.random();
}

// Прогрев.
for (let i = 0; i < 5; i++) {
vectorSum(N, v1, v2);
}

// Измерение.
console.time();
const result = vectorSum(N, v1, v2);
console.timeEnd();

На этом упрощенном микробенчмарке мы видим следующие улучшения:

Сравнение микробенчмарков

Эта функция все еще экспериментальная и может быть активирована с помощью флага --turbo-inline-js-wasm-calls.

Для подробной информации см. документ проектирования.

API V8

Пожалуйста, используйте git log branch-heads/8.9..branch-heads/9.0 include/v8.h, чтобы получить список изменений API.

Разработчики с активным гитом V8 могут использовать git checkout -b 9.0 -t branch-heads/9.0, чтобы опробовать новые функции в V8 версии 9.0. Также можно подписаться на бета-канал Chrome, чтобы вскоре попробовать новые функции самостоятельно.