本篇文章更新時間:2025/12/24
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
MicroQuickJS:極小記憶體下也能跑 JS?深入解析輕量級引擎 MQuickJS
編輯前言:這篇來自 Fabrice Bellard 的 MicroQuickJS 專案 README,揭示了一個能在 10 kB RAM 中運行的 JavaScript 引擎。對於想在 MCU、RTOS 或低資源環境中導入 JS 的開發者,這是一篇值得細讀的技術寶藏。
核心觀點 (Key Takeaways)
- MQuickJS 是 QuickJS 的精簡版,專為嵌入式打造,可在約 10 kB RAM、100 kB ROM 下執行 JavaScript。
- 僅支援近似 ES5 的子集,並採用更嚴格的語法與運作模式(避免坑、提升表現)。
- 採用 追蹤與壓縮式 GC、UTF‑8 字串、單一 pass parser、ROM-based 標準庫等,一切都為「省 RAM」而設計。
深入解析
這份 README 不只是功能摘要,更像是一篇「如何讓 JavaScript 在極小記憶體下存活」的工程策略筆記。我試著整理其中最具啟發性的部分。
原文提到:MQuickJS 可以在僅 10 kB RAM 下運行 JavaScript 程式,且速度可比 QuickJS。
這點對嵌入式開發者來說可說相當驚人。一般 JS 引擎(像 V8、JavaScriptCore)對記憶體的需求往往是 MB 級別,而 MQuickJS 把它壓到 kB 級,且仍保持可用的語言特性。
-
語言子集與嚴格模式
作者直接砍掉了許多 JS 中「多餘、危險或不好實作」的特性: -
一律強制 strict mode
-
陣列不能有 holes,超界會丟 TypeError
-
eval 只能 indirect,不能操作 local scope
-
沒有 boxing objects(例如 new Number(1))
-
某些 String 與 RegExp 只支援 ASCII case folding
換句話說,它仍是 JS,但已經經過「嵌入式化的淬鍊」。
-
GC:從 reference counting 換成 compacting GC
MQuickJS 最大的不同之一,就是放棄 QuickJS 的參照計數,改用 追蹤式、可移動的 GC。這使得: -
物件可以更小
-
避免記憶體碎裂
-
需要注意 C API 中 JSValue 可能會移動
README 裡甚至提供了典型寫法示例,利用
JS_PushGCRef()避免 dangling pointer,讓我直接想到早期手動管理 GC roots 的語言。 -
ROM-based 標準庫
標準庫在編譯時就被轉成 C struct 放在 ROM。 -
幾乎不佔 RAM
-
載入速度非常快
這種設計對 MCU 非常友好,也讓整個引擎啟動成本極低。
-
Bytecode 與編譯流程
MQuickJS 維持 stack-based bytecode,但使用間接 atom table,所以 bytecode 是 read-only,適合放進 ROM。Parser 則採 non-recursive 設計,避免吃掉 C stack,並且在一個 pass 內完成編譯。
這些細節都透露出「每一個位元都值得省」的對策。
筆者心得與啟發
讀完這篇 README,我最大的感想是:JavaScript 真的能活在任何地方,只要你願意縮減它。
MicroQuickJS 展示了一條很務實的路線:在嵌入式場景下,不需要完整 ES2023,不需要 DOM,不需要 Proxy,也不需要 Symbol。你需要的是安全、可預測、可移植的腳本能力,而 MQuickJS 正是為此存在。
這篇文件也讓我重新思考兩件事:
-
語言本身是否需要完整性? 在 MCU 上跑 JS,意味著語言要服膺硬體資源,而不是反過來。去掉 holes array、去掉 boxing、簡化 eval,其實讓語言變得更乾淨。
-
JS 引擎的實作永遠比語法重要。 MQuickJS 採用 compacting GC、UTF‑8 字串、ROM-based library,都是為了空間效率。對比一般 JS 引擎的設計,這份 README 是個難得的學習範本。
如果你正在開發 IoT、TinyML 主機板、嵌入式控制器、或任何想加入腳本能力的專案,MQuickJS 會是一個值得實測的選項。我甚至覺得它可能比 Lua 更能吸引前端或 Web 工程師,因為它保留的 JS 特性足夠直覺,同時又不會暴肥。
總結一句話:這不是精簡版的 QuickJS,而是為嵌入式重新設計的 JavaScript 引擎。
