Há alguns anos o JavaScript era uma linguagem interpretada, porém, hoje, ela é compilada em tempo de execução através de um recurso chamado JIT (just-in-time) compilation. A leitura do JavaScript é realizada por engines, que são implementadas no desenvolvimento do Navegador, e elas possuem uma série de recursos, como a compilação JIT, para que isso seja feito de maneira eficiente.
A imagem abaixo exemplifica como ocorre esse processo.
A imagem abaixo exemplifica como ocorre esse processo.
Primeiramente, o navegador identifica o trecho em JavaScript e manda para a engine executá-lo, ela por sua vez manda o Source code para o Parser. Este pega o JavaScript e gera uma Abstract Syntax Tree (AST) dele, por exemplo:
//Código para atribuir à variável r o valor do próprio r vezes o valor antecessor de n.
var r = r * (n - 1);
O script acima teria como resultado do Parser, algo que pode ser representado visualmente assim:
Após isso o AST é transformado em um bytecode para ser lido pelo interpretador. Na interpretação entra a JIT, no qual os códigos são transformados em linguagem de máquina e já vão sendo executados. Os códigos que aparecem com frequência são armazenados na memoria para não terem que ser recompilados e quando não são mais utilizados com frequência o Garbage Collector apaga eles da memória. Isso deixa um pouco mais claro o porquê de alguns navegadores consumirem mais memória que outros, pois depende muito da implementação da engine.
Essa é uma visão geral de como funciona as engines, ou seja, esse processo não é fixo, podendo variar. Alguns exemplos de engines são:
Os navegadores seguem contam com o padrão do ECMAScript, o Ecma-262 para fazer a leitura de códigos JavaScript e com auxílio de sistemas como BOM (Browser Object Model) e DOM (Document Object Model), o primeiro é responsável pela interação do JavaScript com elementos próprios do navegador e o segundo com elementos próprios do HTML, para que o usuário tenha uma ótima experiência ao navegar em páginas desenvolvidas com JavaScript.

Após isso o AST é transformado em um bytecode para ser lido pelo interpretador. Na interpretação entra a JIT, no qual os códigos são transformados em linguagem de máquina e já vão sendo executados. Os códigos que aparecem com frequência são armazenados na memoria para não terem que ser recompilados e quando não são mais utilizados com frequência o Garbage Collector apaga eles da memória. Isso deixa um pouco mais claro o porquê de alguns navegadores consumirem mais memória que outros, pois depende muito da implementação da engine.
Essa é uma visão geral de como funciona as engines, ou seja, esse processo não é fixo, podendo variar. Alguns exemplos de engines são:
- Chackra (Internet Explorer),
- V8 (Google Chrome e Opera)
- SpiderMonkey (Firefox)
- Nitro (Safari).
Os navegadores seguem contam com o padrão do ECMAScript, o Ecma-262 para fazer a leitura de códigos JavaScript e com auxílio de sistemas como BOM (Browser Object Model) e DOM (Document Object Model), o primeiro é responsável pela interação do JavaScript com elementos próprios do navegador e o segundo com elementos próprios do HTML, para que o usuário tenha uma ótima experiência ao navegar em páginas desenvolvidas com JavaScript.
Se você estiver seguindo a cronologia de estudos do blog, esse conceito ficará mais claro em postagens mais adiante.


Nenhum comentário:
Postar um comentário