2015/08/15

Recent entries from same category

  1. RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」
  2. コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  3. C++ で flask ライクなウェブサーバ「clask」書いた。
  4. C++ 用 SQLite3 ORM 「sqlite_orm」が便利。
  5. zsh で PATH に相対パスを含んだ場合にコマンドが補完できないのは意図的かどうか。

埋め込み向けで、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