结构化操作语义
50年代是计算机语言兴起的年代,这一阶段的早期,计算机语言的设计往往要强调其"方便"的一面,而比较忽略其"严格"的一面,因而对语言的语义,甚至语法,未下严格的定义,从语言设计者和语言使用者对同一语言的语义缺乏共同的理解,造成一定程度的混乱。后来,在50年代和60年代间,面向语法的编译自动化理论研究得到了很大发展,使语法形式化研究的成果达到了实用化的地步。
语法形式化问题基本解决以后,热门逐渐把注意力集中到语义形式化方面。60年代可以说是计算机语言形式语义学正式诞生的10年,形式语义学的四大流派皆渊源于这一时期。其中1964年被认为是操作语义学和指称语义学的诞生年代,Landin关于操作语义奠基性文章"表达式的机械化处理"和Strachey关于指称语义的奠基性文章"关于形式语义学"都问世与这一年。
操作语义的基本思想是用抽象的方法描述语言中每一成分的执行效果,以免所描述的语义依赖于该语言实现时所用的具体计算机。通常地做法是设计一个抽象机,定义一组抽象状态,把语言的语法表示成抽象的形式。这种语义方法与语言实现道德关系比较紧密,但是很难用数学方法处理,而且对语义描述者个人使用的实现方法依赖很大。
抽象机是操作语义的核心,它既是现实生活中具体计算机的抽象化,又是理论研究中自动机的高级化——向着直接反映高级语言语义的方向靠近。人们希望抽象机结构简单合理,便于验证语义。人们又希望抽象机功能足够强大,便于描述高级语言的语义。由此产生了两个两个复杂度,一个是抽象机本身的复杂度MC,一个是(从高级语言到抽象机语言的)翻译复杂度TC。如何恰当地组合这一对矛盾的复杂度,决定了抽象机设计的好坏。
1981年,Plotkin提出了一种新的操作语义描述方法,称为结构化的操作语义。Plotkin的基本思想是:复合成分的操作语义应该可以归结为它的各个组成部分的操作语义。这样,在证明语义正确定性时就可以使用结构化归纳法,因此,结构化操作语义的本质是把公理化方法引入操作引入操作语义之中。
一个语言的结构化操作语义由三部组成。第一部分是语法范畴,也即在语义描述中所用到的基本语法成分;例如,一个简单语言的语法范畴可以包括一组变量,一组常量,一组函数标识符等等。第二部分是语法规则,由于这里包括上下文有关的语法,所以也叫静态语义。一般用 s 表示s是一个合法的语言成分,用表示:若s是一个合法的语言成分,则t也是一个合法的语言成分。典型例子如:
第三部分是动态语义,由一组规则(或称公理)组成,具体描述执行一个语言成分后状态起什么变化。规则的基本元素时组态,常用表示,意思是:当前状态为,待执行的程序是s。因此,例如,执行一个赋值语句的语义可以描述为
表示执行语句x:=e后,原来状态起了变化,其中x原来的值被表达式e的值代替。
更多的规则取推理形式,例如,
表示:若运行程序s的结果使s变为,状态变为,则运行程序s;t 的结果是使s;t 变为, 状态也是由变为。
结构化操作语义简称为SOS(Structured Operational Semantics)。为了给出一个程序设计语言的SOS描述,应该同时列出三部分数据(或公式),包括:语法范畴,语言规则(含静态语义)及动态语义,以后我们简称第二部分为静态语义。
语法范畴指的是该语言使用的所有语法符号。语法规则(静态语义)给出所有合法的语句结构,其中基本规则以公理形式给出,辅助规则以推理形式给出。动态语义以转换三元组的形式给出。
定义1:以s表示任意语句,表示状态(此处状态可以理解为,例如,由全体(变量,值)偶构成的集合),则对偶称为一个组态,表示当前状态为,待执行语句为s,此外也称为一个组态,表示当前状态为,但是无语句可以执行。
定义2:以e表示任意表达式,表示状态,则表示在状态之下计算表达式所得的值。
定义3:
-
是一个规则,其中a为值;
-
是一个规则,表示从组态出发,执行一定的语句后,到达组态。当为空语句时,上式右端为;
-
有限多个队则的并和交仍是规则;
-
若和 是规则,则
也是规则。表示若成立,则亦成立;
-
在一个具体的SOS中,若某规则r恒成立,且不为上式的形式,则r称为公理。若有类如上式的规则成立,则称为推理。
定义4:三元组<C,T,R>称为一个转换三元组,其中C是全体可能的组态的集合,T是全体终结组态的集合,R是全体公里和推理的结合,简称公理集合。
终结组态是指形式为的组态,或这样的组态,对它们不存在,使得
成立,并且 。
BNF是描述编程语言的文法。自然语言存在不同程度的二义性。这种模糊,不确定的方式无法精确定义一门程序设计语言。必须设计一种准确无误地描述程序设计语言的语法结构,这种严谨、简洁、易读的形式规则描述的语言结构模型称为文法。最著名的文法描述形式是由Backus定义Algol60语言时提出的Backus-Naur范式(Backus-Naur Form,BNF)及其扩展EBNF。BNF能一种简洁,灵活的方式描述语言的语法。BNF范式是一种用递归地思想来表述计算机语言符号集的定义规范,具有如下的法则:
-
::=表示定义
-
" "双引号里的内容表示字符
-
< >尖括号里的内容表示必选内容
-
| 竖线两边的是可选内容,相当于or
现在以微型语言SL为例,说明如何用SOS来描述。下面是SL语法的BNF形式,一切细节均已略去。
<语句>::= <赋值>|<条件>|<循环>|skip|<语句>;<语句>
<赋值>::= <变量>:=<A表达式>
<条件>::= if<B 表达式> then <语句> else <语句> fi
<循环>::= while<B 表达式> do <语句> od
下面给出它的各部分SOS描述。
-
语法范畴
-
变量集V,元素为x,y,z;
-
A表达式集 E,元素为
-
B表达式集,元素为 ;
-
语句集S,元素为s,t,u,v;
-
-
静态语义(语法规则)
-
动态语义(转换规则)
下面以一种稍微复杂的语言IMP(一种简单的命令式语言)进行说明
IMP语言的语法范畴:
N,数集,包括正整数、负整数和零,带符号位的正负十进制数的集合
T,真值集,T={true,false}
Loc,存储单元集,字母开头的字母数字串
Aexp,算术表达式集
Bexp,逻辑表达式集
Com,命令集
语法成分的元变量(约定):
n.m表示数集N中的元素
x,y表示存储单元集Loc中的元素
a表示算法表达式集Aexp中的元素
b表示逻辑表达式集Bexp中的元素
c表示命令集Com中的元素