【Duktape】C/C++言語でjavascriptを使う
【Duktape】C/C++言語でjavascriptを使う:
DuktapeはC言語で書かれていて、javascriptを実行できるライブラリです。
読みは「デュークテープ」でしょうか・・・?これはちょっと曖昧・・・
日本語資料がほとんどないので、自分用に使いながら分かったことを書いていこうと思います。
APIはLuaと似ているのでLuaと比較しつつやっていこうと思います。
純粋にC言語でも使えますが、面倒なのでC++混在で書いていきます。
https://duktape.org/
こちらよりダウンロードできます。
詳しいビルドのしかたは省略しますが
ダウンロードして展開すると「src」というフォルダーの中に必要なソースコードとヘッダーが一式は入っています。そのフォルダーにインクルードパスを設定して「duktape.c」と自分のソースコードファイルを一緒にコンパイルします。それだけ。V8エンジンと比べると簡単だなー
ちなみにLuaの場合↓
カスタムアロケーターを使う場合は
duk_create_heap_default関数 → duk_create_heap関数
luaL_newstate関数 → lua_newstate関数
を使います。
これは別の機会に。
1+1をするスクリプト
Luaの場合↓
概要
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関数で廃棄します。
duk.cpp
#include <duktape.h> int main(int argc, char** argv){ //初期化 duk_context *ctx = duk_create_heap_default(); //廃棄処理 if(ctx){ duk_destroy_heap(ctx); } return 0; }
- duk_create_heap_default → luaL_newstate
- duk_destroy_heap → lua_close
lua.cpp
#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関数などがあります。
duk.cpp
#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; }
- duk_peval_string→ luaL_dostring
- lua_tonumber→ lua_tonumber
lua.cpp
#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; }
コメント
コメントを投稿