December 23, 2025
Tiny engine, huge comment war
Fabrice Bellard Releases MicroQuickJS
Teeny-tiny JavaScript lands; fans swoon, skeptics ask 'where's the commit history'
TLDR: MicroQuickJS is a super‑small JavaScript engine that runs in about 10 KB of memory with strict, simplified rules for tiny devices. The crowd is divided between praising Bellard’s wizardry, questioning the missing commit history, dreaming of a lightweight web, and racing to port it to the browser—proof tiny code can spark big debates.
Fabrice Bellard just dropped MicroQuickJS, a pocket‑size JavaScript engine that runs programs with about 10 KB of memory and ~100 KB of storage. It speaks a simplified, stricter flavor of JS (think the older ES5 era): no undeclared globals, no “holey” arrays, fewer slow tricks. There’s even a tool to save compact bytecode and run it later. The technical flex is undeniable—but the comments are where it explodes.
First, the stans: one user basically launched a Fabrice Hall of Fame nomination, while another vows to port it to the browser via WebAssembly, already eyeing a demo on exaequOS.com. Minimalists cheered the strict rules, joking that “arrays can’t have holes” is the diet plan modern web apps need. Utopians rallied behind a dream to reboot the Web with light‑only tools, simple browsers, and zero bloat. Cue the nostalgic applause.
Then came the spice. A top comment called out the “uploaded without notable commit history” drop, sparking a transparency vs. just‑ship‑it skirmish. Others noted the license hints it’s built from QuickJS code anyway, so comparing timelines is messy. Meanwhile, practical devs poked at stricter mode details—does “globals must use var” mean anything else sneaks through? The vibe: tiny engine, giant conversation.
Key Points
- •MicroQuickJS is a JavaScript engine for embedded systems, running with about 10 kB RAM and ~100 kB ROM (ARM Thumb-2), with speed comparable to QuickJS.
- •It enforces a strict ES5-like subset: no with, global vars must use var, arrays cannot have holes, array literals with holes are errors, only global (indirect) eval is supported, and value boxing is unsupported.
- •Internals are optimized for low memory: tracing garbage collector, stackless VM (no CPU stack usage), and UTF-8 string storage; it shares code with QuickJS but differs under the hood.
- •The mqjs REPL/CLI supports evaluation, interactive mode, file inclusion, memory usage dumping, memory limits, bytecode output, 32-bit bytecode generation (-m32), and optional removal of column debug info.
- •Bytecode format depends on CPU endianness and word size; compiled bytecode can be saved and later executed, with 64-bit systems able to produce 32-bit bytecode for embedded targets.