面向对象方法、语言与支持环境的特征与缺陷

本文探讨了面向对象方法、语言及其支持环境的特征与缺陷,分析了其在模拟客观世界、再现人类思维方式、提高软件工程效率等方面的优点,同时也指出了描述局限性、概念不成熟等问题。

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

面向对象方法、语言与支持环境的特征与缺陷

国防科技大学计算机系郭浩志

(计算机世界报1995年第13期)

计算机事业发展至今,我们不仅应该按狭义(语法、语义)去把握程序语言,更应从广义,即从与其相关的方法去研讨程序语言。实际上,程序语言发展到成为一门横跨众多学科的综合性学科,它包括计算机、自然语言、程序设计、方法学、数学、数值分析、软件工程、人工智能,甚至人脑医学、心理学等学科的一些概念和特性。在计算机科学技术领域内,程序语言分支与其它分支之间更有着千丝万缕的联系。任何一种程序设计方法都需要有相应的程序语言的支持,面向对象设计方法就需要面向对象语言的充分支持。典型的面向对象语言Smalltalk-80在设计时已被合理地融合于相应的环境之中。本文试图从比较宽广的范围去讨论面向对象方法、语言与支持环境的特征与缺陷,并简要提出其当前发展的方向。
一、特征
    1.尽量逼真的模拟客观世界及其事物
            对客观世界的抽象认识,包括事物(或称对象)以及事物之间的关系。事物包括其内部特征和外部特征。事物之间的关系指它们的相互作用。倘若从突出事务之间的关系出发,则可引入面向关系的设计方法和语言(典型代表是函数型语言和逻辑型语言);倘若从突出事物的观点出发,则可引入面向事物的设计方法和语言(面向对象语言)。计算机可用来解决客观世界中越来越多的问题。一般,一个问题总可由一些事物组成,这些事物之间总存在这样或那样的联系。为了描述众多事物及其联系,在面向对象设计方法和语言中,采用了对象、类、消息和继承等为数很少的几个抽象概念。
·对象——事物的抽象(模型),它是施加于其上的操作及记录这些操作效果(状态)的集合。此操作与状态的统一体,反映对象抽象模型的共性。当然,不同对象上的操作与状态,因具体事物而异。
·类——对性质相同或相似的一组对象的抽象。
·消息——消息传递是事物之间直接联系的一种抽象。发送者(对象)将消息发送给接收者(对象),由后者执行指定的操作。
·继承——它是处于不同层次的类之间联系的一种抽象。
         凡用面向对象语言的程序描述的一切事物(包括面向对象系统的所有设施)均以对象为唯一语义模型。整个软件任务是通过诸对象(类)之间相互传递消息的手段协同完成。因此,以对象-消息为基础,整个面向对象系统中的信息表示及其处理,在表示形式和使用方式上都是非常一致的。面向对象语言程序中的任一对象,都可以是消息的发送者,也可以是消息的接收者。但无论处在什么位置,对象之间的关系都是平等的,无主副之分,只能依靠消息传递来启动执行和相互通讯。
         与强制式语言的"调用-返回"机制不同,在面向对象语言中,当一对象发出消息后,由接收者负责处理,接收者可以提供,也可以不提供处理结果;即使提供结果,也不一定非要原发送者接收。这一特征使发送者与接收者之间的并行执行成为可能。潜力很大的隐并行能力是模拟客观世界所需要的。
    2.再现人类认识事物的思维方式和解决问题的工作方式
         人类认识事物有两种典型方式:一种是由具体到抽象,从特殊到一般,即归纳方式;另一种是由抽象到具体,从一般到特殊,即演绎方式。有时也结合使用这两种方式。面向对象语言中的继承机制是认识上典型的演绎方式,而子类机制是符合认识上的归纳方式的。继承性提供了结构紧凑、类间关系清晰、消除冗余和信息共享的方法,为重用代码和设计提供了强有力的手段。程序员每次创建的类,都是系统中某已知类的子类。子类机制将整个系统中的类组织成树形结构。处于该结构上层的类反映了处于其下层诸子类的公共性质,处于下层的类,在其创建时均可按省缺描述方式自动继承和共享其父类的性质(按父类链自顶向下传递),还可拥有各自的特性。
    3.80年代程序设计方法发展的里程碑
         面向对象的设计方法,虽源自70年代中后期,但被普遍认为是80年代研究的最重要的方法之一。其在80年代的地位,如同结构程序设计在70年代的地位一样。它精心选取,并有机地集中了在它之间出现的系统层次分割法、处顶向下法、结构化程序设计方法、抽象数据类型法和结构数据设计方法之精华,较好地解决了软件部件化和重用性问题,从而大大提高了软件的可靠性、可维护性和生产率。
