在PROMELA中跳过和​​中断之间到底有什么区别?

时间:2018-12-03 09:12:50

标签: model promela spin

假设我有这段PROMELA代码

active proctype A(){

   do
      :: !x -> break
      :: else -> skip
   od

   … //more code
}

在这种情况下,breakskip到底做什么? break是否将整个过程A()进行了分解,以便不会到达“更多代码”或仅到达循环?

1 个答案:

答案 0 :(得分:1)

TLDR:

  • break :一条(始终可执行)指令,该指令使执行在包含它的最内层循环的末尾跳转。这种指令对于几乎所有编程语言来说都是通用的。

  • 跳过:无效(总是可执行)的空指令。有许多其他语言的 no-op 示例,例如pass中的python;,{{ 1}} C


jQuery.noop()

在这种情况下,jQuery一旦变为假,则active proctype A(){ do :: !x -> break :: else -> skip od … //more code } 强制循环终止,而x只是一个空指令,用于明确表示在另一种情况下循环不执行任何操作。


来自the docs of break

  

NAME

     

break-跳到最里面的do循环的末尾。

     

[...]

     

示例

break
     

在此示例中,控制在执行语句t2之后立即到达标签L1。控制也可以在执行语句t3之后立即到达标签L2,并且可选地,在一个执行步骤中,控制也可以从标签L1移至标签L2。

来自the docs of skip

  

NAME

     

skip-空的nil语句的缩写。

     

[...]

     

示例

skip
     

在此示例中,必须使用标签L1后面的skip语句。在上面的选择结构中,在else防护之后使用skip语句是多余的。上面的选择可以更简洁地写为:

L1: do
    :: t1 -> t2
    :: t3 -> break
    :: break
    od;
L2: ...
     

因为 Promela 是一种异步语言,所以跳过(跳过)在流程执行中引入延迟是永远不需要的,也不是有效的。根据定义,在 Promela 中,在proctype主体中的任意两个后续语句执行之间总会有一个任意的,不可知的延迟。此语义与并发系统设计的黄金法则相对应,该规则禁止假设并发系统中异步进程的相对执行速度。