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

Релиз V8 версии 7.3

· 3 мин. чтения
Клеменс Бакес, мастер компиляции

Каждые шесть недель мы создаем новую ветку V8 в рамках нашего процесса релиза. Каждая версия создается из главной ветки Git V8 незадолго до достижения этапа бета-версии Chrome. Сегодня мы рады сообщить о нашей новой ветке, версии V8 7.3, которая находится в стадии бета-тестирования до выпуска в стабильной версии Chrome 73 через несколько недель. V8 версии 7.3 наполнен разнообразными улучшениями для разработчиков. Этот пост представляет некоторую информацию о главных новинках в преддверии выпуска.

Асинхронные трассировки стека

Мы включаем флаг --async-stack-traces по умолчанию. Асинхронные трассировки стека с нулевой стоимостью упрощают диагностику проблем в производственном коде, насыщенном асинхронными операциями, так как свойство error.stack, которое обычно отправляется в журналы/сервисные логи, теперь предоставляет больше сведений о причинах проблемы.

Ускоренный await

В связи с вышеупомянутым флагом --async-stack-traces, мы также включаем по умолчанию флаг --harmony-await-optimization, который является предварительным условием для --async-stack-traces. Подробнее читайте в разделе ускоренные асинхронные функции и обещания.

Ускоренный запуск Wasm

Благодаря оптимизациям внутри Liftoff, мы значительно улучшили скорость компиляции WebAssembly без ухудшения качества сгенерированного кода. Для большинства рабочих нагрузок время компиляции сократилось на 15–25%.

Время компиляции Liftoff на демо Epic ZenGarden

Особенности языка JavaScript

Версия V8 v7.3 включает несколько новых функций языка JavaScript.

Object.fromEntries

API Object.entries не является чем-то новым:

const object = { x: 42, y: 50 };
const entries = Object.entries(object);
// → [['x', 42], ['y', 50]]

К сожалению, до сих пор не было простого способа преобразовать результат entries обратно в эквивалентный объект… до сих пор! В версии V8 v7.3 добавлена поддержка Object.fromEntries(), нового встроенного API, который выполняет обратную операцию для Object.entries:

const result = Object.fromEntries(entries);
// → { x: 42, y: 50 }

Для получения дополнительной информации и примеров использования см. объяснение функции Object.fromEntries.

String.prototype.matchAll

Один из распространенных вариантов использования глобальных (g) или липких (y) регулярных выражений — применять их к строке и перебирать все совпадения. Новый API String.prototype.matchAll упрощает это как никогда прежде, особенно для регулярных выражений с группами захвата:

const string = 'Любимые репозитории на GitHub: tc39/ecma262 v8/v8.dev';
const regex = /\b(?<owner>[a-z0-9]+)\/(?<repo>[a-z0-9\.]+)\b/g;

for (const match of string.matchAll(regex)) {
console.log(`${match[0]} на ${match.index} из '${match.input}'`);
console.log(`→ владелец: ${match.groups.owner}`);
console.log(`→ репозиторий: ${match.groups.repo}`);
}

// Вывод:
//
// tc39/ecma262 на 23 из 'Любимые репозитории на GitHub: tc39/ecma262 v8/v8.dev'
// → владелец: tc39
// → репозиторий: ecma262
// v8/v8.dev на 36 из 'Любимые репозитории на GitHub: tc39/ecma262 v8/v8.dev'
// → владелец: v8
// → репозиторий: v8.dev

Для более подробной информации прочитайте объяснение функции String.prototype.matchAll.

Atomics.notify

Atomics.wake был переименован в Atomics.notify, в соответствии с последними изменениями спецификации.

API V8

Используйте git log branch-heads/7.2..branch-heads/7.3 include/v8.h, чтобы получить список изменений API.

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