家電製品や産業機器などを制御するための組み込みシステムでは、コスト削減のためメモリの容量が限られています。近年ハードウェアの性能が向上したことにより一部でJavaScriptやPythonなどスクリプト言語がCやC++の代わり、もしくは補助として利用できるようになりました。そこで、メモリが少ない環境でもJavaScriptが実行できるJavaScriptエンジン「MicroQuickJS」をFFmpegの作者でもあるファブリス・ベラール氏が公開しました。

bellard/mquickjs: Public repository of the Micro QuickJS Javascript Engine

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が紹介されています。