程序理论之形式语义(formal semantics)
用数学方法,尤其是形式系统严格定义出的语言的语义。程序设计语言是人们用来和计算机系统进行通信和控制其工作的人工语言。作为语言,人工语言和自然语言一样,有其语法、语义和语用范畴。程序设计语言的语法是指程序的组成规则,语义是指程序的含义。
程序设计语言的语义通常是由设计者用一种自然语言非形式地解释,实现者和使用者则依据各自的理解去实现和使用这种语言。然而,使用自然语言和非形式化的方法解释语义,容易产生歧义,造成语言设计者、用户和实现者对语义的不同理解,影响语言的正确实施和有效使用。程序设计语言中的过程调用语句就是这方面的一个典型例子:人们发现对过程调用语句的非形式解释可能导致各种不同的理解,产生多种不同的效果。
为了正确、有效地使用程序设计语言,必须了解语言中各个成分的含义,并且要求计算机系统执行这些成分所产生的效果与其含义完全一致。人们这种对语义精确解释的要求便产生了形式语义学。形式语义学的研究始于20世纪60年代初期,在程序设计语言ALGOL60的设计中,第一次明确区分了语言的语法和语义,并使用BNF(Backus-Naur Form,巴科斯范式,它不仅能严格地表示语法规则,而且所描述的语法是与上下文无关的)符号系统成功地实现了语法的形式描述。语法的形式化大大推动了语义形式化的研究,围绕ALGOL60的语义出现了形式语义学早期的研究热潮。以后的程序设计语言,如PASCAL、Ada等,都有人给出了严格的形式语义,旨在为编译程序语言的编译程序提供正确依据。
美国斯坦福大学McCarthy于1962年系统地论述了程序设计语言形式化的重要性,以及它同程序的正确性、语言的正确实现等的关系,并提出在形式语义研究中使用抽象语法和状态向量等方法。近年来,形式语义的理论和应用都有了很大发展。
程序设计语言的语法是规定程序组成方法的一些规则,称为具体语法,但在定义程序的语义时,必须首先识别给定的程序,分析程序的语法结构。因此,在形式语义中使用一种讨论程序分解的语法规则,这种语法称作抽象语法。不同的程序设计语言往往使用不同的记号和表示方式。形式语义提供的方法适用于一切程序设计语言,故抽象语法采用的记号和表示方法也是具体语法的一种抽象。
在定义程序设计语言的语义时,需要一种定义语义的语言,这种语言称为元语言。元语言可以采用已有的数学语言,也可以是以数学理论为基础的专门设计的语言。用元语言去定义程序语言的形式语义,必须首先严格定义元语言的语义。
用程序设计语言编写的程序,规定了它对计算机系统中数据的一个加工过程,形式语义的基本方法是将程序加工数据的过程及其结果形式化,从而定义程序的语义。由于形式化中侧重面和使用的数学工具不同,形式语义主要分为四大类:
- 操作语义:着重模拟数据加工过程中计算机系统的操作;
- 指称语义:主要刻画数据加工的结果,而不是加工过程的细节;
- 公理语义:用公理化的方法描述程序对数据的加工;
- 代数语义:将程序设计语言看作是刻画数据和加工数据的一种抽象数据类型,使用研究抽象数据类型的代数方法,来描述程序设计语言的形式语义。
在后续的文章中,我们将逐个介绍这四种形式语义。

浙公网安备 33010602011771号