##概要
DuktapeはC言語で書かれていて、javascriptを実行できるライブラリです。
読みは「デュークテープ」でしょうか・・・?これはちょっと曖昧・・・
日本語資料がほとんどないので、自分用に使いながら分かったことを書いていこうと思います。
APIはLuaと似ているのでLuaと比較しつつやっていこうと思います。
純粋にC言語でも使えますが、面倒なのでC++混在で書いていきます。
##実行環境
- Windows10
- VisualStudio 2017 Community
##Duktape公式サイト
https://duktape.org/
こちらよりダウンロードできます。
##Duktapeをビルド
詳しいビルドのしかたは省略しますが
ダウンロードして展開すると「src」というフォルダーの中に必要なソースコードとヘッダーが一式は入っています。そのフォルダーにインクルードパスを設定して「duktape.c」と自分のソースコードファイルを一緒にコンパイルします。それだけ。V8エンジンと比べると簡単だなー
##使ってみる
###ライブラリの初期化と廃棄
- 必要なAPIはヘッダーファイル「duktape.h」にすべてあります。それをインクルードします。
- duk_create_heap_default関数(実際はマクロ)で初期化します。
- duk_destroy_heap関数で廃棄します。
#include <duktape.h>
int main(int argc, char** argv){
//初期化
duk_context *ctx = duk_create_heap_default();
//廃棄処理
if(ctx){
duk_destroy_heap(ctx);
}
return 0;
}
ちなみにLuaの場合↓
- duk_create_heap_default → luaL_newstate
- duk_destroy_heap → lua_close
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main(int argc, char** argv){
//初期化
lua_State *L = luaL_newstate();
if(L){
lua_close(L);
}
return 0;
}
カスタムアロケーターを使う場合は
duk_create_heap_default関数 → duk_create_heap関数
luaL_newstate関数 → lua_newstate関数
を使います。
これは別の機会に。
###スクリプトを実行
1+1をするスクリプト
- duk_peval_string関数はスクリプトをコンパイルして実行します。そしてスクリプト最後の行の実行結果をスタックに積み増す。
- duk_get_int関数でスタックに積まれた結果をint型(duk_int_tでtypedefされた型)で取得します。bool型ならduk_get_boolean関数、文字列ならduk_get_string関数などがあります。
#include <duktape.h>
#include <iostream>
int main(int argc, char** argv){
//初期化
duk_context *ctx = duk_create_heap_default();
//1+1を実行して返却
duk_peval_string(ctx, "1+1;");
//返却された値をint型で取得
duk_int_t result=duk_get_int(ctx, -1);
//1+1=2 と表示されます
std::cout<< "1+1=" << result<< std::endl;
//廃棄処理
if(ctx){
duk_destroy_heap(ctx);
}
return 0;
}
Luaの場合↓
- duk_peval_string→ luaL_dostring
- lua_tonumber→ lua_tonumber
Luaの場合は明示的に「return」を書かないと結果を受け取れません。
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <iostream>
int main(int argc, char** argv){
//初期化
lua_State *L = luaL_newstate();
//1+1を実行して返却
luaL_dostring(L, "return 1+1;");
//返却された値をint型で取得
lua_Number result=lua_tonumber(L, -1);
//1+1=2 と表示されます
std::cout<< "1+1=" << result<< std::endl;
if(L){
lua_close(L);
}
return 0;
}