QEMU, FFmpeg, BPG, QuickJS, TinyGL va TinyCC loyihalariga asos solgan fransuz matematiki Fabris Bellard o'rnatilgan tizimlar uchun yangi JavaScript dvigatelini — Micro QuickJS ni nashr etdi. U JavaScript dasturlarini atigi 10 KB tezkor xotira sarflab kompilyatsiya qilishi va bajarishi mumkin. C kutubxonasi bilan birgalikda dvigatel taxminan 100 KB xotirani egallaydi. U JavaScriptni baytkodga kompilyatsiya qilishi va baytkodni alohida ishga tushirishi mumkin. Loyiha kodi C tilida yozilgan va MIT litsenziyasi ostida tarqatilgan.
Dvigatel ECMAScript 5 (ES2019) spetsifikatsiyasiga yaqin bo'lgan JavaScript tilining kichik to'plamini qo'llab-quvvatlaydi, ammo qattiqroq kod talablarini qo'yadi va ba'zi samarasiz yoki xatolarga moyil JavaScript konstruktsiyalaridan foydalanishni taqiqlaydi. Masalan, global o'zgaruvchilar "var" kalit so'zi yordamida e'lon qilinishi kerak, "with" dan foydalanish taqiqlangan, massivlar bo'sh bo'lishi mumkin emas, "new Number(1)" shaklidagi e'lonlar bilan initsializatsiya qilish mumkin emas va mahalliy o'zgaruvchilarga eval orqali kirish mumkin emas.
Micro QuickJS ning ishlashi Fabrice tomonidan 2019-yildan beri ishlab chiqilgan QuickJS dvigatelining ishlashiga yaqin. Micro QuickJS QuickJS dvigateli bilan bir xil kodlardan foydalanadi, ammo uning arxitekturasi sezilarli darajada farq qiladi va minimal xotira sarfi uchun mo'ljallangan. Masalan, Micro QuickJS kuzatuv axlat yig'uvchisidan foydalanadi, QuickJS esa ma'lumotnomalarni sanashdan foydalanadi. Axlat yig'uvchining qo'shimcha xarajatlari har bir ajratilgan xotira bloki uchun atigi bir necha bitni tashkil qiladi. Xotira ajratish malloc() kutubxona funktsiyasidan mustaqil ravishda o'zining ajratuvchisidan foydalanadi.
QuickJS dan boshqa farqlar: stekdan foydalanmaydi virtual mashina; obyektlarning boshqa ichki ko'rinishi; satrlarni UTF-8 kodlashda saqlash; kompilyatsiya paytida standart kutubxonani yaratish va uni doimiy xotirada saqlash, RAMda faqat bir nechta obyektlarni yaratish; QuickJSga o'xshash parser, lekin rekursiyadan foydalanmaydi; baytkod generatsiyasi va optimallashtirishni bitta o'tishda birlashtirish (QuickJS optimallashtirish uchun bir nechta o'tishlarga ega).
Manba: opennet.ru
