今回は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
を使ってとのこと) -
do
while
switch
(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を使うべきです。