软件理论基础学习笔记——操作语义(operational semantics)


介绍

操作语义是一类形式化编程语言语义,它通过构建执行和程序的逻辑语句的证明来验证程序的某些所需属性,例如正确性和安全性。

其他的语义并不是这样的,例如指称语义是通过将数学含义赋予其术语来进行验证。

操作语义分为两类,一类是结构操作语义(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::=nXa0+a1a0a1a0×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::=truefalsea0=a1a0a1¬bb0b1b0b1

命令集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::=skipX:=ac0;c1if b then c0 else c1while b do c

IMP的状态
IMP的状态是一个函数, σ : L o c → N \sigma :Loc\rightarrow N σ:LocN,功能是每一个地址存储一个自然数

符号 Σ \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} <a0a1,σ>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 <a0a1,σ>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,σ>σ

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值