Matheus Castiglioni

Desconstruindo a Web: Como a V8 Funciona?

Continuando a série sobre posts’s explicando um pouco como as coisas funcionam por debaixo dos panos no desenvolvimento web, esse é o quinto post da série, caso você tenha perdido e queira ver os anteriores:

Nesse post vamos falar um pouco sobre a V8, ou seja, o que ela é, o que ela faz, como ela funciona, etc…

O que é V8?

Antes de mais nada, o que é essa tal de V8? A V8 é um motor JavaScript de código aberto (open source), basicamente ela é a responsável por executar nossos códigos JavaScript dentro do navegador Google Chrome, ou seja, ela irá ler os códigos que escrevemos e compilar para byte code.

Todo navegador possuí um motor JavaScript, a V8 é referente ao Google Chrome, mas, existem outros motores para os demais navegadores:

Mas, como eles fazem para rodar nossos códigos JavaScript?

Como o JavaScript é lido?

O primeiro passo será obter o código JavaScript, isso é feito através de tags especiais, no caso de arquivos e códigos JavaScript, a tag especial é script.

Quando o browser (navegador) lê uma tag script ele sabe que precisa lidar com códigos JavaScript, o primeiro passo será baixá-lo (caso seja uma fonte externa) ou executá-lo.

Uma vez que o browser tem acesso aos códigos JavaScript (seja após o download ou leitura da tag script), é hora de lê-lo e executá-lo. Nesse momento que entre em cena os motores JavaScript dos navegadores.

Entendendo como os motores funcionam

Agora que o motor foi acionado, o mesmo irá passar por alguns passos até gerar os bytes codes, sendo eles:

  1. Pegar o código JavaScript.
  2. Parsear o JavaScript.
  3. Montar a AST.
  4. Interpretar a AST.
  5. Gerar o bytecode.

Podemos ver o fluxo ilustrado na imagem abaixo:

Fluxo da V8

Vamos dar uma passada por cada um dos passos:

Pegar o código JavaScript

Nesse momento é realizada a leitura o código JavaScript, o mesmo é obtido como vimos anteriormente, através da tag script.

Parsear o JavaScript

Nesse momento será feito um parseamento do JavaScript, durante o processo de parser é feito uma análise lexa e tokenização.

A ideia é buscar por palavras reservadas em nossos códigos JavaScript, ou seja, procurar por if, class, const, function, etc…

Uma vez que essas palavras (tokens) forem encontradas, o parser sabe do que se trata, exemplo:

const nome = 'Matheus'

No trecho de código acima, o parser sabe que trata-se de uma declaração de variável. Isso porque ele rodou sua análise e identificou a palavra reservada const (onde const é um token).

Montar a AST

Uma vez que o parseamento está finalizado, uma AST (Árvore de Sintaxe Abstrata) é criada.

A AST é uma árvore onde será definido o que cada trecho de código está fazendo, por exemplo:

Exemplo de AST da V8

Veja que no exemplo acima temos o seguinte código:

var hi = 'Hello' + 'World'

Uma simples declaração e criação de variável com uma String concatenada que será igual á Hello World.

Repare que esse pequeno trecho de código montou sua AST, onde temos VariableDeclarator (declaração de variável), Identifier (nome da variável) e StringLiteral (o texto da variável).

Interpretar a AST

Após criar e montar a AST, será a hora de passar pelo interpretador da V8, ele será o responsável por ler a AST e gerar o byte code necessário para ela.

Gerar o bytecode

Após o interpretador ser executado devemos ter nosso byte code.

Por fim, podemos ter o seguinte byte code para um simples código JavaScript:

Byte code de um código JavaScript

Saiba mais

Caso você tenha mais curiosidade sobre o assunto, sugiro criar um arquivo .js qualquer, por exemplo v8.js com o seguinte conteúdo:

const nome = 'Matheus'
console.log(nome)

E pedir para o Node interpretar e executar nosso arquivo:

node v8

Obs: A extensão .js é opcional.

Será impresso Matheus no terminal, porém, podemos pedir para o Node imprimir o byte code gerado para esse arquivo, isso pode ser feito com o parâmetro --print-bytecode:

node --print-bytecode v8

E aproveite a leitura.

Conclusão

Nesse post vimos o que são os motores de JavaScript e qual suas importâncias para os navegadores. Também vimos como o motor JavaScript do Google Chrome chamado V8 faz parar ler um código JavaScript e gerar seu byte code.

E aí, você já conhecia a V8? Não deixe de comentar.

Abraços, até a próxima.

Referências

Matheus Castiglioni

Matheus Castiglioni

Apaixonado pelo mundo dos códigos e um eterno estudante, gosto de aprender e saber um pouco de tudo, aquela curiosidade de saber como tudo funciona, tento compartilhar o máximo de conhecimentos adquiridos e ajudar todos aqueles que sou capaz.

comments powered by Disqus