Types 为什么控制流指令的结果类型是任意的?(尤其是“return”)

Types 为什么控制流指令的结果类型是任意的?(尤其是“return”),types,stack,specifications,type-systems,webassembly,Types,Stack,Specifications,Type Systems,Webassembly,我试图理解WebAssembly的类型系统,但被控制流指令弄糊涂了。我不明白为什么br、result或unreachable的结果类型是一个任意类型序列(t_2^*): 我在中运行了以下两个片段: 未报告类型错误。然而,这一点: (module (func (result i32) (i32.const 1) (i32.const 2) (return) (f32.const 2) ) ) 现在我得到了类型错误:“test.wa

我试图理解WebAssembly的类型系统,但被控制流指令弄糊涂了。我不明白为什么
br
result
unreachable
的结果类型是一个任意类型序列(t_2^*):

我在中运行了以下两个片段:

未报告类型错误。然而,这一点:

 (module
   (func (result i32)
     (i32.const 1)
     (i32.const 2)
     (return)
     (f32.const 2)
   )
 )
现在我得到了类型错误:“test.wast:2.2-7.3:无效模块:类型不匹配:运算符需要[i32],但堆栈有[f32]”

但我可以尝试利用“任意类型序列”,编写仍然类型良好的奇怪程序:

(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)
 )
)

那么,在返回声明之后进行类型检查有什么意义呢?

原始Wasm设计文档的基本原理部分包含了对该功能的详细说明。

谢谢,我不知怎么错过了这一点。虽然这可能从理论上回答了这个问题,但将答案的基本部分包括在这里,同时,我发现了更多关于这个话题的精彩讨论。
(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)
 )
)