É do conhecimento geral que aplicativos Web modernos executam muito mais código JavaScript do que alguns anos atrás. Embora os compiladores tenham seguido rapidamente a tendência e tornado o JavaScript eficiente. No entanto, o Firefox 70 chegará com um interpretador JavaScript aprimorado para lidar com essa carga de trabalho ainda melhor.
Para fazer isso, a Mozilla desenvolveu e adicionou um novo interpretador de código de bytes JavaScript ao seu mecanismo de renderização JavaScript incorporado no Firefox 70.
Para atingir esse objetivo, a Mozilla explica que, nos modernos mecanismos JavaScript, cada função é inicialmente executada em um interpretador de código.
Funções que são chamadas de muito são compiladas no código de máquina nativo. Isso é chamado de compilação JIT ou compilação em tempo real. Quanto ao Firefox, ele também inclui um interpretador de código JavaScript escrito em C++ e vários níveis de compilação JIT.
Deve-se notar que, quando uma função que já está sendo compilada é chamada com um novo tipo de argumento, o código da função pode ser “desotimizado” e descartado. Nesse caso, a execução continua no código base até a próxima compilação de íons.
Embora esse processo de interpretação do código JavaScript tenha funcionado muito bem até agora, a equipe do Firefox explica que encontrou alguns problemas com a primeira parte que consiste no interpretador C++ e no compilador base JIT.
De fato, alguns aplicativos modernos da web, como o Google Docs ou o Gmail, executam tanto JavaScript que o compilador base e até o compilador JIT podem gastar muito tempo tentando compilar milhares de funções.
Além disso, o interpretador C++ tem sido muito lento e não coleta informações de tipo, o que atrasa a compilação básica. Uma solução seria removê-lo do encadeamento, mas isso seria um risco de desempenho.
O novo interpretador JavaScript do Firefox 70
Para resolver esses problemas, o pessoal da Mozilla comenta que:
O interpretador base está entre o interpretador C++ e o compilador JIT base e contém elementos de ambos os níveis.
Executar todas as instruções de código de bytes com um loop de intérprete fixo (como o interpretador C++) e usar técnicas de cache online para melhorar o desempenho e coletar informações de tipo (como faz o JIT básico).
Além disso, como os desenvolvedores do Firefox queriam que o interpretador de base usasse exatamente os mesmos caches online e as mesmas informações do JIT, uma nova estrutura de dados chamada JitScript foi adicionada.
O JitScript contém todas as informações de tipo e estruturas de dados de armazenamento em cache online usadas pelos intérpretes de base e pelo compilador JIT.
Com essas novas implementações, os dados básicos do compilador para uma função agora estão apenas no código da máquina. A partir daí, todas as informações em cache e os dados de criação de perfil foram movidos para o JitScript.
No entanto, como o interpretador base e o compilador JIT são idênticos, grande parte do código gerado também pode ser compartilhado.
Para fazer isso, uma classe base chamada BaselineCodeGen foi criada com outras 2 classes derivadas. O compilador base usa a primeira classe BalineCompiler para compilar o código de bytes de um script de código de máquina.
A segunda classe BaselineInterpreterGenerator é usada para gerar o código para o interpretador base. E com a classe BaselineInterpreterGenerator, a equipe do Firefox conseguiu criar o interpretador base.
Enfim, o Firefox 70 com interpretador Javascript aprimorado estará disponível para o mês de outubro. Para mais informações, acesse esse link.
Fonte: Ubunlog / Mozilla