そんな WebAssembly Proposals 聞いたことないんだが
Bulk Memory Operations Proposals の一部になっている。もともとは別の WebAssembly Proposals だったが、Bulk Memory Operations Proposals に統合された...らしい。
Conditional Segment Initialization Proposals とは
WebAssembly data セクションの前提知識
WebAssembly Module の instantiate 時に、線形メモリに格納されるべき値を定義できる。
data セクションの例
(module
(memory (export "memory") 1)
(data (i32.const 16) "Hello, WebAssembly!\0")
)
上記の .wat だと、初期化時に線形メモリ上の先頭から 16 ~ 36バイトの範囲に、"Hello, WebAssembly!\0" のバイナリ表現が書き込まれる。
線形メモリ
| 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |
---- | ----------------------------------------------- | ------------------
0000 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ........ ........
0010 | 48 65 6c 6c 6f 2c 20 57 65 62 41 73 73 65 6d 62 | Hello, W ebAssemb
0020 | 6c 79 21 00 00 00 00 00 00 00 00 00 00 00 00 00 | ly!..... ........
Conditional Segment Initialization Proposals があると
上記の線形メモリの初期化が WebAssembly Module の instantiate 時にしかできなかったのが、任意のタイミングで実行することが可能となる。
Conditional Segment Initialization Proposals の使い方
1. data オフセットを削除する
data オフセット (上記の例だと (i32.const 16)
) がない data セグメントは、Passive Segment として取り扱われ、線形メモリの初期化には使われなくなる。
オフセットを削除した後
(module
(memory (export "memory") 1)
(data "Hello, WebAssembly!\0")
)
2. memory.init
命令を追加する
data セクション から線形メモリに書き込む WebAssembly OpCode が memory.init
である。
(memory.init <セグメント番号>
(i32.const <線形メモリの書き込み先オフセット>)
(i32.const <書き込まれるセグメントのオフセット>)
(i32.const <書き込まれるデータの長さ>))
memory.init の例
(memory 1)
(data "Hello, WebAssembly!\0")
(func $start
;; copy data segment 0 into memory 0 (the 0 is implicit)
(memory.init 0
(i32.const 16) ;; 線形メモリの先頭から 16 バイトの位置に
(i32.const 0) ;; データセグメントの先頭から
(i32.const 21)) ;; 21 バイトを書き込む
)
ほかにできることは?
- Table の初期化も同様に任意のタイミングに遅延させることができる
-
data.drop
命令を使って、今後その data セグメントが使われないことを明示できる- 従来通りの data セグメントに対して
data.drop
命令を使うことで実行時のメモリ使用量を削減できるかどうかは要調査
- 従来通りの data セグメントに対して
あとがき
- Bulk Memory Operations Proposals は早い段階から知っていたが、
data.drop
の存在意義とかがいまいちわかっていなかった - Thread Proposals に Conditional Segment Initialization Proposals の記述があってなんだそれってなった
- C/C++ からの使い所がわからない (