js-string-builtins
WebAssemblyをターゲットとする言語が文字列型の実装にJavaScript String を効率的に使用できるようにする。
JavaScriptの文字列APIのサブセットをミラーする "WebAssembly builtin functions" のを定義し、JSのグルーコードなしで効率的に呼び出せるようにする
そんなに嬉しくはないかな...
予約された wasm: 名前空間を通して、これらのWasm組み込み関数をWebAssemblyモジュールにインポートするメカニズムを追加する。
なんか普通の import とは違うらしくて、より高速に呼び出しができるようになるらしい(よく分かってない)
ランタイムがWebAssemblyモジュール内のJavaScript文字列操作に最適なコードシーケンスを生成できるようにする。
これがでかい
現状は例えば 一つ一つの文字(のcharcode)を String.fromCharCode して文字を結合する必要があるが
"wasm:js-string" "fromCharCodeArray" で i16array をいっきに JS string に変換できる
JS-APIに新しい WebAssemblyCompileOptions 辞書を導入し、コンパイル時に wasm:js-string のような特定の組み込みインターフェースを有効にできるようにする。WebAssembly.compile(bytes, { builtins: ['js-string'] });
これを有効にすると、js-string-builtin で提供されている関数がモジュール内で利用できるようになる
"wasm:js-string"
cast - 外部参照をJavaScriptの文字列にキャストする
test - 外部参照がJavaScript Stringであるかどうかを調べる
fromCharCodeArray - 変数型 i16array の指定した範囲を文字列に変換する
intoCharCodeArray - 変数型 i16 配列に文字列をコピー
fromCharCode - 文字コードから文字列を作成する。
fromCodePoint - コードポイントから文字列を作成する
charCodeAt - 文字列の指定されたインデックスにある文字コードを返す
codePointAt - String の指定されたインデックスのコードポイントを返す。
length - 文字列の長さを返す。
concat - 2つの文字列を連結する。
substring - 文字列の部分文字列を返す。
equals - 2つの文字列が等しいかどうかを比較する
compare - 2つの文字列を辞書順に比較する
wasm:text-encoder と wasm:text-decoder インタフェースによる UTF-8 エンコード/デコードのサポート
builtins と普通の imported function の違いは?
通常のインポート関数はWebAssemblyモジュールで定義され、ホスト環境の外部で実装されるが、ビルトイン関数はWebAssemblyエンジン/ランタイム自体の内部で実装
WebAssemblyエンジンがより緊密に統合し最適化できることで、WebAssemblyとホスト環境間のオーバーヘッドを回避できる
hr.icon
Sheets and J2Wasm started experimentation on the proposal and we expect in-the-wild performance numbers of the new API within the next weeks, comparing this with the previous proposal (StringRef) that this one will replace.
More experimentation with respect to string constants around binary size, memory overhead and initialization performance is required. Several options are available regarding their implementation in the current proposal. V8 でも使えるんですか?
--experimental-wasm-imported-strings が必要
12.2.279 から
node.js v22 node -p process.versions.v8 12.4.254.14-node.10 なのでもう使えそう