【Duktape】C/C++言語でjavascriptを使う

【Duktape】C/C++言語でjavascriptを使う:


概要

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; 
} 
ちなみにLuaの場合↓

  • 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; 
} 
Luaの場合↓

  • duk_peval_string→ luaL_dostring
  • lua_tonumber→ lua_tonumber
Luaの場合は明示的に「return」を書かないと結果を受け取れません。

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; 
} 

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)