Wasm 规范说明
Wasm specifcation clearification
我目前正在编写一个从前端到后端的玩具编译器,目标是 wasm。我知道一点 x86 和 mips,但或多或少我可以编写一小部分代码并阅读其他代码。
我有一个关于 'labels' 的澄清问题。在规范中,标签是相对于execution/nesting点的方式。这让我想到了两个关于如何使用 branching/jumps.
的问题
循环次数:
假设我们有一些 while 循环,其中嵌套了 l 个标签,其中 l >= 0。下面的代码是正确的吗? (代码以抽象树表示,不是 wat 的正确格式,不包括块类型,但假设隐式推入和弹出堆栈)
block(
loop(
// compute condition value
if(
// compute the effect of the loop
)
else( // if false then break the loop
br(l + 2)
)
)
)
跳表:
如果以上是真的,这对前跳有什么影响?
假设我们要编译一个 switch 语句,其中 subject s 是针对 c 个案例进行测试的。这在 wasm 中如何表达?我知道每个案例应该是一个块,它更多的是标签。
我知道我很可能想多了。
我相信你只想 br 2
(br 0
会跳出 if 并且 br 1
会跳出循环并且 br 2
突破障碍)。来自文档 at:
label 0 refers to the innermost structured control instruction enclosing the referring branch instruction, while increasing indices refer to those farther out.
- 我相信您可以为此使用
br_table
指令(可能取决于枚举案例的稀疏程度)。
我目前正在编写一个从前端到后端的玩具编译器,目标是 wasm。我知道一点 x86 和 mips,但或多或少我可以编写一小部分代码并阅读其他代码。
我有一个关于 'labels' 的澄清问题。在规范中,标签是相对于execution/nesting点的方式。这让我想到了两个关于如何使用 branching/jumps.
的问题循环次数:
假设我们有一些 while 循环,其中嵌套了 l 个标签,其中 l >= 0。下面的代码是正确的吗? (代码以抽象树表示,不是 wat 的正确格式,不包括块类型,但假设隐式推入和弹出堆栈)
block( loop( // compute condition value if( // compute the effect of the loop ) else( // if false then break the loop br(l + 2) ) ) )
跳表:
如果以上是真的,这对前跳有什么影响? 假设我们要编译一个 switch 语句,其中 subject s 是针对 c 个案例进行测试的。这在 wasm 中如何表达?我知道每个案例应该是一个块,它更多的是标签。
我知道我很可能想多了。
我相信你只想
br 2
(br 0
会跳出 if 并且br 1
会跳出循环并且br 2
突破障碍)。来自文档 at:label 0 refers to the innermost structured control instruction enclosing the referring branch instruction, while increasing indices refer to those farther out.
- 我相信您可以为此使用
br_table
指令(可能取决于枚举案例的稀疏程度)。