介绍
操作语义是一类形式化编程语言语义,它通过构建执行和程序的逻辑语句的证明来验证程序的某些所需属性,例如正确性和安全性。
其他的语义并不是这样的,例如指称语义是通过将数学含义赋予其术语来进行验证。
操作语义分为两类,一类是结构操作语义(structural operational semantics,也叫small-step semantics),该类操作语义形式化地描述计算的各个步骤如何在计算机系统中运行,另一种叫自然语言(natural semantics,也叫big-step semantics),这类主要是描述如何获得执行的整体结果。
编程语言的操作语义描述了如何将有效程序解释为计算步骤序列,这些序列就是程序的含义,在函数式编程的上下文中,终止序列的最后一步返回程序的值。(通常,单个程序可能有许多返回值,因为该程序可能是不确定的,即使对于确定性程序,也可能有许多计算序列,因为语义可能无法准确指定到达该值的操作序列)
接下来我们将借助IMP语言来介绍操作语义,先来看一下什么是IMP语言
IMP语言
IMP语言是一种带while程序的小语言,其程序在运行时依靠一连串的显示命令进行状态转换,因此IMP被称为命令式语言。
IMP语言有一下几种形式:
1、自然数集N是非负的整数集合,n,m将表示N的元素
2、真值集T={true,false}
3、存贮变量集Loc,X,Y将表示存贮变量
4、算术表达式集Aexp,a代表算术表达式
5、布尔表达式集Bexp,b代表布尔表达式
6、命令集Com,c表示命令
IMP语言的语法
算术表达式集Aexp:
a
:
:
=
n
∣
X
∣
a
0
+
a
1
∣
a
0
−
a
1
∣
a
0
×
a
1
a::=n|X|a_{0}+a_{1}|a_{0}-a_{1}|a_{0}×a_{1}
a::=n∣X∣a0+a1∣a0−a1∣a0×a1
布尔表达式集Bexp:
b
:
:
=
t
r
u
e
∣
f
a
l
s
e
∣
a
0
=
a
1
∣
a
0
≤
a
1
∣
¬
b
∣
b
0
∧
b
1
∣
b
0
∨
b
1
b::=true|false|a_{0}=a_{1}|a_{0}≤a_{1}|\lnot b|b_{0}\wedge b_{1}|b_{0}\vee b_{1}
b::=true∣false∣a0=a1∣a0≤a1∣¬b∣b0∧b1∣b0∨b1
命令集Com:
c
:
:
=
s
k
i
p
∣
X
:
=
a
∣
c
0
;
c
1
∣
if b then
c
0
else
c
1
∣
while b do c
c::=skip|X:=a|c_{0};c_{1}|\text{if b then }c_{0}\text{ else }c_{1} |\text{while b do c}
c::=skip∣X:=a∣c0;c1∣if b then c0 else c1∣while b do c
IMP的状态
IMP的状态是一个函数,
σ
:
L
o
c
→
N
\sigma :Loc\rightarrow N
σ:Loc→N,功能是每一个地址存储一个自然数
符号 Σ \Sigma Σ表示状态集
操作语义
算术表达式的结构归纳定义:
整数求值
<
n
,
σ
>
→
n
‾
\overline{<n, \sigma>\rightarrow n}
<n,σ>→n
一个整数求值的结果是其本身
存储单元求值
<
X
,
σ
>
→
σ
(
X
)
‾
\overline{<X, \sigma>\rightarrow\sigma(X)}
<X,σ>→σ(X)
X代表存储地址,
σ
\sigma
σ是存储地址到数值的映射,所以存储单元求值就是
σ
(
X
)
\sigma(X)
σ(X)
组合算术表达式,和,积,减
<
a
0
,
σ
>
→
n
0
<
a
1
,
σ
>
→
n
1
<
a
0
∗
a
1
,
σ
>
→
n
\dfrac{<a_{0},\sigma>\rightarrow n_{0} <a_{1},\sigma>\rightarrow n_{1}}{<a_{0}*a_{1},\sigma>\rightarrow n}
<a0∗a1,σ>→n<a0,σ>→n0<a1,σ>→n1
算术规则读作如果 < a 0 , σ > → n 0 <a_{0},\sigma>\rightarrow n_{0} <a0,σ>→n0且 < a 1 , σ > → n 1 <a_{1},\sigma>\rightarrow n_{1} <a1,σ>→n1,那么 < a 0 ∗ a 1 , σ > → n <a_{0}*a_{1},\sigma>\rightarrow n <a0∗a1,σ>→n。每条规则一般包含前提和结论,前提写在上面,结论写在下面,中间用一条实线隔开,没有前提则上面为空。
命令规则
原子命令:
<
s
k
i
p
,
σ
>
→
σ
<skip, \sigma>\rightarrow\sigma
<skip,σ>→σ
<
a
,
σ
>
→
m
<
X
:
=
a
,
σ
>
→
σ
[
m
/
X
]
\dfrac{<a,\sigma>\rightarrow m}{<X:=a,\sigma>\rightarrow\sigma[m/X]}
<X:=a,σ>→σ[m/X]<a,σ>→m
顺序命令:
< c 0 , σ > → σ ′ ′ < c 1 , σ ′ ′ > → σ ′ < c 0 ; c 1 , σ > → σ ′ \dfrac{<c_{0},\sigma>\rightarrow\sigma''\qquad<c_{1},\sigma''>\rightarrow\sigma'}{<c_{0};c_{1},\sigma>\rightarrow\sigma'} <c0;c1,σ>→σ′<c0,σ>→σ′′<c1,σ′′>→σ′
条件命令:
< b , σ > → t r u e < c 0 , σ > → σ ′ < if b then c 0 else c 1 , σ > → σ ′ \dfrac{<b,\sigma>\rightarrow true\qquad<c_{0},\sigma>\rightarrow\sigma'}{<\text{if b then }c_{0}\text{ else }c_{1},\sigma>\rightarrow\sigma'} <if b then c0 else c1,σ>→σ′<b,σ>→true<c0,σ>→σ′
< b , σ > → f a l s e < c 1 , σ > → σ ′ < if b then c 0 else c 1 , σ > → σ ′ \dfrac{<b,\sigma>\rightarrow false\qquad<c_{1},\sigma>\rightarrow\sigma'}{<\text{if b then }c_{0}\text{ else }c_{1},\sigma>\rightarrow\sigma'} <if b then c0 else c1,σ>→σ′<b,σ>→false<c1,σ>→σ′
while循环命令:
< b , σ > → f a l s e < while b do c , σ > → σ \dfrac{<b,\sigma>\rightarrow false}{<\text{while b do c},\sigma>\rightarrow\sigma} <while b do c,σ>→σ<b,σ>→false
< b , σ > → t r u e < c , σ > → σ ′ ′ < while b do c , σ ′ ′ > → σ ′ < while b do c , σ > → σ ′ \dfrac{<b,\sigma>\rightarrow true\qquad<c,\sigma>\rightarrow\sigma''\qquad<\text{while b do c},\sigma''>\rightarrow\sigma'}{<\text{while b do c},\sigma>\rightarrow\sigma'} <while b do c,σ>→σ′<b,σ>→true<c,σ>→σ′′<while b do c,σ′′>→σ′