强制式语言采用以过程为中心的程序设计方法,过程对传递给它的数据施行操作和处理。因此,过程是主动的,数据是被动的。面向对象语言采和以对象为中心的程序设计方法,接收消息的对象在自身上完成发送消息对象所请求的操作,因此对象(即数据)是主动的,方法(即过程)是被动的。根据面同对象的特点,借助面向对象语言开发软件实际上主要是不断设计新类和创建对象的过程。
    4.软件工程思想更完美的体现
         模块化、信息隐蔽与抽象被称为软件工程的三大基本思想。这三种思想在函数型、逻辑型,乃至强制式语言中各有不同程度和特色的反映,在面向对象语言中更得到淋漓尽致的体现。它有力地支持了软件开发,增强了软件产品的可靠性、可维护性和可理解性。将一个较庞大和复杂的软件划分为若干模块,是结构程序设计的特点。面向对象设计对数据结构也加以模块化,并进一步将数据结构及对它施的操作合并为一个模块。面向对象语言采用类和对象实现模块,其封闭性、独立性和接口清晰性等方面完全可以与ADA的程序包相媲美,而在数据与处理的统一性和灵活性方面甚至超过了ADA。任一对象的内部状态和功能的实现细节对外都是不可见的,引用其功能或询问、改变其内部状态,只能通过消息传递这唯一手段来实现,这就确保了每个对象的实现都独立于其它对象的内部实现细节,很好地体现了信息隐蔽思想,进而提高了软件的可靠性。对象不仅像ADA的程序包那样,既是功能的抽象,又是数据的抽象,而且实现了二者的统一。面向对象语言站在更高的角度,统一了ADA的控制抽象、过程抽象、数据抽象和类型抽象,从而更为广泛而深刻地发展了抽象思想。可以说,无论在抽象的表达能力、级别、层次性、各层结构的一致性、共享性、可用性及反映客观事物的自然性和广泛性等诸方面,面向对象语言都向前迈进了一步。
    5.新颖友好的人机界面和集成式的软件开发环境
         以Smalltalk-80为代表的面向对象系统的人机界面,首次在高速处理器、高分辨率彩色显示设备、大容量磁盘和鼠标器等硬件的支持下,借助多窗口和多级菜单驱动等等各种软件技术,形成了一个图文并茂、有声有色、(机)内外交映、静动(态)结合的人机交互界面,使人感到对计算机的使用是一种美好的艺术享受。这种用户界面已成了当今软件竞相推出的必不可少的工具。用户和计算机的通信从过去的"记住和击打命令"方式改为"查阅菜单和移动光标"方式。面向对象语言的编程过程,一改传统的"编辑、编译、连接、运行"分别进行的模式,成为在集成开发环境支持下,将编辑、编译、连接、运行、查错、求助、操作系统状态切换等工作集成的简洁方式。
二、缺陷
         面向对象方法及其支撑语言的思想是极富魅力的。近几年,国内外计算机界掀起了一股研究面向对象的基本概念、本质、思想、方法、机制、语言实现及其应用的热潮。实际上,从计算机体系结构、方法学、软件工程、数据库、程序语言、支撑环境及其它软件活动方面陆续推出很多研究成果。然而,它毕竟还存在若干缺陷与问题,直接影响它进一步的推广尖用。
   1.描述的局限性
        虽然面向对象语言具有面向客观世界的特征,能比较简洁、尽量逼真地描述和模拟客观世界中的很多事物,基本符合人类对客观世界的认识规律,但应该说其描述能力存在一定的局限性。程序对象毕竟不是现实对象,我们尚不能笼统地说面向对象即为面向客观世界。例如,子类和继承机制适于有序世界的描述,而不适用于无序世界的描述。人类头脑中的概念也是对象,这种主观对象在用程序对象描述时会出现什么问题尚不是很清楚。
   2.概念尚不成熟,方言繁衍
         面向对象语言品种繁多,它应包含哪些基本概念,至今仍众说纷纭。最早介绍Smaltalk-80的A.Goldberg和D.Robson认为有5个:对象、消息、类、实例和方法。近几年的很多文献更趋向只提4个:对象、类、消息和继承。即使对同一概念,看法也并不完全统一,如对象至今尚无公认的严格定义。一些基本特征,如类的继承性与信息隐蔽、模块独立之间存在矛盾。
         很多流行语言在面向对象的热浪之中纷纷在不同程度上以不同方式嵌入面向对象的概念、方法和机制,摇身一变成面向对象语言,以增加市场上的竞争能力。例如,COBOL发展为ObjectCOBOL, Pascal发展为QuickPascal、TurboPascal 5.5 、C发展为C++,ADA发展为ADA9X,LISP发展为CLOS、ObjectLISP, Prolog发展为O-OProlog, FORTH发展为ObjectFORTH,汇编发展为Object汇编,……。即使被称为典型面向对象语言的Smalltalk-80,也因其缺乏强有力的继承性、并发性和模块性等性能,而在80年代中后期出现了很多旨在增加类型、并发性、分布式性能、模块性、可移植性等的Smalltalk方言。以上情况对于扩大面向对象方法的影响起到了很大的作用,但也引起了一些概念上的混乱。
   3.程序运行慢速低效,开销大
         这一方面是面向对象语言固有的缺陷,另一方面也受到支撑计算机系统的严重束缚。大致可归纳为以下几个原因(以纯面向对象语言Smalltalk为例):
