【问题标题】:What's the difference between "block" and "loop" in WebAssembly spec?WebAssembly 规范中的“块”和“循环”有什么区别?
【发布时间】:2020-03-16 07:43:43
【问题描述】:

正如标题,规范说“循环”是

开头带有标签的块,可用于形成循环。

对于“块”:

块结构的开始,一个带有标签的指令序列。

但是借助“br”(用于将分支切换到标记块),即使使用“块”,我也可以形成相同的控制结构,对吧?.那么,这两条指令有什么区别呢?

【问题讨论】:

    标签: webassembly


    【解决方案1】:

    块标签的br 跳转到包含的指令序列的end -- 它的行为类似于C 中的break 语句。

    循环标签的br 跳转到所包含指令序列的开始 -- 它的行为类似于C 中的continue 语句。

    前者启用向前跳转,后者启用向后跳转。两者都无法表达。

    【讨论】:

    • 谢谢 Andreas,“br”和“br_if”指令有一个立即数操作数代表“relative_depth”,这个立即数有什么用?
    • 表示跳跃目标,由内向外计数。
    【解决方案2】:

    不,你不能阻止标签在末尾,因为它说块在末尾有标签

    LOOP START
    label:
    SOME CODE
    IF condtion BR label:
    EVEN MORE CODE
    LOOP END
    

    将执行一次 SOME CODE。比重复一些代码直到条件不成立。而不是执行更多的代码

    BLOCK START
    SOME CODE
    IF condition BR label:
    EVEN MORE CODE
    label:
    BLOCK END
    

    将只执行一次 SOME CODE。当条件不成立时,可能会执行更多代码。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2010-12-25
      • 2015-08-28
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2011-04-01
      • 2017-06-29
      相关资源
      最近更新 更多