Релиз V8 версии 8.4
Каждые шесть недель мы создаем новую ветку V8 в рамках нашего процесса релиза. Каждая версия создается из основной ветки Git V8 незадолго до достижения Chrome Beta. Сегодня мы рады объявить о нашей новой ветке V8 версия 8.4, которая будет находиться в бета-тестировании до ее выпуска вместе со стабильной версией Chrome 84 через несколько недель. В версии V8 v8.4 полно полезных функций для разработчиков. В этом посте представлен предварительный обзор некоторых ключевых моментов перед выпуском.
WebAssembly
Ускоренное время запуска
Базовый компилятор WebAssembly (Liftoff) теперь поддерживает атомарные операции и массовые операции с памятью. Это значит, что даже если вы используете эти недавние изменения спецификации, вы получите чрезвычайно быстрое время запуска.
Улучшенная отладка
В рамках постоянных усилий по улучшению отладки в WebAssembly мы теперь можем инспектировать любой кадр WebAssembly, который находится в памяти, каждый раз, когда вы останавливаете выполнение или достигаете точки останова. Это стало возможным благодаря повторному использованию Liftoff для отладки. Раньше весь код с точками останова или при пошаговом выполнении нужно было интерпретировать, что значительно замедляло выполнение (зачастую примерно в 100 раз). С Liftoff вы теряете всего около трети производительности, но при этом можете пошагово проходить весь код и исследовать его в любое время.
Испытание SIMD
Предложение SIMD позволяет WebAssembly использовать широко доступные аппаратные векторные инструкции для ускорения вычислительно интенсивных задач. V8 имеет поддержку для предложения WebAssembly SIMD. Чтобы включить это в Chrome, используйте флаг chrome://flags/#enable-webassembly-simd
или зарегистрируйтесь для испытания в Origin. Испытания Origin позволяют разработчикам экспериментировать с функцией перед ее стандартизацией и предоставлять ценную обратную связь. После того, как Origin включен в испытание, пользователи автоматически получают доступ к функции на период действия испытания без необходимости обновлять флаги Chrome.
JavaScript
Слабые ссылки и финализаторы
Внимание! Слабые ссылки и финализаторы — это продвинутые функции! Они зависят от поведения сборщика мусора. Сборка мусора является недетерминированной и может не происходить вовсе.
JavaScript — это язык со сборкой мусора, что означает, что память, занимаемая объектами, которые больше недостижимы для программы, может автоматически освобождаться, когда запускается сборщик мусора. За исключением ссылок в WeakMap
и WeakSet
, все ссылки в JavaScript являются сильными и предотвращают сборку мусора для объекта. Например:
const globalRef = {
callback() { console.log('foo'); }
};
// Пока globalRef доступен через глобальную область видимости,
// ни он, ни функция в его свойстве callback не будут собраны сборщиком мусора.
Теперь программисты на JavaScript могут слабо удерживать объекты через функцию WeakRef
. Объекты, на которые имеются слабые ссылки, не препятствуют их сборке мусора, если они не имеют сильных ссылок.
const globalWeakRef = new WeakRef({
callback() { console.log('foo'); }
});
(async function() {
globalWeakRef.deref().callback();
// Выводит “foo” в консоль. globalWeakRef гарантированно будет жив
// в первый цикл обработки событий после его создания.
await new Promise((resolve, reject) => {
setTimeout(() => { resolve('foo'); }, 42);
});
// Ожидание одного цикла обработки событий.
globalWeakRef.deref()?.callback();
// Объект внутри globalWeakRef может быть собран сборщиком мусора
// после первого цикла, так как он больше недостижим.
})();
Сопутствующей функцией к WeakRef
является FinalizationRegistry
, которая позволяет программистам регистрировать обратные вызовы, вызываемые после сбора мусора объекта. Например, следующая программа может вывести 42
в консоль после того, как недостижимый объект в IIFE будет собран.
const registry = new FinalizationRegistry((heldValue) => {
console.log(heldValue);
});
(function () {
const garbage = {};
registry.register(garbage, 42);
// Второй аргумент — это “удерживаемое” значение, которое передается
// в финализатор, когда первый аргумент собирается сборщиком мусора.
})();
Финализаторы планируются для выполнения в цикле событий и никогда не прерывают синхронное выполнение JavaScript.
Это сложные и мощные функции, и, с большой вероятностью, вашей программе они не понадобятся. Пожалуйста, ознакомьтесь с нашим объяснением, чтобы узнать больше о них!
Приватные методы и аксессоры
Приватные поля, которые появились в версии 7.4, были дополнены поддержкой приватных методов и аксессоров. Синтаксически имена приватных методов и аксессоров начинаются с #
, как и у приватных полей. Вот краткий пример синтаксиса.
class Component {
#privateMethod() {
console.log("Я доступен только внутри Component!");
}
get #privateAccessor() { return 42; }
set #privateAccessor(x) { }
}
Приватные методы и аксессоры имеют те же правила области видимости и семантику, что и приватные поля. Пожалуйста, ознакомьтесь с нашим объяснением, чтобы узнать больше.
Спасибо Igalia за вклад в реализацию!
API V8
Пожалуйста, используйте git log branch-heads/8.3..branch-heads/8.4 include/v8.h
, чтобы получить список изменений в API.
Разработчики, имеющие активную копию V8, могут использовать git checkout -b 8.4 -t branch-heads/8.4
, чтобы поэкспериментировать с новыми функциями в V8 версии 8.4. Или вы можете подписаться на бета-канал Chrome и вскоре попробовать новые функции самостоятельно.