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 のようなサーバーサイド環境が出てくるかもしれません。
参考
- MSDN: JavaScript Runtime Hosting
-
Windows Dev Center: JavaScript Runtime Hosting Sample
- 公開されているC#版コードにはバグがあるようなので注意 → stackoverflow