Il matematico francese Fabrice Bellard, fondatore di progetti come QEMU, FFmpeg, BPG, QuickJS, TinyGL e TinyCC, ha pubblicato un nuovo motore JavaScript per sistemi embedded: Micro QuickJS, in grado di compilare ed eseguire programmi JavaScript consumando solo 10 KB di RAM. Insieme alla libreria C, il motore occupa circa 100 KB di memoria permanente. È possibile compilare JavaScript in bytecode e lanciare separatamente il bytecode. Il codice del progetto è scritto in C e distribuito sotto licenza MIT.
Il motore supporta un sottoinsieme del linguaggio JavaScript, vicino alla specifica ECMAScript 5 (ES2019), ma pone requisiti più rigorosi sul codice e non consente l'uso di certe costruzioni JavaScript inefficaci o problematiche. Ad esempio, le variabili globali devono essere sempre dichiarate con la parola chiave "var", è vietato l'uso di "with", gli array non possono avere spazi vuoti e non è possibile l'inizializzazione alla dichiarazione di tipo "new Number(1)"; l'accesso alle variabili locali da eval non è permesso.
Le prestazioni di Micro QuickJS sono paragonabili a quelle del motore QuickJS, sviluppato da Fabrice dal 2019. Micro QuickJS utilizza parte del codice di QuickJS, ma l'architettura è molto diversa ed è progettata per un consumo minimo di memoria. Ad esempio, Micro QuickJS implementa un garbage collector tracciante, mentre QuickJS utilizza il conteggio dei riferimenti. Il sovraccarico del garbage collector è di soli pochi bit per ogni blocco di memoria allocato. Per l'allocazione della memoria viene utilizzato un allocatore proprietario, indipendente dalla funzione di libreria malloc().
Altre differenze rispetto a QuickJS: non utilizza lo stack; ha una diversa rappresentazione interna degli oggetti; memorizza le stringhe in codifica UTF-8; genera la libreria standard durante la compilazione e la memorizza in memoria permanente creando in RAM solo pochi oggetti; il parser è simile a QuickJS, ma non utilizza la ricorsione; combina in un'unica passata la generazione di bytecode e l'ottimizzazione (in QuickJS ci sono più passaggi per l'ottimizzazione). la macchina virtuale; altra rappresentazione interna degli oggetti; memorizzazione delle stringhe in codifica UTF-8; generazione della libreria standard durante la compilazione e sua memorizzazione in memoria permanente con creazione in RAM di soli pochi oggetti; parser simile a QuickJS, ma senza utilizzo della ricorsione; unione in un'unica passata di generazione del bytecode e ottimizzazione (in QuickJS ci sono più passate per l'ottimizzazione).
Fonte: opennet.ru
