Релиз V8 версии 7.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%.
Особенности языка 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 и вскоре попробовать новые функции самостоятельно.