わずか10KBのRAMで動く組み込みシステム向けにJavaScriptプログラムをコンパイルして実行できる「MicroQuickJS」

家電製品や産業機器などを制御するための組み込みシステムでは、コスト削減のためメモリの容量が限られています。近年ハードウェアの性能が向上したことにより一部でJavaScriptやPythonなどスクリプト言語がCやC++の代わり、もしくは補助として利用できるようになりました。そこで、メモリが少ない環境でもJavaScriptが実行できるJavaScriptエンジン「MicroQuickJS」をFFmpegの作者でもあるファブリス・ベラール氏が公開しました。
https://github.com/bellard/mquickjs/
MicroQuickJSは10KBのRAMとCライブラリとして100KB程度のROMがあれば実行および構築が可能です。他の条件として、JavaScriptのサブセットのみをサポートしており、ES5に近い仕様となっています。strictモードが必須でエラーが発生しやすい構文や非効率なJavaScript構文は使用できません。
今回はAlmaLinux 9上でGCCコンパイル環境が整った環境でテストします。まず、gitでmquickjsのリポジトリをクローン。
git clone https://github.com/bellard/mquickjs.git
mquickjsフォルダに移動し「make」します。
cd mquickjs
make
実行ファイル「mqjs」が作成されました。まずは使用メモリを10KBに限定しマンデルブロ集合を計算し作図するテスト用スクリプト「./mqjs --memory-limit 10k tests/mandelbrot.js」を実行すると簡易のフラクタル図が表示されました。

スクリプトからの実行だけでなく、ROMに書き込むためのコンパイル済みのバイトコードを作成することもできます。
./mqjs -o mandelbrot.bin tests/mandelbrot.js
バイトコードを直接実行することも可能です。
./mqjs -b mandelbrot.bin
◆QuickJSとの違い
MicroQuickJSはベラール氏が作成したQuickJSから派生したもので以下の違いがあります。
・言語サポート
MicroQuickJS:ES5 サブセット+一部の拡張
QuickJS:ES2023のほぼフル機能
・文字コード
MicroQuickJS:UTF-8
QuickJS:内部的にはUTF-16
・ガベージコレクション
MicroQuickJS:トレース型
QuickJS:参照カウント+循環除去
MicroQuickJSは省メモリ化のために最適化されており、最新の機能や複雑な制御などが不要な場合に有効なJavaScriptエンジンとなっています。
なお、ソーシャル系ニュースサイトのHacker Newsでは、MicroQuickJSについての議論が行われており「これが2010年に利用可能であった場合、RedisのスクリプトはLuaではなくJavaScriptになっていたでしょう」から始まるLuaとJavaScriptの議論や、ブラウザでMicroQuickJSを試すことができるMicroQuickJS Code Executorが紹介されています。
