第一章前言 第一章前言 面向对象软件开发技术已广泛应用于软件系统的设计与构造。面向对象模型 由一组对象构成,对象之间通过发送消息进行交互,这种模型是对客观世界活动 的自然刻划,其中的对象是对客观世界中有形或无形实体的直接模拟。用面向对 象技术开发软件,能够减小问题域与解题域之间的语义间隙,使得软件开发过程 显得比较自然,从而可提高软件生产率。面向对象技术中的模块、封装、数据抽 象及继承等特性,使得它更适合于构造软件系统,并且构造出的系统具有较好的 易维护性与可重用性。 客观世界中的活动往往是并发进行的,而目前大多数面向对象模型只提供了 描述系统顺序执行的能力。为了加强面向对象模型的表达能力,必须在面向对象 模型中提供并发描述机制,使其能够描述客观世界中的并发行为。在面向对象模 型中,各对象间通过发送消息,相互影响,协作完成系统功能,其中存在着潜在 的并发执行能力。为了保证面向对象并发系统的正确执行,必须把这种潜在的并 发行为显式地表示出来,并且,所采用的并发描述机制应与面向对象模型相一致, 不损害面向对象模型已有的一些重要特性,如:封装与继承等。 本论文工作的主要目的就是研究如何在面向对象模型中引进并发描述机制, 使其能够描述客观活动的并发行为,并且,所引进的并发描述机制要与面向对象 模型相容,不破坏面向对象模型中己有的一些特性。在本章中,首先对面向对象 模型中的一些主要概念进行简要介绍:然后给出了对面向对象模型进行并发扩充 应遵循的基本原则:最后介绍本论文的主要工作和论文的安排。 1.1面向对象模型 面向对象技术首先成熟于面向对象程序设计(OOP),然后逐步应用于软件的设 计和软件的需求分析,产生了面向对象设计(OOD)和面向对象分析(OOA)2,23]。用 面向对象技术开发的系统由一组交互的软件对象构成,这些软件对象往往对应着 实际应用中一些有形或无形的实体。面向对象模型包含了许多良好的程序设计思 想,如:模块、封装、数据抽象、多态和继承等等,这些对软件的构造、维护及 重用是很有用的。下面将对面向对象模型中的一些基本概念作简单描述。 1.1.1对象与消息
第一章 前 言 1 第一章 前言 面向对象软件开发技术已广泛应用于软件系统的设计与构造。面向对象模型 由一组对象构成,对象之间通过发送消息进行交互,这种模型是对客观世界活动 的自然刻划,其中的对象是对客观世界中有形或无形实体的直接模拟。用面向对 象技术开发软件,能够减小问题域与解题域之间的语义间隙,使得软件开发过程 显得比较自然,从而可提高软件生产率。面向对象技术中的模块、封装、数据抽 象及继承等特性,使得它更适合于构造软件系统,并且构造出的系统具有较好的 易维护性与可重用性。 客观世界中的活动往往是并发进行的,而目前大多数面向对象模型只提供了 描述系统顺序执行的能力。为了加强面向对象模型的表达能力,必须在面向对象 模型中提供并发描述机制,使其能够描述客观世界中的并发行为。在面向对象模 型中,各对象间通过发送消息,相互影响,协作完成系统功能,其中存在着潜在 的并发执行能力。为了保证面向对象并发系统的正确执行,必须把这种潜在的并 发行为显式地表示出来,并且,所采用的并发描述机制应与面向对象模型相一致, 不损害面向对象模型已有的一些重要特性,如:封装与继承等。 本论文工作的主要目的就是研究如何在面向对象模型中引进并发描述机制, 使其能够描述客观活动的并发行为,并且,所引进的并发描述机制要与面向对象 模型相容,不破坏面向对象模型中已有的一些特性。在本章中,首先对面向对象 模型中的一些主要概念进行简要介绍;然后给出了对面向对象模型进行并发扩充 应遵循的基本原则;最后介绍本论文的主要工作和论文的安排。 1.1 面向对象模型 面向对象技术首先成熟于面向对象程序设计(OOP),然后逐步应用于软件的设 计和软件的需求分析,产生了面向对象设计(OOD)和面向对象分析(OOA)[12,23]。用 面向对象技术开发的系统由一组交互的软件对象构成,这些软件对象往往对应着 实际应用中一些有形或无形的实体。面向对象模型包含了许多良好的程序设计思 想,如:模块、封装、数据抽象、多态和继承等等,这些对软件的构造、维护及 重用是很有用的。下面将对面向对象模型中的一些基本概念作简单描述。 1.1.1 对象与消息
第一章前言 面向对象模型由一组互相发送消息的对象构成,其核心概念就是对象和消息。 对象是一个可标识的实体,它由状态和操作两部分构成,对象的状态由对象的局 部变量(实例变量)来表示,对象状态的改变是通过向其发送消息进行的。当对象接 收到消息后,将调用其某个方法(成员函数)来对该消息进行处理,方法的执行中有 可能改变对象局部变量的值(对象的状态)。对象的方法构成了对象的接口,获取或 改变对象的状态只能通过接口中的方法来进行。对象的这种封装特性可以看作是 对模块化和数据抽象的支持。 1.1.2类与继承 类刻划了一组具有共同特性的对象,在面向对象程序设计语言中,类是创建 对象(类的实例)的模板(Template)。 类继承是一种资源共享机制,它使得在定义新类时可利用已有类的一些信息, 这些已有的类被称为父类或超类,新定义的类被称为子类或衍生类。如只允许从 一个类继承,则称为单继承,否则,称为多继承。类继承是支持软件复用的一个 重要语言机制。 一个程序设计语言被称为面向对象的(Object-.Oriented),它首先要支持对象概 念,除此之外,它还应支持类和继承。仅支持对象的语言只能被称为基于对象的 (Object-Based)[8],如:Adal13]。 1.1.3多态和动态定连 多态是指某一论域中的元素有多种解释。在面向对象程序设计语言中,多态 主要是指一个父类指引元变量在程序运行时可指向父类和子类对象。 定连是指结构成分与其有关性质的确定和关联。在编译时刻完成的定连称为 静态定连,否则,称为动态定连。在面向对象程序设计语言中,由于多态指引元 变量的存在,往往需要动态定连。 1.1.4类型与子类型 与类和继承相关的概念是类型和子类型。在很多面向对象程序设计语言中, 用类表示对象类型,用类继承表示子类型关系,如:C++82】、E63]等,这样做 的好处在于简化程序设计,并且使静态类型检查变得容易,但同时也带来一些问 题,它造成语言的描述能力和程序的可靠性下降。因为,类实际上是给出了抽象 数据类型的实现,而类继承则是类之间的一种代码复用机制,若用类表示类型则 限制了类型的实现,用类继承表示子类型关系则要求类型间的子类型关系必须基
第一章 前 言 2 面向对象模型由一组互相发送消息的对象构成,其核心概念就是对象和消息。 对象是一个可标识的实体,它由状态和操作两部分构成,对象的状态由对象的局 部变量(实例变量)来表示,对象状态的改变是通过向其发送消息进行的。当对象接 收到消息后,将调用其某个方法(成员函数)来对该消息进行处理,方法的执行中有 可能改变对象局部变量的值(对象的状态)。对象的方法构成了对象的接口,获取或 改变对象的状态只能通过接口中的方法来进行。对象的这种封装特性可以看作是 对模块化和数据抽象的支持。 1.1.2 类与继承 类刻划了一组具有共同特性的对象,在面向对象程序设计语言中,类是创建 对象(类的实例)的模板(Template)。 类继承是一种资源共享机制,它使得在定义新类时可利用已有类的一些信息, 这些已有的类被称为父类或超类,新定义的类被称为子类或衍生类。如只允许从 一个类继承,则称为单继承,否则,称为多继承。类继承是支持软件复用的一个 重要语言机制。 一个程序设计语言被称为面向对象的(Object-Oriented),它首先要支持对象概 念,除此之外,它还应支持类和继承。仅支持对象的语言只能被称为基于对象的 (Object-Based)[89],如:Ada[13]。 1.1.3 多态和动态定连 多态是指某一论域中的元素有多种解释。在面向对象程序设计语言中,多态 主要是指一个父类指引元变量在程序运行时可指向父类和子类对象。 定连是指结构成分与其有关性质的确定和关联。在编译时刻完成的定连称为 静态定连,否则,称为动态定连。在面向对象程序设计语言中,由于多态指引元 变量的存在,往往需要动态定连。 1.1.4 类型与子类型 与类和继承相关的概念是类型和子类型。在很多面向对象程序设计语言中, 用类表示对象类型,用类继承表示子类型关系,如:C++[82]、Eiffel[63]等,这样做 的好处在于简化程序设计,并且使静态类型检查变得容易,但同时也带来一些问 题,它造成语言的描述能力和程序的可靠性下降。因为,类实际上是给出了抽象 数据类型的实现,而类继承则是类之间的一种代码复用机制,若用类表示类型则 限制了类型的实现,用类继承表示子类型关系则要求类型间的子类型关系必须基
第一章前言 于类之间的继承关系,即使两个类的抽象行为存在子类型关系,如果它们没有继 承关系,则编译系统不会认为它们是子类型关系。另外,因为在子类中可以对父 类中的方法重定义,这样就有可能使得子类与父类有不同的行为,从而破坏子类 型关系。因此,在一些面向对象语言中把类与类型分开考虑8,53]。 1.1.5相关的术语 在有关面向对象技术的不同研究中,往往对一个相同的概念采用了不同的术 语描述,为了在论文的描述中不至于产生混淆,现将这些术语进行归类,同一类 中的术语表示相同的概念,本论文中经常交替使用它们。 (1)对象、类的实例。 (2)对象的局部变量、成员变量、实例变量。 (3)父类、超类。 (4)子类、衍生类。 (⑤)方法、成员函数、操作、消息处理过程。 1.2并发与面向对象模型 并发(concurrency)的概念伴随我们已有很长时间,几乎自从计算机出现起,并 发就受到了人们的重视,它反映了程序潜在的并行执行能力。 传统的并发模型是围绕进程的概念进行设计的,它由一组进程构成,每个进 程是一个顺序执行的过程,各进程间可以并发执行。进程在执行中可以相互通信, 交换数据。进程间通信可以采用两种方式:共享变量和消息传递,信号量、临界 区、管程和路径表达式等被用来对并发进程的操作进行同步。我们认为,进程是 一个实现级的概念,它是对客观世界活动的一种间接模拟,因此,采用进程模型 来解决客观世界中的并发问题就显得极不自然,并且也使得并发程序难以设计和 理解。 面向对象模型以一种更加直接的方式刻划客观世界中的活动,模型中存在着 潜在的并发执行能力。通过简单的观察,我们不难看出:一个对象向另一个对象 发送消息后,若不需要或不立即需要消息的处理结果,前者不必等待后者处理消 息,消息发送者和消息接受者可以并发执行:对象不都是处于被动的提供服务状 态,它们中的一些除了能通过接收消息向外提供服务外,还可以有自己的事务处 理;一个对象往往可以同时处理多个消息,等等
第一章 前 言 3 于类之间的继承关系,即使两个类的抽象行为存在子类型关系,如果它们没有继 承关系,则编译系统不会认为它们是子类型关系。另外,因为在子类中可以对父 类中的方法重定义,这样就有可能使得子类与父类有不同的行为,从而破坏子类 型关系。因此,在一些面向对象语言中把类与类型分开考虑[8,53]。 1.1.5 相关的术语 在有关面向对象技术的不同研究中,往往对一个相同的概念采用了不同的术 语描述,为了在论文的描述中不至于产生混淆,现将这些术语进行归类,同一类 中的术语表示相同的概念,本论文中经常交替使用它们。 (1)对象、类的实例。 (2)对象的局部变量、成员变量、实例变量。 (3)父类、超类。 (4)子类、衍生类。 (5)方法、成员函数、操作、消息处理过程。 1.2 并发与面向对象模型 并发(concurrency)的概念伴随我们已有很长时间,几乎自从计算机出现起,并 发就受到了人们的重视,它反映了程序潜在的并行执行能力。 传统的并发模型是围绕进程的概念进行设计的,它由一组进程构成,每个进 程是一个顺序执行的过程,各进程间可以并发执行。进程在执行中可以相互通信, 交换数据。进程间通信可以采用两种方式:共享变量和消息传递,信号量、临界 区、管程和路径表达式等被用来对并发进程的操作进行同步。我们认为,进程是 一个实现级的概念,它是对客观世界活动的一种间接模拟,因此,采用进程模型 来解决客观世界中的并发问题就显得极不自然,并且也使得并发程序难以设计和 理解。 面向对象模型以一种更加直接的方式刻划客观世界中的活动,模型中存在着 潜在的并发执行能力。通过简单的观察,我们不难看出:一个对象向另一个对象 发送消息后,若不需要或不立即需要消息的处理结果,前者不必等待后者处理消 息,消息发送者和消息接受者可以并发执行;对象不都是处于被动的提供服务状 态,它们中的一些除了能通过接收消息向外提供服务外,还可以有自己的事务处 理;一个对象往往可以同时处理多个消息,等等
第一章前言 为了保证面向对象系统的正确运行,必须要给出显式的并发描述与控制,否 则将会出现混乱,例如:当处于某状态下的一个对象不能处理某消息时,强行调 用该消息的处理方法将造成对象内部状态的破坏。另外,对一个对象的多个方法 进行并发调用,也可能造成该对象内部状态的不完整和不一致。 如何把并发与面向对象相结合?如何在面向对象模型引进并发描述机制?目 前很多人都在进行这方面的研究3,10,11,19,64,71,72,85,91,927,56,这些研究的做法各不 相同,归结起来可分为两条途径: (a)在面向对象模型中引进并发机制。 (b)在传统并发模型中引进面向对象思想。 不同的观点将产生不同的结果。()充分利用面向对象技术刻划客观世界的良 好模型能力和面向对象的各个重要特性,同时把其潜在的并发能力显式地描述出 来,使其适合于描述并发计算。(b)只是采用面向对象技术的某些思想,不是完全 的面向对象,往往舍弃了面向对象的一些重要特性,从而削弱了面向对象的模型 能力,采用(b)观点的研究结果一般是基于对象(Object--Based)而不是面向对象 (Object-Oriented)的并发系统。因此,采用(a)是一个可取的途径,它从对象模型本 身出发研究其并发能力,这样,既保留了面向对象的各个重要特性,又解决并发 程序设计问题。 然而,很多的研究表明:并发与面向对象不是正交的,并发往往与面向对象 的一些特性相冲突[59,62,85,49,71]。即使采用途径(a)来解决并发与面向对象结合问题, 也存在不同的做法,这些做法对面向对象的支持程度是不同的。例如,在一些并 发面向对象模型中就舍弃了继承特性0]。因此,在面向对象模型中引进并发机制 是一个方面,另一方面是要保证所引进的并发机制与面向对象模型相容,不破坏 面向对象模型己有的一些重要特性。 1.3主要工作 本文首先给出了在面向对象模型中引进并发应考虑的各种问题,然后,在对 这些问题及现有的一些并发面向对象模型进行分析的基础上,提出了一种基于并 发对象的并发面向对象模型,该模型主要考虑的是:
第一章 前 言 4 为了保证面向对象系统的正确运行,必须要给出显式的并发描述与控制,否 则将会出现混乱,例如:当处于某状态下的一个对象不能处理某消息时,强行调 用该消息的处理方法将造成对象内部状态的破坏。另外,对一个对象的多个方法 进行并发调用,也可能造成该对象内部状态的不完整和不一致。 如何把并发与面向对象相结合?如何在面向对象模型引进并发描述机制? 目 前很多人都在进行这方面的研究[3,10,11,19,64,71,72,85,91,92,7,56],这些研究的做法各不 相同,归结起来可分为两条途径: (a)在面向对象模型中引进并发机制。 (b)在传统并发模型中引进面向对象思想。 不同的观点将产生不同的结果。(a)充分利用面向对象技术刻划客观世界的良 好模型能力和面向对象的各个重要特性,同时把其潜在的并发能力显式地描述出 来,使其适合于描述并发计算。(b)只是采用面向对象技术的某些思想,不是完全 的面向对象,往往舍弃了面向对象的一些重要特性,从而削弱了面向对象的模型 能力,采用(b)观点的研究结果一般是基于对象(Object-Based)而不是面向对象 (Object-Oriented)的并发系统。因此,采用(a)是一个可取的途径,它从对象模型本 身出发研究其并发能力,这样,既保留了面向对象的各个重要特性,又解决并发 程序设计问题。 然而,很多的研究表明:并发与面向对象不是正交的,并发往往与面向对象 的一些特性相冲突[59,62,85,49,71]。即使采用途径(a)来解决并发与面向对象结合问题, 也存在不同的做法,这些做法对面向对象的支持程度是不同的。例如,在一些并 发面向对象模型中就舍弃了继承特性[10]。因此,在面向对象模型中引进并发机制 是一个方面,另一方面是要保证所引进的并发机制与面向对象模型相容,不破坏 面向对象模型已有的一些重要特性。 1.3 主要工作 本文首先给出了在面向对象模型中引进并发应考虑的各种问题,然后,在对 这些问题及现有的一些并发面向对象模型进行分析的基础上,提出了一种基于并 发对象的并发面向对象模型,该模型主要考虑的是:
第一章前言 (1)对象的自治性。 (2)对象的并发控制与对象的功能分开进行描述。 (3)对象内部存在并发。 (4)对象间采用同步消息发送。 (5)对象可以有自己的执行线程。 (6)模型概念简单,不给程序设计者带来太大的负担。 论文还对所提并发面向对象模型中并发对象的语义进行了描述,最后,给出 了采用论文所提模型对C++进行并发扩充的一种方案。 1.4论文安排 本论文的安排如下: 第二章分析了在面向对象模型中引进并发描述所面临的问题以及目前的一些 解决方案,并介绍了现有的一些并发面向对象模型。 第三章提出了一种基于并发对象的并发面向对象模型。 第四章对所提模型中并发对象的语义给出形式化描述。 第五章给出了用论文所提模型对C++进行扩充的一种方案。 第六章给出论文工作的总结及进一步的工作
第一章 前 言 5 (1)对象的自治性。 (2)对象的并发控制与对象的功能分开进行描述。 (3)对象内部存在并发。 (4)对象间采用同步消息发送。 (5)对象可以有自己的执行线程。 (6)模型概念简单,不给程序设计者带来太大的负担。 论文还对所提并发面向对象模型中并发对象的语义进行了描述,最后,给出 了采用论文所提模型对C++进行并发扩充的一种方案。 1.4 论文安排 本论文的安排如下: 第二章分析了在面向对象模型中引进并发描述所面临的问题以及目前的一些 解决方案,并介绍了现有的一些并发面向对象模型。 第三章提出了一种基于并发对象的并发面向对象模型。 第四章对所提模型中并发对象的语义给出形式化描述。 第五章给出了用论文所提模型对C++进行扩充的一种方案。 第六章给出论文工作的总结及进一步的工作