2015/08/15

Recent entries from same category

  1. MRuby の TensorFlow Lite バインディングを書いた。
  2. flatten() に再帰は必要ない
  3. Windows 10 に AF_UNIX が来たので試してみた。
  4. C言語から分かりやすいAPIで扱える JSON パーサ「cJSON」
  5. C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」

埋め込み向けで、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つのファイルをコピーするだけ。

v8duktape も良いのですが、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"60, arr);
  v7_set_method(v7, obj, "neocomplete", &js_neocomplete);
  v7_set(v7, v7_get_global_object(v7), "Shougo"60, obj);

  v7_exec(v7, &result, "Shougo.neocomplete()");
  v7_destroy(v7);
}

実行すると

{"Shougo":["きさま!","まさか!","そのまさかだ!","フハハハハハ!"]}

という文字が出力されます。

見てもらえると分かる通り、かなり直観的な操作で JavaScript のオブジェクトや配列や JSON 操作や、C言語関数の呼び出しが行えるようになっています。ただしライセンスは GPL v2 なので利用の際には注意が必要です。

Posted at by | Edit


blog comments powered by Disqus