Cloudflare, Mozilla e Facebook desenvolvem BinaryAST para acelerar o carregamento de JavaScript

Engenheiros da Cloudflare, Mozilla, Facebook e Bloomberg sugerido novo formato BinárioAST para acelerar a entrega e o processamento do código JavaScript ao abrir sites no navegador. BinaryAST move a fase de análise para o lado do servidor e fornece uma árvore de sintaxe abstrata já gerada (AST). Ao receber um BinaryAST, o navegador pode prosseguir imediatamente para o estágio de compilação, ignorando a análise do código-fonte JavaScript.

Para teste preparado implementação de referência fornecida sob a licença do MIT. Os componentes Node.js são usados ​​para análise, e o código para otimização e geração AST é escrito em Rust. Suporte do lado do navegador
BinaryAST já está disponível em construções noturnas Raposa de fogo. O codificador no BinaryAST pode ser usado tanto no nível de ferramentas do site final quanto para empacotar scripts de sites externos no lado de um proxy ou rede de entrega de conteúdo. Atualmente, o processo de padronização do BinaryAST pelo grupo de trabalho já foi iniciado ECMA TC39, após o qual o formato poderá coexistir com métodos de compactação de conteúdo existentes, como gzip e brotli.

Cloudflare, Mozilla e Facebook desenvolvem BinaryAST para acelerar o carregamento de JavaScript

Cloudflare, Mozilla e Facebook desenvolvem BinaryAST para acelerar o carregamento de JavaScript

Ao processar JavaScript, uma quantidade significativa de tempo é gasta na fase de carregamento e análise do código. Considerando que o volume de JavaScript baixado em muitos sites populares é próximo a 10 MB (por exemplo, para LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), o processamento inicial de JavaScript introduz um atraso significativo. O estágio de análise no lado do navegador também é lento devido à incapacidade de construir totalmente o AST em tempo real à medida que o código é carregado (o navegador tem que esperar que os blocos de código completem o carregamento, como o fim das funções, para obter as informações que faltam para analisar os elementos atuais).

Eles estão tentando resolver parcialmente o problema distribuindo o código de forma minimizada e compactada, bem como armazenando em cache o bytecode gerado pelo navegador. Em sites modernos, o código é atualizado com bastante frequência, portanto, o armazenamento em cache resolve apenas parcialmente o problema. WebAssembly poderia ser uma solução, mas requer digitação explícita no código e não é adequado para acelerar o processamento de código JavaScript existente.

Outra opção é entregar bytecode compilado pronto em vez de scripts JavaScript, mas os desenvolvedores de mecanismos de navegador são contra isso porque o bytecode de terceiros é difícil de verificar, seu processamento direto pode levar à estratificação da Web, surgem riscos de segurança adicionais e o desenvolvimento de é necessário um formato de bytecode universal.

BinaryAST permite que você se ajuste ao seu modelo atual de desenvolvimento e entrega de código sem criar novo bytecode ou alterar a linguagem JavaScript. O tamanho dos dados no formato BinaryAST é comparável ao código JavaScript minificado compactado, e a velocidade de processamento, eliminando a fase de análise do texto fonte, aumenta visivelmente. Além disso, o formato permite a compilação em bytecode à medida que o BinaryAST é carregado, sem esperar que todos os dados sejam concluídos. Além disso, a análise no lado do servidor permite excluir funções não utilizadas e código desnecessário da representação BinaryAST retornada, o que, ao analisar no lado do navegador, desperdiça tempo na análise e na transmissão de tráfego desnecessário.

Um recurso do BinaryAST também é a capacidade de restaurar JavaScript legível que não é exatamente igual à versão original, mas é semanticamente equivalente e inclui os mesmos nomes de variáveis ​​​​e funções (BinaryAST salva nomes, mas não salva informações sobre posições no código, formatação e comentários). O outro lado da moeda é o surgimento de novos vetores de ataque, mas segundo os desenvolvedores, eles são muito menores e mais controláveis ​​do que quando se utilizam alternativas, como a distribuição de bytecodes.

Os testes do código do facebook.com mostraram que a análise do JavaScript consome de 10 a 15% dos recursos da CPU e a análise leva mais tempo do que a geração de bytecode e a geração inicial do código para JIT. No mecanismo SpiderMonkey, o tempo para construir completamente um AST leva de 500 a 800 ms, e o uso do BinaryAST reduziu esse número em 70 a 90%.
Em geral, para a maioria dos fogos de artifício da web, ao usar o BinaryAST, o tempo de análise do JavaScript é reduzido em 3 a 10% no modo sem otimização e em 90 a 97% quando o modo de ignorar funções não utilizadas está ativado.
Ao executar um conjunto de testes JavaScript de 1.2 MB, o uso do BinaryAST permitiu que o tempo de inicialização acelerasse de 338 para 314 ms em um sistema desktop (Intel i7) e de 2019 para 1455 ms em um dispositivo móvel (HTC One M8).

Fonte: opennet.ru

Adicionar um comentário