(1)在系统内Smalltalk语言采用字节码解释器定义,解释器的执行速度是很缓慢的;
(2)当前用于支撑面向对象语言程序运行的绝大多数现役计算机仍属于冯·诺依曼体系。面向对象语言以对象和消息传递为基础的语义,与适于强制式语言语义的冯氏体系极不协调,实现时往往不得不依赖很多模拟软件去弥合二者之间的缝隙。这些模拟软件几乎都是慢速解释执行的,必然要付出极大的开销;
(3)系统内所有的类均是按树形结构组织的,而所求操作的方法是沿着父类链分布的,这无疑会导致方法的搜索过程比较复杂和低效;
(4)Smalltalk语言是典型的弱类型语言,它没有类型说明,程序运行之前无法确定变量的类型。因此,采用动态约束技术。在程序运行过程中,大量对操作数的类型施行动态检查和约束工作。
(5)一个面向对象语言的程序包含了许许多多大小差别极大的方法(实际上是过程),运行时不可避免地频繁进行过程调用。此外,为有助于程序检查错误,每次过程调用均必须对其所有的实例变量进行初始化,必须重新计算调用的目的地址;
(6)面向对象语言采用的消息传递通讯方式比过程调用更耗费时间,据估计约为1.75倍;
(7)面向对象语言程序频繁地生成动态数据,这不仅要求系统提供极大容量的存储空间来支持,还要求提供性能良好的快速产生、自动回收及自动空间压缩技术,否则直接影响执行速度。
   4.安全可靠性
         支持面向对象语言的环境是一种开放式的环境,用户在编程过程中创建的类随时被嵌入其中。这样,一方面系统的功能越来越强,另一方面系统也越来越庞大和复杂,从而难免会产生新类与老类之间相互协调和一致的问题,威胁着系统的安全与可靠。
   5.人类知识表示的局限性
         面向对象语言对于分类知识表示很自然,但对于启发式知识却难以表示。方法的实现具有明显的过程性。程序的执行过程实际上还是一序列状态变换,这是强制式语言的固有特性,直接影响了知识的表示能力和应用范围。
   6.实现复杂
         根源是面向对象语言与当今广泛使用的冯氏体系计算机的语义间隙很大。此外,我们不能单纯地将对象是系统中唯一元素这种过份通用的特点完全看成是个优点,实际上,它势必给实现带来很大的复杂性。
此外,面向对象语言要求用户熟记越来越多的类(包括其名字、功能、参数,甚至结构、性能);类的协议描述中的功能说明采用自然语言,不可避免地会出现二义性、不精确性等弊病。
上面我们比较集中地讨论了面向对象方法及其支撑语言的缺点,目的当然不是贬低和否定其价值,而是引起学术界重视,共同设法克服其不足,使在越来越高涨的应用热浪中能发挥出更深远的作用。
三、当今发展之我见
    我们觉得,当前应尽快统一对面向对象基本概念、方法和机制的认识,在此基础上建立具有权威的标准面向对象语言,包括其编译系统和相适应的环境,进而以该语言为核心建立相应的面向对象的计算机体系结构(至少是实验系统),为规范开展它在各方面的应用打下良好的基础。


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值