Francuski matematyk Fabrice Bellard, twórca projektów QEMU, FFmpeg, BPG, QuickJS, TinyGL i TinyCC, opublikował nowy silnik JavaScript do systemów wbudowanych — Micro QuickJS, który jest w stanie kompilować i wykonywać programy JavaScript, zużywając jedynie 10 KB pamięci RAM. Razem z biblioteką C, silnik zajmuje około 100 KB pamięci trwałej. Możliwa jest kompilacja JavaScript do bajtkodu i oddzielne uruchamianie bajtkodu. Kod projektu napisany jest w języku C i jest rozpowszechniany na licencji MIT.
Silnik obsługuje podzbiór języka JavaScript, bliski specyfikacji ECMAScript 5 (ES2019), ale stawia bardziej rygorystyczne wymagania wobec kodu i nie dopuszcza niektórych nieefektywnych lub błędnych konstrukcji JavaScript. Na przykład, zmienne globalne muszą być deklarowane za pomocą słowa kluczowego „var”, użycie „with” jest zabronione, tablice nie mogą mieć luk, a inicjalizacja w deklaracji typu „new Number(1)” jest niemożliwa, a z eval nie można uzyskać dostępu do zmiennych lokalnych.
Wydajność Micro QuickJS jest zbliżona do silnika QuickJS, rozwijanego przez Fabrice'a od 2019 roku. W Micro QuickJS wykorzystano część kodu z silnika QuickJS, ale architektura różni się w dużym stopniu i została zaprojektowana z myślą o minimalnym zużyciu pamięci. Na przykład w Micro QuickJS zastosowano trasujący zbieracz śmieci, podczas gdy w QuickJS użyto liczenia referencji. Narzut zbieracza śmieci wynosi zaledwie kilka bitów na każdy przydzielony blok pamięci. Do alokacji pamięci używany jest własny alokator, niezależny od funkcji malloc().
Inne różnice w porównaniu do QuickJS: brak używania stosu maszyna wirtualna; inne wewnętrzne przedstawienie obiektów; przechowywanie ciągów w kodowaniu UTF-8; generacja standardowej biblioteki w czasie kompilacji i jej przechowywanie w pamięci stałej z tworzeniem w pamięci RAM zaledwie kilku obiektów; parser bliski QuickJS, ale nie korzystający z rekurencji; połączenie w jednym przebiegu generacji kodu bajtowego i optymalizacji (w QuickJS jest kilka przebiegów optymalizacji).
Źródło: opennet.ru
