JavaScriptエンジンの組込みAPIレビュー
組込みAPI ?
JavaScriptエンジンはいわゆる組込み言語として使用される機会が多い。このため、JavaScriptとCやC++を接続するためのAPIが色々と存在する。
N-API
N-APIはNode.jsの拡張APIとして提供されている。現状のメジャーバージョンは 7
。
Node.jsはV8なんだし、V8の組込みAPIそのままで良いじゃんという気がするが、ABI安定性のためには拡張APIを自前で定義して運用する方がずっと望ましい。
N-API (pronounced N as in the letter, followed by API) is an API for building native Addons. It is independent from the underlying JavaScript runtime (for example, V8) and is maintained as part of Node.js itself. This API will be Application Binary Interface (ABI) stable across versions of Node.js.
MSのゲームエンジン babylon.js のネイティブ版 Babylon Nativeでは、自社のJSエンジンを活用する視点から当初はN-APIを補ってV8とChakraCoreの両方を使えるようにしていた。しかし、結局React Nativeと同じJSIも追加したようだ。
- 文字列 : 常にnull終端される。長さ表現にはnull終端を含めない。
-
リファレンスカウント : 暗黙/明示。 https://nodejs.org/api/n-api.html#n_api_object_lifetime_management 参照。proxyオブジェクトに対する
ref
/unref
。
JSI
JSIはFacebookの有名なネイティブアプリケーションフレームワークであるReact Nativeで使用されるJavaScriptエンジンインターフェースで、主にJavaScriptCore(ReactNativeのデフォルト)とV8(MS製: https://github.com/microsoft/v8-jsi )、Chakra(https://github.com/microsoft/react-native-windows/pull/5710 -- MSEdgeやめたのにまだメンテするの!?)自社のJSエンジンであるHermes( https://github.com/facebook/hermes/tree/master/API/jsi/jsi )へのインターフェースを提供している。
... ドキュメント無いのかなコレ。JSIのメジャーなユーザは当然React Nativeということになるが、Babylon NativeはN-APIだけでなくJSIもサポートしている。
Note that, while
JSI
is also an allowed value forNAPI_JAVASCRIPT_ENGINE
, AppRuntime does not have an implementation that can instantiate and own a JSI JavaScript engine instance.
もっとも、JSIはReactNative用なのでWebGLバインディングはTypedArrayが無くて難儀している。
- 文字列 : STLの標準string。
-
リファレンスカウント : なし。明示的な
Pointer
クラス。
QuickJS
QEMUやFFMPEGで著名なFabrice BelladのJavaScriptエンジン。
-
リファレンスカウント :
Dup
/Free
。Dup
はdeep copyではなく、一般的な意味のリファレンスカウント操作となっている。
Duktape
1ソース完結のJavaScriptエンジン。
- リファレンスカウント : 暗黙。DuktapeのGCはリファレンスカウント以外にMark-and-Sweepのみのモードもあるため、リファレンスカウントを直接操作するAPIを出すと移植性を損ねてしまう。
JerryScript
元Samsung、現JS Foundation製の組込みJavaScriptエンジン。
-
リファレンスカウント :
acquire
/release
。https://jerryscript.net/reference-counting/