MicroQuickJS(組込み向け軽量JavaScriptエンジン)
概要
MicroQuickJS(MQuickJS)は、組込みシステムやリソース制約の厳しい環境での利用を目的に最小化されたJavaScriptエンジンです。フットプリントを極力削り、ROM約100KB・RAM約10KBといった非常に小さい資源でJavaScriptコードを解釈・実行できます。機能はES5に近いサブセットで提供され、「より厳格なモード」によってエラーになりやすい振る舞いや非効率な言語機能を制限し、実装とランタイムの負担を減らしています。Cで実装され、Makefileでビルドできるシンプルさも組込み用途に向きます。
リポジトリの統計情報
- スター数: 19
- フォーク数: 1
- ウォッチャー数: 19
- コミット数: 5
- ファイル数: 28
- メインの言語: C
主な特徴
- 極小フットプリント:ROM約100KB、実行時10KB程度で動作を目指す設計
- ES5に近いサブセットと「厳格モード」による安全性・効率性の向上
- C言語で実装され、組込み機器への組込み・スタティックリンクに適合
- QuickJSと同等の処理速度を目標にした最適化(設計上の目標)
技術的なポイント
MicroQuickJSは「組込みでの実用」を第一に置いた設計決定が随所に現れます。まず言語サポートをES6以降の多くの拡張ではなく、ES5に近いサブセットに限定することで、パーサー・実行系・ランタイムのコードおよびデータ量を削減しています。さらに「厳格モード(stricter mode)」を導入し、動的でエラーになりやすい振る舞いやメモリ/CPUを浪費しやすい言語機能を禁止・変更することで、実行時の例外処理や多様なオブジェクト表現に伴う複雑さを排しています。
実装はC言語で行われ、ARM Thumb-2向けのコードサイズ目標が明示されている点から、クロスコンパイルと静的リンクを想定したビルド構成が取られています。Makefileや少数のソースファイル群によって、特定のプラットフォームに合わせた最小構成を容易に作成できます。QuickJS同様にインタプリタやバイトコード実行を想定した実行モデルを採用していることがうかがえ、JITではなくサイズ最適化された実行ルーチンを中心にしているため、メモリ制約下での安定性が高まっています。
組込み用途での実運用を想定すると、標準ライブラリの縮小、ガベージコレクションの軽量化(または簡易化)、オブジェクト表現の簡素化といったトレードオフが行われていると推測できます。結果として、IoTデバイスやマイコンなどで簡単なスクリプト実行やビジネスロジックの切り替え、設定スクリプトの実行を低コストで実現できる点がメリットです。一方で、最新のES機能(Promise、async/await、モジュール等)や大規模なランタイムライブラリを必要とするアプリケーションには適していません。導入時はサブセットの互換性と必要なランタイム機能を照合し、ビルド時に不要機能を除外するなどの最適化が重要です。
プロジェクトの構成
主要なファイルとディレクトリ:
- Changelog: file
- LICENSE: file
- Makefile: file
- README.md: file
- cutils.c: file
…他 23 ファイル
まとめ
極限まで小型化を追求した組込み向けJavaScriptエンジン。軽量スクリプト実行に最適だが、最新JS機能は限定的。
リポジトリ情報:
- 名前: mquickjs
- 説明: Public repository of the Micro QuickJS Javascript Engine
- スター数: 19
- 言語: C
- URL: https://github.com/bellard/mquickjs
- オーナー: bellard
- アバター: https://avatars.githubusercontent.com/u/6490144?v=4
READMEの抜粋: MicroQuickJS
Introduction
MicroQuickJS (aka. MQuickJS) is a Javascript engine targetted at embedded systems. It compiles and runs Javascript programs with as low as 10 kB of RAM. The whole engine requires about 100 kB of ROM (ARM Thumb-2 code) including the C library. The speed is comparable to QuickJS.
MQuickJS only supports a subset of Javascript close to ES5. It implements a stricter mode where some error prone or inefficient Javascript c…