今回はMikanOSのフォークOSであるTNTOSに何としてでもJavaScriptを組み込みたかった哀れな人が発見した超低レベルなJavaScriptエンジンelkについて紹介します。
そもそもJavaScriptエンジンとは
JavaScriptエンジンとはJavaScriptを実行するプログラムで、
例えばJavaScriptCore、SpiderMonkey、QuickJSなどがあります。
特徴としては、ECMAScriptで定められたメソッドしかなく、documentなどの所謂WebAPI等が無い、純粋にJavaScriptを解釈・実行するプログラムです。
WebAPIなどは、そのJavaScriptエンジンとやりとりをしてJavaScript環境内にdocument等を設置してもらいます。
elkとは
組み込み用の超小さいJavaScriptエンジンです。
発電に例えると、V8は原子力発電所、JavaScriptCoreは水力発電所、QuickJSはガソリン発電機、elkは手回し発電機です。
特徴としては以下があります。
- どこでも動く
- 依存関係ゼロ
-
elk.cとelk.hをコピペするだけで導入完了 - APIがシンプル
- 使うメモリはこっちが用意したバッファ内のみ
- JITコンパイラなど無い
組み込み開発者に優しすぎる...
サンプルコード
まずソースディレクトリにelk.cとelk.hをポーイ
そして初期化はこれだけ!
#include <stdio.h>
#include "elk.h"
int main() {
char buf[200];
struct js *js = js_create(buf, sizeof(buf));
// 任意のコード
return 0;
}
ね、簡単でしょ?
一応MikanOSのフォーク内でのコードもあります。サンプルとして見て、どうぞ。
これだけだと神のようなエンジンだが問題が...
しかし問題はJavaScriptの仕様であった
なんと、JavaScriptの仕様が散々でありました。ES6のサブセットと言われていますが、色々と無いです。
無い機能
-
a[b](動的なメンバー) -
2 ** 16(べき乗) - アロー演算子
- strictモードの場合は
varとconst(letを使ってとのこと) -
dowhileswitch(forを使ってとのこと) - 配列、クロージャー、プロトタイプ、
this、new、delete! - 標準ライブラリ(
Date、Regexp、Function、String、Numberなど) - セミコロンの書き忘れのお見逃し(つまりセミコロン必須)
逆に何が出来るのか知りたいですね。
ある機能
- for文
- if-else
-
!===!===== typeof("a") === "string"a ? b : c- 関数(
let f = function(x, y) {return x + y; };) - オブジェクト(一応あった...)
不便なとこ
- 文字列の長さはバイト数で計算される(ECMAScript標準ではUnicodeコードポイント数)(
'Київ'.length === 8) - セミコロン必須
まとめ
elkとは過酷な環境でも動くよう色々なものをそぎ落としたC言語のJavaScriptエンジンライブラリです。MikanOSや組み込み開発などのような過酷な環境でどうしてもJavaScriptを使いたい人にお勧めです。
おまけ: QuickJS
QuickJSはES2023を実装したJavaScriptエンジンです。
ちなみに自分が愛用するiPhone 16sのSafariに負けました(checkyou.pages.devで一歩及ばずES2022と判定されました)
これもelkと似たようにC言語ソース直置きで組み込みやすいのですが、MikanOSの環境では標準ライブラリが少なすぎて無理でした。標準ライブラリが豊富なら絶対にQuickJSを使うべきです。
ちなみにMinecraftのScriptAPIもQuickJSだそうですよ。
追記
場合によってはduktapeの方が便利でした。
少なくともTNTOSの環境ではそうでした。
詳細はこちらです。