Duktape - Cのコード中に組み込んで使うJavaScript実行エンジン
JavaScriptが色々な場面で使われています。Webブラウザ上で動くだけの言語だったのがサーバサイド、スマートフォンアプリ、さらにはnodeを使ったコンソールアプリにもなっています。JavaScriptを習得することでコーディングの幅が広がりそうです。 そんなJavaScriptをさらに活用しようと考えているのがDuktapeです。C/C++のコード中にJavaScriptのコードを埋め込んで実行できるようにするソフトウェアです。
Duktapeの使い方
例えば下のようなコードがあります。
/* test.c */
#include "duktape.h"
int main(int argc, char *argv[]) {
duk_context *ctx = duk_create_heap_default();
duk_eval_string(ctx, "print('Hello world!');");
duk_destroy_heap(ctx);
return 0;
}
これを実行した結果は次の通りです。
$ ./test
Hello world!
eval_stringを使ってJavaScriptのコードを評価しています。
さらにC/C++のコードを呼び出してブリッジさせることもできます。
/*
* Very simple example program
*/
#include "duktape.h"
int adder(duk_context *ctx) {
int i;
int n = duk_get_top(ctx); /* #args */
double res = 0.0;
for (i = 0; i < n; i++) {
res += duk_to_number(ctx, i);
}
duk_push_number(ctx, res);
return 1; /* one return value */
}
int main(int argc, char *argv[]) {
duk_context *ctx = duk_create_heap_default();
duk_eval_string(ctx, "print('Hello world!');");
duk_push_global_object(ctx);
duk_push_c_function(ctx, adder, DUK_VARARGS);
duk_put_prop_string(ctx, -2, "adder");
duk_pop(ctx); /* pop global */
duk_eval_string(ctx, "print('2+3=' + adder(2, 3));");
duk_pop(ctx); /* pop eval result */
duk_destroy_heap(ctx);
return 0;
}
adderというC上での関数を用意し、duk_eval_string中で実行しています。実行結果は次のようになります。
$ ./hello
Hello world!
2+3=5
DuktapeはEcmascript E5/E5.1と互換性があり、コンパクトでポータブルなJavaScriptエンジンになります。ユニコードをサポートし、さらに正規表現エンジンもあります。GCも搭載されています。
Duktapeを使うことでC/C++とJavaScriptをうまく使い分けて実装が出来るようになるかも知れません。組み込みで使うのを目的としたJavaScript実行エンジンというのもユニークですね。
DuktapeはC製のオープンソース・ソフトウェア(MIT License)です。