指称语义简介

本文介绍了指称语义的概念,通过算术表达式和赋值语句示例阐述其基本思想,指出它将语言成分映射为数学对象,用运算表达语义。文章详细讨论了表达式的抽象语法和语义定义,强调了结构式方法在定义语义中的重要性,并提及在复杂的程序设计语言中,环境和后续等概念在语义描述中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*本文参考博客:http://xxxx.sina.com.cn/s/blog_49633a46010008r3.html */

指称语义:把语言成分映射为数学对象,然后用定义在对象上的运算所表达出的语言的语义。

    

指称语义方法定义语言的语义基本思想是:先确定指称物,然后给出语言成分至指称物的语义映象。这个映象要求满足:

(1)每个成分都对应有指称物;

(2)复合成分的指称只依赖于它的子成分的指称。

    下面以算术表达式和赋值语句及顺序语句为例给以简要说明。

    算术表达式的效果就是根据程序变量当前值计算表达式的值。程序变量的当前值可以用一个数值向量来表示。如果有k个程序变量,,…,,则k维数值向量(,,…,)表示的值为,的值为,…,的值为。程序变量的一种取值称为程序的一个状态。状态的全体集合称为状态空间,记作State。算术表达式的值的范围记作Num。算术表达式的指称物就是State至Num的一个映象,也就是根据State中的任意一个元素(即程序变量的一组取值)可求得Num中对应的一个元素(即表达式在变量的这组取值下的值)。数学中的映象只反映集合间元素的对应,用映象作为语言成分的指称物在语义的定义中就避免了涉及语言成分的执行过程。State至Num的全体映象,即全体表达式的指称物,记作State→Num。不同表达式的指称物是不同的,对算术表达式的语义下定义,就是要对每个算术表达式至其指称物的一个对应下定义,故也可表示为一种映象。

    用Exp表示算术表达式的全体,那么Exp的语义,就是Exp至指称物集合(State,Num)的映象,记作Exp→(State→Num)常量n是一种算术表达式,变量x本身也是一种算术表达式,两个算术表达式的和及积等也是算术表达式,故算术表达式Exp的抽象语法可用巴科斯范式(BNF)表示:

E∷=n|x|e+e|e×e|…

指称语义映象D可定义如下:

    第一个公式表示,无论程序处于何种状态S,常量n的值不变,为数学中相应的量n。为了区分元语言和程序设计语言,指称语义定义中将程序设计语言中的成分用[ |及| ]及括起来。第二个公式表示,变量在状态S时的值为数值向量S的第i个分量。

    第三、四个公式表示,表达式(+)和×在状态S时的值分别为子表达式和在状态S时的值的和与积。

    表达式的抽象语法规定如何用最简单的表达式常量和变量构成其他表达式。而表达式的语义定义也是先给出最简单的表达式的语义,然后按照语法的构造过程去定义其他表达式的语义,使得复合成分的语义由各成分语义复合而成。这种定义语义的方法叫作结构式方法,或叫语法引导方法。指称语义学就是一种结构式形式语义学。执行程序设计语言中的语句导致程序状态的改变(即程序变量取值的改变),故语句的指称物应是State至State的映象:State→State。定义语句的语义就相当于定义映象D:

   这表示顺序执行语句和,即先执行,并将执行后形成的新状态,作为当前状态再执行。

    实际的程序设计语言非常复杂,所定义的语义映象比之上文列举的远为复杂。为了允许同名变量在不同过程体中表示的值不同,指称语义中引进环境的概念;为了刻画程序控制的转移又引进后续的概念,这些概念在描述和简化语义定义中有重要的作用。

 

以下是在《程序设计语言概念和结构》中的叙述。

[ 指称语义综合产生程序结构的意义 ]

术语 " 指称的 "(denotational) 来自其同根的动词 " 指示 "(denote ) 。在指称方法 中语言的结构指称 ( 或者说表示 ) 了有关的意义 , 而这种意义通常是一些函数。表达式 a +b的意义就是一个从环境到值的函数 。

    一个指称语义由两部分组成 :

1) 域 , 有些像类型。它们标识出与一个语言相关的语法和语义对象。对前缀表达式语言而言 , 语义对象就是值和环境 ; 语法对象则是表达式、变量、常量以及运算符等。

2) 语义规则 , 从结构成分的语义综合产生出该结构的语义。

在指称语义方面奠基性的贡献是有关域和语义规则的严格的数学基础。

    我们现在就来设计有关 let 表达式的语义规则。

表达式 E 的语义 , 记作[|E|], 是一个从环境到值的函数(一般来说 , 相对一个结构可以存在多种与之关联的意义。如表达式有类型 , 也可以有值。草草 的前面加一个类似 vaI 或 type 的标记 , 就可以标识出该结构的各种不同语义类别 , 例如 var [|E|],type[|E|] 等等)。函数应用的方式就是将函数的参数写在函数右边。进而令 f a b 等价于 (fa)b,f a 在b 上的应用。因此 , 表达式 E 在环境 env下的值为

       [|E|] env

在这种记述方式下 , 变量 x 在环境 env 里的值就是

[|x|] env =lookup(x env) 这个规则可以读作 : “ 将表达式的 x 的意义 ( 作为函数 ) 应用于环境 env, 我们将得到值 lookup(x,env) 。”

    有关求和、乘积的语义规则为

       [| plus E1 E2 |] env=[| E1|] env+[| E2|] env

       [|times E1 E2|] env=[| E1|] env*[| E2|] env

在这两种情形下 , 表达式和它的子表达式使用的都是同一个环境。

    在有关 1et 表达式的规则里 , 应该注意的是 , 表达式 El 用的是环境 env, 而表达式 E2则使用一个修改过的环境 ( 不同于 env):

[|let x=E1 in E2|] env=[|E2|] bind (x,[|E1|]env,env)

一个let表达式在环境 env 里的值就是其子表达式在一个新环境里的值 , 新环境中将 x 约束到表达式E1环境env里的值 [|E1|]env。

 

指称语义与程序验证(来自vision.pku.edu.cn) 

指称语义学认为,程序设计语言的语义是由其语言成份的语义决定的,而程序设计语言成份的语义应该是其本身固有的,与程序设计语言的个体实现无关。指称语义的出发点是语言成份执行的最终结果,而不是其执行过程。这种执行结果是由语言成份形式后面隐藏的所指物决定的,故这种方式也称为指称语义。

指称语义的指称物均为数学对象,如整数、集合和映射等。指称物的集合称为论域。一个语言的指称语义就是确定该语言的相关论域,并给出语法成份到论域上的语义映射。一个抽象的程序设计语言程序的语义就是指称语义所指的数学对象在论域上的数学运算,其正确性证明就是指称语义相应的数学运算公式的特性(递归类型语言成份的数学运算公式特征就是其不动点的特征),这些性质是可严格推理和证明的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值