为什么控制流指令的结果类型是任意的? (特别是`return`)

Why are result types of control flow instructions arbitrary? (Especially `return`)

我正在尝试了解 WebAssembly 的类型系统,但对控制流指令感到困惑。我不明白为什么brresultunreachable的结果类型是任意类型序列(t_2^* ):

我运行下面的两个片段在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