В чем разница между if
и select
в wasm и как лучше всего применять эти команды?
Пример в wat2wasm :
WAT код:
(module
(func (export "Select") (param i32) (result i32)
(select (i32.const 3)
(i32.const 5)
(local.get 0) ))
(func (export "If") (param i32) (result i32)
(if (result i32) (local.get 0)
(then (i32.const 7))
(else (i32.const 11)) )) )
JS код:
const wasmInstance = new WebAssembly.Instance(wasmModule, {});
const { Select, If } = wasmInstance.exports;
console.log(Select(1)); // => 3
console.log(Select(0)); // => 5
console.log(If(1)); // => 7
console.log(If(0)); // => 11
Согласно документам:
Оператор select
выбирает один из своих первых двух операндов в зависимости от того, является ли его третий операнд нулевым или нет.
Инструкции block
, loop
и if
являются структурированными инструкциями. Они заключают в себе вложенные последовательности инструкций, называемые блоками, оканчивающиеся или разделенные конечными или псевдоинструкциями. Как предписывает грамматика, они должны быть хорошо вложенными. Структурированная инструкция может создавать значение, как описано в аннотированном типе результата.
однако, оператор select
может содержать block
и выполнять ряд инструкций.
(select (i32.const 3)
(block (result i32)
(i32.const 5) )
(local.get 0) )