LoginSignup
4
4

More than 5 years have passed since last update.

JsRT を Windows アプリに組み込む

Posted at

JsRT: JavaScript Runtime とは

JsRT "Chakra" は JavaScript の実行環境 です。 端的に言えば、Microsoft 版の v8 であり、Spidermonkey です。

Internet Explorer 11 以降をインストールした Windows 7 以降で利用できます。 通常 JavaScript はブラウザ内で利用するためのスクリプト言語ですが、JsRT はアプリケーションに組み込んで利用できるよう C API が公開されています。 デスクトップアプリに簡単に組み込めるスクリプトエンジンとして、またユーザインタフェースを持たないサーバーサイド JavaScript のコアとして使える可能性があります。

特徴

  • ブラウザレスの JavaScript 環境であり、素の状態ではプリミティブ型のみが利用できる。
  • 巡回型のガベージコレクションが採用されており、不要なスクリプトオブジェクトは自動的に破棄される。
    • 参照カウントではなく、IUnknown インタフェース (COM) も使われない。
  • ホスト環境 (C言語側) から関数やデータを公開することで、スクリプトで利用できる機能を増やせる。
    • 関数: JsNativeFunction(callee, isConstructCall, arguments[], argumentCount, userdata):JsValueRef
    • ポインタとファイナライザ関数: userdata:void*JsFinalizeCallback(userdata):void
    • IDispatch を実装するインスタンス

まずは使ってみる

とりあえず最小限のコードとして、スクリプト側で数値の足し算をさせてみます。
素の状態ではコンソール出力さえ持たないため、まだ hello world できません……。

minimum-jsrt.cpp
#define NTDDI_VERSION   NTDDI_WIN7
#include <windows.h>
#include <jsrt.h>
#include <iostream>

#pragma comment(lib, "jsrt")

int wmain(int argc, wchar_t** argv) {
    JsRuntimeHandle runtime;
    JsCreateRuntime(JsRuntimeAttributeNone, JsRuntimeVersionEdge, nullptr, &runtime);
    JsContextRef context;
    JsCreateContext(runtime, nullptr, &context);
    JsSetCurrentContext(context);

    // global: var myValue = 5;
    JsValueRef global;
    JsGetGlobalObject(&global);
    JsPropertyIdRef myValueId;
    JsGetPropertyIdFromName(L"myValue", &myValueId);
    JsValueRef myValue;
    JsDoubleToNumber(5, &myValue);
    JsSetProperty(global, myValueId, myValue, true);

    // run script
    JsValueRef result;
    JsRunScript(L"myValue + 10;", JS_SOURCE_CONTEXT_NONE, L"", &result);

    // value from script
    double retval;
    JsNumberToDouble(result, &retval);
    std::cout << retval << std::endl;

    // cleanup
    JsSetCurrentContext(JS_INVALID_REFERENCE);
    JsDisposeRuntime(runtime);
    return 0;
}
実行結果
15

まとめ

JsRT は扱いやすい組み込み用スクリプト言語です。 Windows 専用にはなってしまいますが、Lua 等の組み込み用スクリプトエンジンの代わりに使えますし、もしかすると node.js のようなサーバーサイド環境が出てくるかもしれません。

参考

4
4
0

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
4
4