埋め込み向けで、C言語から呼べて API が小さい JavaScript エンジン v7 を見つけました。
cesanta/v7 · GitHub
https://github.com/cesanta/v7/
特徴としては
- クロスプラットフォーム: Arduino から MS Windows まで、どこでも動く。
- 小さい: コンパイルされたコアはわずか 40KB から 200KB。
- シンプルで直観的な C/C++ API: 簡単に C/C++ の関数を JavaScript 環境へエクスポート出来る。
- 標準: V7 は JavaScript 5.1 を実装し、Standard ECMA tests をパスする事を目指している。
- パフォーマンス: V7 は非 JIT エンジンの中で最速を目指している。
- 創造的に利用可能: V7 は、ハードウェア(SPI、UARTなど)、ファイル、暗号化、ネットワークといった補助ライブラリのAPIを提供する。
- ソースコードは ISO C と ISO C++ に準拠している。
- 非常に簡単な統合: プロジェクトに取り込むには単に v7.h と v7.c の2つのファイルをコピーするだけ。
v8 や duktape も良いのですが、v8 はどっしり構えないと書き出せないし、duktape も API がスタックマシン形式という誰得だったりするので、純粋にC言語から使えてしかも define だけでネットワークや暗号まで使えるなら、こりゃ使わない理由はない。試しにサンプルを書いてみた。
#include <v7.h>
#include <stdio.h>
#include <string.h>
static v7_val_t
js_neocomplete(struct v7 *v7, v7_val_t this_obj, v7_val_t args) {
char buf[100], *p;
p = v7_to_json(v7, this_obj, buf, sizeof(buf));
puts(p);
return v7_create_undefined();
}
int
main() {
v7_val_t result;
struct v7* v7 = v7_create();
v7_val_t obj = v7_create_object(v7);
v7_val_t arr = v7_create_array(v7);
#define V7_STR(v7, v) v7_create_string(v7, v, strlen(v), 1)
v7_array_push(v7, arr, V7_STR(v7, "きさま!"));
v7_array_push(v7, arr, V7_STR(v7, "まさか!"));
v7_array_push(v7, arr, V7_STR(v7, "そのまさかだ!"));
v7_array_push(v7, arr, V7_STR(v7, "フハハハハハ!"));
#undef V7_STR
v7_set(v7, obj, "Shougo", 6, 0, arr);
v7_set_method(v7, obj, "neocomplete", &js_neocomplete);
v7_set(v7, v7_get_global_object(v7), "Shougo", 6, 0, obj);
v7_exec(v7, &result, "Shougo.neocomplete()");
v7_destroy(v7);
}
実行すると
{"Shougo":["きさま!","まさか!","そのまさかだ!","フハハハハハ!"]}
という文字が出力されます。
見てもらえると分かる通り、かなり直観的な操作で JavaScript のオブジェクトや配列や JSON 操作や、C言語関数の呼び出しが行えるようになっています。ただしライセンスは GPL v2 なので利用の際には注意が必要です。