为什么控制流指令的结果类型是任意的? (特别是`return`)
Why are result types of control flow instructions arbitrary? (Especially `return`)
我正在尝试了解 WebAssembly 的类型系统,但对控制流指令感到困惑。我不明白为什么br
、result
或unreachable
的结果类型是任意类型序列(t_2^* ):
https://webassembly.github.io/spec/core/valid/instructions.html#valid-return
https://webassembly.github.io/spec/core/valid/instructions.html#valid-br
https://webassembly.github.io/spec/core/valid/instructions.html#valid-unreachable
我运行下面的两个片段在reference interpreter:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(return)
)
)
没有报告类型错误。然而,这个:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(f32.const 2)
)
)
现在我收到类型错误:"test.wast:2.2-7.3: invalid module: type mismatch: operator requires [i32] but stack has [f32]"。
但我可以尝试利用 "arbitrary type sequence" 并编写仍然类型正确的奇怪程序:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
)
)
那么在 return 语句之后进行类型检查有什么意义呢?
原始 Wasm 设计文档的基本原理部分包含此功能的 extensive motivation。
我正在尝试了解 WebAssembly 的类型系统,但对控制流指令感到困惑。我不明白为什么br
、result
或unreachable
的结果类型是任意类型序列(t_2^* ):
https://webassembly.github.io/spec/core/valid/instructions.html#valid-return
https://webassembly.github.io/spec/core/valid/instructions.html#valid-br
https://webassembly.github.io/spec/core/valid/instructions.html#valid-unreachable
我运行下面的两个片段在reference interpreter:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(return)
)
)
没有报告类型错误。然而,这个:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(f32.const 2)
)
)
现在我收到类型错误:"test.wast:2.2-7.3: invalid module: type mismatch: operator requires [i32] but stack has [f32]"。
但我可以尝试利用 "arbitrary type sequence" 并编写仍然类型正确的奇怪程序:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
)
)
那么在 return 语句之后进行类型检查有什么意义呢?
原始 Wasm 设计文档的基本原理部分包含此功能的 extensive motivation。