MicroQuickJS:為嵌入式而生的輕量級 JavaScript 引擎

本篇文章更新時間: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 正是為此存在。

這篇文件也讓我重新思考兩件事:

  1. 語言本身是否需要完整性? 在 MCU 上跑 JS,意味著語言要服膺硬體資源,而不是反過來。去掉 holes array、去掉 boxing、簡化 eval,其實讓語言變得更乾淨。

  2. JS 引擎的實作永遠比語法重要。 MQuickJS 採用 compacting GC、UTF‑8 字串、ROM-based library,都是為了空間效率。對比一般 JS 引擎的設計,這份 README 是個難得的學習範本。

如果你正在開發 IoT、TinyML 主機板、嵌入式控制器、或任何想加入腳本能力的專案,MQuickJS 會是一個值得實測的選項。我甚至覺得它可能比 Lua 更能吸引前端或 Web 工程師,因為它保留的 JS 特性足夠直覺,同時又不會暴肥。

總結一句話:這不是精簡版的 QuickJS,而是為嵌入式重新設計的 JavaScript 引擎。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon