[拼音]:caozuo yuyixue
[外文]:operational semantics
形式语义学的一个分支。程序设计语言的实施是在具体的计算机系统中按照语言的语义编制语言的翻译程序,将语言中各个成分翻译成计算机系统中相应的一组操作。语言在计算机系统中的一种实施一旦完成,那么对这个计算机系统而言,语言各个成分的含义也就完全确定了。因此语言的实施也可用来定义语言的语义,即将语言成分所对应的计算机系统的操作作为语言成分的语义,这种语义被称作操作语义。由于语言的语义应该是标准的,不应依附于一个特定的计算机和一种具体的实施,因此操作语义学是用解释执行程序的抽象的机器来定义语言的语义。
历史和发展操作语义学的基本思想来源于程序设计语言的实施。1964年1月英国P.J.兰丁使用“栈-环境-控制-外储” 抽象机器(简称SECD机器),第一次系统地、严格地陈述了表达式的操作语义。
IBM公司的维也纳实验室 60年代在研究程序设计语言RL/1的形式定义时,提出描述操作语义的一种元语言──维也纳定义语言(简称 VDL)。1974年欧洲计算机制造商联合会和美国国家标准局正式建议使用 VDL定义的PL/1语义作为PL/1的标准。
1980年前后,英国爱丁堡大学的计算机科学家提出结构式操作语义学。它在一般的数学结构(不必是抽象机器)上用数学的归约关系建立语义的解释系统。这种方法具有指称语义学的结构式特征,并更多地略去了机器操作的细节。
基本方法表达式求值程序设计语言中的算术表达式用于加工计算机系统中现存的数据,以形成新的数据。如表达式〔(x1*x2)+1〕表示将计算机系统中对应变量x1,x2的存储单元中数据相乘,再将乘积加1,形成一个新的数据。计算机系统中保存数据的存储区可以用数据向量来表示。k个存储单元保存的数据都是1时,可用k维向量(1,1,…,1)表示。计算机系统中还要有保存程序的区域,和保存加工过程中必要信息的工作区。就此可提出一种解释执行算术表达式求值的抽象机器的模型。这个机器的存储区分成三部分:栈区(用作工作区),环境区(保存数据向量等),控制区(保存程序),整个存储区记作(st,s,c),称为抽象机器的一个大状态。这个抽象机器具有识别符号,完成算术和逻辑运算,转储信息,实现大状态之间的转移等基本功能。
这个机器的大状态转移规则分为四类。
第一类规则表示,当控制区中待执行的程序要求完成表达式(e1ope2)的求值时,抽象机就转移自己的大状态,准备先求子表达式e1和e2的值,然后再按照相应的运算op(+,-,*或其他算子),求出整个表达式的值,符号“/”用于分割存放的信息。第二类规则表示,当求值的表达式是一个常量时,则其值就是抽象机中表示这个常量的相应的量(粗体用来区别语言中的符号和在抽象机中的相应表示)。表达式的值暂存于栈区。第三类规则表示,当表达式是一个变量时,则其值就是环境区中相应单元的当前值。即第 i个变量xi的值就是数据向量s的第i个分量si的值。第四类规则表示,当运算op的两个操作数都已经求得,则可按照抽象机中的相应运算求出op作用于操作数的结果。
在这个抽象机中,表达式(x1*x2)+1(在x1,x2值为2和3时)的求值是由下述大状态的转移序列完成的,转移符号⇒的上方标有实现这一转移依据的转移规则号,设s=(2,3)。
这个抽象机正确划出算术表达式求值的全过程,故可作为算术表达式的操作语义。
赋值语句为定义赋值语句(xi:=e)的操作语义,可在上述抽象机中添加如下转移规则
第五条规则表示,当抽象机执行(xi:=e)时,先求出表达式e的值,然后再给xi赋值。
第六条规则表示,对xi赋以值n,相当于将数据向量s的第i个分量(即保存xi当前值的存储单元)改为n,表示为。
在定义程序设计语言的过程语句的操作语义时,由于不同的过程使用不同的环境、不同的栈区、不同的控制区,故引入外储区,外储区中保存有当前未调用的所有过程的全部环境区、栈区和控制区,这种机器就是兰丁的SECD抽象机。
展望人们希望语言的语义是独立于实施的,故操作语义学中使用了抽象机器,但仍不可避免地涉及语言的实施,这是它的弱点。但现代研究状况表明,操作语义学对语言的设计和实施仍有其指导作用,如在定义并发式程序设计语言的语义时,其他语义学方法都遇到了困难,而结构式操作语义学则提出了带有标号的归约规则,显示了它独有的长处。