Open6

JavaScriptエンジンの組込みAPIレビュー

okuokuokuoku

組込みAPI ?

JavaScriptエンジンはいわゆる組込み言語として使用される機会が多い。このため、JavaScriptとCやC++を接続するためのAPIが色々と存在する。

okuokuokuoku

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も追加したようだ。

okuokuokuoku

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 for NAPI_JAVASCRIPT_ENGINE , AppRuntime does not have an implementation that can instantiate and own a JSI JavaScript engine instance.

https://github.com/BabylonJS/BabylonNative/issues/225

もっとも、JSIはReactNative用なのでWebGLバインディングはTypedArrayが無くて難儀している。

https://github.com/facebook/hermes/issues/182

  • 文字列 : STLの標準string。
  • リファレンスカウント : なし。明示的な Pointer クラス。
okuokuokuoku

QuickJS

https://bellard.org/quickjs/

QEMUやFFMPEGで著名なFabrice BelladのJavaScriptエンジン。

  • リファレンスカウント : Dup / FreeDup はdeep copyではなく、一般的な意味のリファレンスカウント操作となっている。
okuokuokuoku

Duktape

https://duktape.org/

1ソース完結のJavaScriptエンジン。

  • リファレンスカウント : 暗黙。DuktapeのGCはリファレンスカウント以外にMark-and-Sweepのみのモードもあるため、リファレンスカウントを直接操作するAPIを出すと移植性を損ねてしまう。