假设我有这段PROMELA代码
active proctype A(){
do
:: !x -> break
:: else -> skip
od
… //more code
}
在这种情况下,break
和skip
到底做什么? break
是否将整个过程A()
进行了分解,以便不会到达“更多代码”或仅到达循环?
答案 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
只是一个空指令,用于明确表示在另一种情况下循环不执行任何操作。
NAME
break-跳到最里面的do循环的末尾。
[...]
示例
break
在此示例中,控制在执行语句t2之后立即到达标签L1。控制也可以在执行语句t3之后立即到达标签L2,并且可选地,在一个执行步骤中,控制也可以从标签L1移至标签L2。
NAME
skip-空的nil语句的缩写。
[...]
示例
skip
在此示例中,必须使用标签L1后面的skip语句。在上面的选择结构中,在else防护之后使用skip语句是多余的。上面的选择可以更简洁地写为:
L1: do :: t1 -> t2 :: t3 -> break :: break od; L2: ...
因为 Promela 是一种异步语言,所以跳过(跳过)在流程执行中引入延迟是永远不需要的,也不是有效的。根据定义,在 Promela 中,在proctype主体中的任意两个后续语句执行之间总会有一个任意的,不可知的延迟。此语义与并发系统设计的黄金法则相对应,该规则禁止假设并发系统中异步进程的相对执行速度。