O matemático francês Fabrice Bellard, fundador dos projetos QEMU, FFmpeg, BPG, QuickJS, TinyGL e TinyCC, lançou um novo mecanismo JavaScript para sistemas embarcados: o Micro QuickJS. Ele consegue compilar e executar programas JavaScript consumindo apenas 10 KB de RAM. Juntamente com a biblioteca C, o mecanismo ocupa aproximadamente 100 KB de memória. Ele pode compilar JavaScript para bytecode e executar o bytecode separadamente. O código do projeto é escrito em C e distribuído sob a licença MIT.
O mecanismo suporta um subconjunto da linguagem JavaScript que é próximo da especificação ECMAScript 5 (ES2019), mas impõe requisitos de código mais rigorosos e proíbe o uso de certas construções JavaScript ineficientes ou propensas a erros. Por exemplo, variáveis globais devem ser declaradas usando a palavra-chave "var", o uso de "with" é proibido, arrays não podem estar vazios, a inicialização não é possível com declarações da forma "new Number(1)" e variáveis locais não podem ser acessadas a partir de eval.
O desempenho do Micro QuickJS é próximo ao do mecanismo QuickJS, desenvolvido por Fabrice desde 2019. O Micro QuickJS utiliza parte do mesmo código do mecanismo QuickJS, mas sua arquitetura é significativamente diferente e projetada para consumo mínimo de memória. Por exemplo, o Micro QuickJS utiliza um coletor de lixo baseado em rastreamento, enquanto o QuickJS utiliza contagem de referências. A sobrecarga do coletor de lixo é de apenas alguns bits por bloco de memória alocado. A alocação de memória utiliza seu próprio alocador, independente da função de biblioteca malloc().
Outras diferenças em relação ao QuickJS: não utiliza uma pilha de chamadas. máquina virtual; uma representação interna diferente dos objetos; armazenamento de strings em codificação UTF-8; geração da biblioteca padrão durante a compilação e armazenamento em memória persistente com a criação de apenas alguns objetos na RAM; um analisador sintático semelhante ao QuickJS, mas sem usar recursão; combinação da geração e otimização de bytecode em uma única passagem (o QuickJS possui várias passagens para otimização).
Fonte: opennet.ru
