LoginSignup
7
8

More than 5 years have passed since last update.

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

Posted at

概要

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8