Pular para o conteúdo principal

Lançamento do V8 v9.0

· Leitura de 4 minutos
Ingvar Stepanyan ([@RReverser](https://twitter.com/RReverser)), em linha contínua

A cada seis semanas, criamos uma nova ramificação do V8 como parte do nosso processo de lançamento. Cada versão é ramificada do Git master do V8 imediatamente antes de um marco beta do Chrome. Hoje temos o prazer de anunciar nossa nova ramificação, V8 versão 9.0, que está em beta até seu lançamento em coordenação com o Chrome 90 Stable nas próximas semanas. O V8 v9.0 está repleto de várias novidades para desenvolvedores. Este post fornece uma prévia de alguns destaques em antecipação ao seu lançamento.

JavaScript

Índices de correspondência RegExp

A partir da v9.0, os desenvolvedores podem optar por obter um array com as posições inicial e final dos grupos capturados nas correspondências de expressões regulares. Este array está disponível por meio da propriedade .indices nos objetos de correspondência quando a expressão regular possui a flag /d.

const re = /(a)(b)/d;      // Observe a flag /d.
const m = re.exec('ab');
console.log(m.indices[0]); // O índice 0 é a correspondência completa.
// → [0, 2]
console.log(m.indices[1]); // O índice 1 é o 1º grupo capturado.
// → [0, 1]
console.log(m.indices[2]); // O índice 2 é o 2º grupo capturado.
// → [1, 2]

Por favor, consulte nosso explicador para uma análise mais detalhada.

Acesso mais rápido à propriedade super

O acesso às propriedades super (por exemplo, super.x) foi otimizado usando o sistema de cache inline do V8 e a geração de código otimizada no TurboFan. Com essas mudanças, o acesso às propriedades super agora está mais próximo do acesso regular a propriedades, como pode ser visto nos gráficos abaixo.

Comparação do acesso às propriedades super com o acesso regular às propriedades, otimizado

Por favor, veja o post dedicado no blog para mais detalhes.

Proibição de for ( async of

Uma ambiguidade gramatical foi recentemente descoberta e corrigida no V8 v9.0.

Agora a sequência de tokens for ( async of não é mais analisada.

WebAssembly

Chamadas JS-para-Wasm mais rápidas

O V8 usa representações diferentes para os parâmetros das funções WebAssembly e JavaScript. Por essa razão, quando o JavaScript chama uma função exportada do WebAssembly, a chamada passa por uma chamada JS-to-Wasm wrapper, responsável por adaptar os parâmetros do JavaScript para o WebAssembly, bem como adaptar os resultados na direção oposta.

Infelizmente, isso traz um custo de desempenho, o que significava que as chamadas de JavaScript para WebAssembly não eram tão rápidas quanto as chamadas de JavaScript para JavaScript. Para minimizar essa sobrecarga, o wrapper JS-to-Wasm agora pode ser inline no local da chamada, simplificando o código e removendo este frame extra.

Digamos que temos uma função WebAssembly para somar dois números de ponto flutuante duplos, como esta:

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

e chamamos isso do JavaScript para somar alguns vetores (representados como arrays tipados):

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();
}

// Aqueça.
for (let i = 0; i < 5; i++) {
vectorSum(N, v1, v2);
}

// Meça.
console.time();
const result = vectorSum(N, v1, v2);
console.timeEnd();

Neste microbenchmark simplificado, vemos as seguintes melhorias:

Comparação de microbenchmarks

O recurso ainda é experimental e pode ser ativado através da flag --turbo-inline-js-wasm-calls.

Para mais detalhes, veja o documento de design.

API do V8

Por favor, utilize git log branch-heads/8.9..branch-heads/9.0 include/v8.h para obter uma lista das mudanças na API.

Os desenvolvedores com uma cópia ativa do V8 podem usar git checkout -b 9.0 -t branch-heads/9.0 para experimentar os novos recursos no V8 v9.0. Alternativamente você pode assinar o canal Beta do Chrome e experimentar os novos recursos em breve.