Der französische Mathematiker Fabrice Bellard, der einst die Projekte QEMU, FFmpeg, BPG, QuickJS, TinyGL und TinyCC ins Leben rief, hat eine neue JavaScript-Engine fĂŒr eingebettete Systeme veröffentlicht â Micro QuickJS, die in der Lage ist, JavaScript-Programme zu kompilieren und auszufĂŒhren und dabei nur 10 KB RAM zu verbrauchen. Zusammen mit der C-Bibliothek benötigt die Engine etwa 100 KB Flash-Speicher. Eine Kompilierung von JavaScript in Bytecode und das separate AusfĂŒhren des Bytecodes sind möglich. Der Code des Projekts ist in C geschrieben und steht unter der MIT-Lizenz.
Die Engine unterstĂŒtzt ein Teilmenge der JavaScript-Sprache, die der ECMAScript 5 (ES2019) Spezifikation nahe kommt, jedoch strengere Anforderungen an den Code stellt und die Verwendung gewisser ineffizienter oder fehleranfĂ€lliger JavaScript-Konstrukte nicht zulĂ€sst. Beispielsweise mĂŒssen globale Variablen zwingend mit dem SchlĂŒsselwort âvarâ deklariert werden, die Verwendung von âwithâ ist verboten, Arrays dĂŒrfen keine LĂŒcken haben, eine Initialisierung im Format ânew Number(1)â ist nicht möglich, und eval hat keinen Zugriff auf lokale Variablen.
Die Leistung von Micro QuickJS ist vergleichbar mit der Engine QuickJS, die von Fabrice seit 2019 entwickelt wird. In Micro QuickJS wird ein Teilcode aus der QuickJS-Engine verwendet, jedoch unterscheidet sich die Architektur erheblich und ist fĂŒr einen minimalen Speicherverbrauch konzipiert. Zum Beispiel verwendet Micro QuickJS einen tracing Garbage Collector, wĂ€hrend QuickJS ReferenzzĂ€hlung nutzt. Die Overhead-Kosten des Garbage Collectors betragen nur einige Bits pro zugewiesenem Speicherblock. FĂŒr die Speicherzuweisung wird ein eigener Allocator verwendet, der nicht von der Bibliotheksfunktion malloc() abhĂ€ngt.
Weitere Unterschiede zu QuickJS: kein Einsatz des Stacks eine virtuelle Maschine; eine andere interne Darstellung von Objekten; Speicherung von Strings in UTF-8-Codierung; Generierung der Standardbibliothek wÀhrend der Kompilierung und deren Speicherung im Flash-Speicher, wobei im RAM lediglich einige Objekte erstellt werden; ein Parser, der dem QuickJS Àhnlich ist, jedoch keine Rekursion verwendet; Kombination von Bytecode-Generierung und Optimierung in einem Durchgang (in QuickJS gibt es mehrere DurchgÀnge zur Optimierung).
Quelle: opennet.ru
