nccc: Node.js以外のJavaScript処理系のFFIはどうなってんのか問題

Node以外のJavaScript処理系にemscripten2nativeを移植するためには、それ用のFFI対応が必要になる。 ... N-APIに対応してたりはたぶんしないよね。。?
調査対象
emscripten2nativeとしては3つのポイントがある。
- どんな方法でも良いのでDLLをロードして最低1つのシグネチャで呼び出せる
- WebAssemblyが実行できると良い (が、emscripten2nativeがNCCC経由のbindingを用意するつもりなので無くても良い)
- デストラクタのコールバックかWeakMapが必要
最後の要求はWebGLの実装のため。
一旦WinterCG処理系に絞る。どれもパッケージマネージャとしてはnpmが使える。。と期待したい。
WinterCGの大きな互換表は https://runtime-compat.unjs.io/ にある。
- Bun (JSC) https://github.com/oven-sh/bun
- Deno(v8) https://github.com/denoland/deno
- WinterJS(Spidermonkey, through spiderfire) https://github.com/wasmerio/winterjs
- txiki.js (QuickJS-ng) https://github.com/saghul/txiki.js
- LLRT(QuickJS) https://github.com/awslabs/llrt
WinterCGのリスト https://runtime-keys.proposal.wintercg.org/ だと他にはModdable https://github.com/Moddable-OpenSource/moddable かなぁ。。
libjsはいくつかのJS処理系(QuickJS、JSC、v8)のCバインディングを提供している https://github.com/holepunchto/libjs 。I/Oはlibuvに依存。
Javyの存在を忘れてた。。https://github.com/bytecodealliance/javy

Bun
N-APIの多くを実装しているので、nccc的には専用のバインディングを用意する必要はない。ちなみにJSCのC APIも使えてしまう。ちょっとどうなんだろう。。
WebAssemblyも実装している https://bun.sh/docs/runtime/nodejs-apis#webassembly ので、emscripten2nativeとしては単にNode.jsの代替として使えるはずということになる。

Deno
こちらもBun同様N-APIを普通にサポートしている。Finalizerのサポートは去年入った https://github.com/denoland/deno/pull/19168 。
WebAssemblyについてはMozillaの互換表に載っている: https://developer.mozilla.org/en-US/docs/WebAssembly 。

WinterJS
これはWASIX上で動作するWebAssembly。というわけでホストのDLLを読めない。無理。

txiki.js
WebAssemblyはあまり真剣に実装されていない。この目的のためにはWASM3を内蔵している。
FFIモジュールは存在する https://bettercallsaghul.com/txiki.js/api/modules/tjs_ffi.html ため、専用のバインディングを用意すればncccモジュールを呼ぶことはできそうだ。中身はlibffi。

LLRT
N-APIのサポートは無く、そもそもdlopenしていない。無理。
中身はかなり素直なQuickJSのRust拡張なので、実装すること自体は簡単だと思うが。。