Engenheiros da Cloudflare, Mozilla, Facebook e Bloomberg
Para teste
BinaryAST já está disponível em
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