Algumas semanas atrás nós começamos uma série que visa aprofundar-se mais no JavaScript e como ele realmente funciona: nós pensamos que, ao conhecer os blocos de construção de JavaScript e como eles vêm para jogar juntos, você será capaz de escrever código melhor e aplicações.,
A primeira postagem da série focada em fornecer uma visão geral do motor, o tempo de execução e a pilha de chamadas. Este segundo post será mergulhar nas partes internas do motor JavaScript V8 do Google. Nós também forneceremos algumas dicas rápidas sobre como escrever melhor código JavaScript —melhores práticas que nossa equipe de desenvolvimento da SessionStack segue ao construir o produto.
visão geral
um motor JavaScript é um programa ou um interpretador que executa o código JavaScript., Um motor JavaScript pode ser implementado como um interpretador padrão, ou compilador just-in-time que compila JavaScript para bytecode de alguma forma.,/li>
SpiderMonkey — o primeiro motor de JavaScript, que em dias alimentado Netscape Navigator, e hoje poderes Firefox
JavaScriptCore — fonte aberto, comercializado como Nitro e desenvolvido pela Apple para o Safari
KJS — KDE motor originalmente desenvolvido por Harri Porten para o projeto KDE do Konqueror web browser
Chakra (JScript9) — Internet Explorer
Chakra (JavaScript) — Microsoft Borda
Nashorn, de fonte aberta como parte do OpenJDK, escrito pela Oracle Java Idiomas e Grupo de ferramentas
JerryScript — é um leve motor para a Internet das Coisas.,
por que o motor V8 foi criado?
o motor V8 que é construído pelo Google é de código aberto e escrito em C++. Este motor é usado dentro do Google Chrome. Ao contrário do resto dos motores, no entanto, V8 também é usado para o nó popular.js runtime.
V8 foi o primeiro projetado para aumentar o desempenho da execução do JavaScript dentro de navegadores da web., A fim de obter velocidade, V8 traduz código JavaScript em código máquina mais eficiente em vez de usar um interpretador. Ele compila código JavaScript em código de máquina na execução, implementando um compilador JIT (Just-In-Time) como um monte de motores JavaScript modernos fazem como SpiderMonkey ou Rhino (Mozilla). A principal diferença aqui é que V8 não produz bytecode ou qualquer código intermediário.
V8 usado para ter dois Compiladores
antes da versão 5.,9 of V8 came out (released earlier this year), the engine used two compilers:
full-codegen — a simple and very fast compiler that produced simple and relatively slow machine code.
Cambota – um compilador mais complexo (Just-In-Time) otimizando que produziu código altamente otimizado.,l>
O thread principal não é o que você esperaria: buscar o seu código, compilá-lo e executá-lo
Há também um thread separado para compilar, para que o thread principal pode manter em execução enquanto a primeira é a otimização de código
Um Profiler thread que vai dizer o tempo de execução em que os métodos de nós gastamos um monte de tempo para que a Cambota podem otimizá-los
algumas threads para lidar com Coletor de Lixo varre
Quando a primeira-a execução de código JavaScript V8 aproveita completo codegen que se traduz diretamente analisada JavaScript em código de máquina, sem qualquer transformação., Isso permite que ele comece a executar o código da máquina muito rápido. Note que V8 não usa representação intermediária bytecode desta forma removendo a necessidade de um interpretador.
Quando o seu código está em execução há algum tempo, a thread do profiler recolheu dados suficientes para dizer qual o método que deve ser otimizado.
A seguir, as otimizações do virabrequim começam em outra linha. Ele traduz a árvore de sintaxe abstrata de JavaScript para uma representação estática de alto nível chamada hidrogênio e tenta otimizar esse grafo de hidrogênio. A maioria das otimizações são feitas neste nível.,
Inlining
The first optimization is inlining as much code as possible in advance. Inlining é o processo de substituição de um site de chamada (a linha de código onde a função é chamada) com o corpo da função chamada. Este passo simples permite que seguir otimizações seja mais significativo.
Oculto classe
o JavaScript é uma linguagem baseada em protótipos: não existem classes e objetos são criados usando um processo de clonagem., JavaScript é também uma linguagem de programação dinâmica que significa que as propriedades podem ser facilmente adicionadas ou removidas de um objeto após sua instanciação.
a maioria dos intérpretes JavaScript usam estruturas como dicionário (baseado na função hash) para armazenar a localização dos valores de propriedade do objeto na memória. Esta estrutura torna a recuperação do valor de uma propriedade em JavaScript mais computacionalmente cara do que seria em uma linguagem de programação Não-dinâmica como Java ou C#., Em Java, todas as propriedades do objeto são determinadas por um layout de objeto fixo antes da compilação e não podem ser adicionadas ou removidas dinamicamente em tempo de execução (bem, C# tem o tipo dinâmico que é outro tópico). Como resultado, os valores de Propriedades (ou ponteiros para essas propriedades) podem ser armazenados como um buffer contínuo na memória com um deslocamento fixo entre cada um. O comprimento de um deslocamento pode ser facilmente determinado com base no tipo de propriedade, enquanto que isso não é possível em JavaScript onde um tipo de propriedade pode mudar durante o tempo de execução.,
Uma vez que usar dicionários para encontrar a localização das propriedades do objeto na memória é muito ineficiente, V8 usa um método diferente em vez disso: classes ocultas. Classes ocultas funcionam da mesma forma que os layouts de objetos fixos (classes) usados em linguagens como Java, exceto que eles são criados em tempo de execução. Agora, vamos ver como eles realmente se parecem:
function Point(x, y) { this.x = x; this.y = y; }var p1 = new Point(1, 2);
Uma vez que o “novo ponto(1, 2)” invocação acontece, V8 irá criar uma classe escondida chamada “C0”.,
propriedades foram definidas para o Ponto ainda, assim, “C0” é vazio.
Once the first statement “this.x = x “é executado (dentro da função “Ponto”), V8 irá criar uma segunda classe escondida chamada” C1 “que é baseada em”C0”. “C1″ descreve a localização na memória (em relação ao ponteiro do objeto) onde a propriedade x pode ser encontrada., Neste caso, ” x “é armazenado no deslocamento 0, o que significa que ao ver um objeto ponto na memória como um buffer contínuo, o primeiro deslocamento corresponderá à propriedade”x”. V8 também irá atualizar ” C0 “com uma” transição de classe “que afirma que se uma propriedade” x “é adicionada a um objeto ponto, a classe escondida deve mudar de” C0 “para”C1”. A classe escondida para o objeto ponto abaixo é agora “C1”.,