El matemático francés Fabrice Bellard, quien en su momento fundó proyectos como QEMU, FFmpeg, BPG, QuickJS, TinyGL y TinyCC, ha publicado un nuevo motor de JavaScript para sistemas incrustados: Micro QuickJS, capaz de compilar y ejecutar programas en JavaScript consumiendo solo 10 KB de RAM. Junto con la biblioteca en C, el motor ocupa aproximadamente 100 KB de memoria permanente. Es posible compilar JavaScript a código de bytes y ejecutar el código de bytes de manera independiente. El código del proyecto está escrito en C y se distribuye bajo la licencia MIT.
El motor soporta un subconjunto del lenguaje JavaScript, cercano a la especificación ECMAScript 5 (ES2019), pero que presenta requisitos más estrictos para el código y no permite el uso de ciertas construcciones de JavaScript ineficientes o propensas a errores. Por ejemplo, las variables globales deben ser declaradas con la palabra clave «var», se prohíbe el uso de «with», los arrays no pueden tener huecos, no es posible la inicialización al declarar de la forma «new Number(1)», y no se puede acceder a las variables locales desde eval.
El rendimiento de Micro QuickJS es similar al del motor QuickJS, que Fabrice ha estado desarrollando desde 2019. Micro QuickJS utiliza parte del código del motor QuickJS, pero su arquitectura difiere en gran medida y está diseñada para un consumo mínimo de memoria. Por ejemplo, Micro QuickJS emplea un recolector de basura por seguimiento, mientras que QuickJS utiliza conteo de referencias. Los costos de dicho recolector de basura son únicamente unos pocos bits por cada bloque de memoria asignado. Se utiliza un asignador propio para la gestión de memoria, que no depende de la función de biblioteca malloc().
Otras diferencias respecto a QuickJS: no utiliza pila máquina virtual; diferente representación interna de los objetos; almacenamiento de cadenas en codificación UTF-8; generación de la biblioteca estándar durante la compilación y su almacenamiento en memoria permanente con la creación en RAM de solo unos pocos objetos; un analizador similar a QuickJS, pero que no utiliza recursión; combinación en una sola pasada de la generación de código de bytes y optimización (QuickJS realiza múltiples pasadas para optimización).
Fuente: opennet.ru
