在我们学习了多年面向对象的思想之后,回过头来,看看面向对象是如何发展起来的,应该是一个非常有意思的事情。
面向对象(Object Oriented)编程技术最先被广泛使用的语言是C++,Bjarne Stroustrup写的《The Design and Evolution of C++》(中文名: C++语言的设计和演化)中,详细地描述了如何将C语言转变成支持对象编程的C++语言。可是要真正了解面向对象的起源,还得往前追溯。
Simula
我经常问一个傻问题,那个时代,如果不出现面向对象技术,是不是会出现其他技术?但回顾一下历史,你或许会认为,这是一个必然趋势。只是有可能名称有所变化而已。
面向对象技术的提出,最早是在编程语言Simula中提出的。其作者是Ole-Johan Dahl and Kristen Nygaard。Simula语言是两个语言的统称: SimulaI 和Simula 67(Simula 67 是在1967年发布的)。Simula语言是公认的最早的面向对象语言,虽然他的实现并不是很完整。但这是语言发展史上的一个重要的里程碑。
Kristen Nygaard在编写一个计算机模拟系统的时候,感觉到他必须找到一个更好的方式来描述和操作系统。后来Ole-Johan Dahl也加入了这个工作中来。在1962年,Kristen Nygaard在访问Univac的时候,对当时的Uniac的系统架构师Robert Bemer第一次提出了Simula中的想法,并在Robert Bemer邀请参加的第二届IFIP上,发表了《SIMULA -- An Extension of ALGOL to the Description of Discrete-Event Networks》。
在1966年,Dahl 和Nygaard 发表了关于在Simula中提出类(Class)和子类(SubClass)的概念。这些概念后来被应用到Simula 67中。1967年6月的一个会议上,Dahl建议对Type和Class概念进行明确定义,这引发了一次认真严谨的讨论,为语言的标准化奠定了基础。并在1968年2月份成立SIMULA Standards Group (SSG)来进行标准化工作。
Smalltalk
虽然Simlua是第一个实现的面向对象语言,但并不是第一个完整实现的,这点一般公认为Smalltalk语言。Smalltalk虽然并没有被广泛使用,但它对面向对象技术的推广起了非常大的作用。
Smalltalk是一个支持面向对象、动态类型、类型反射的程序语言。是Alan Kay at Xerox Palo Alto Research Center (PARC)中发明的。Alan Kay设计的系统, Dan Ingalls实现的系统。实现的版本有很多,都是在20世纪的70年代。第一个版本是Smalltalk-71。Alan Kay在设计的时候,借用了Simula的message passing思想。
在Smalltak-76的版本中,加入了inheritance。在Smalltak-80中增加了meteclasses。这实现了一个思想:一切皆对象。Smalltak-80作为第一个给PARC外界使用的版本。而现今流行的版本,也大多是这个版本的后续版本。
C++
在面向对象语言中,C++是第一个被广泛使用的面向对象语言。C++是一个从C语言演化过来的支持面向对象编程的程序语言。Bells实验室的Strustrup在1979年开始了这个跨时代的工作。
刚开始的版本叫:C with Classes。1983年10月份的时候正式命名为C++。1990年5月,Borland C++发布了第一个版本,同年6月和11月,Templates和Exceptions被接受。1992年3月,MircorSoft C++发布了第一个版本。
相比于Simula和Smalltalk,C++的成功,从一定意义上说归结于标准组织的建立和Borland公司和MicroSoft公司广泛推广。成就了C++在面向对象编程语言中的重要位置。
其他版本
在C++之后,影响巨大的就是Java和C#语言了。这两个语言都引入了虚拟机的概念。另一方面,也是更纯粹的面向对象语言。因为在C++语言中,没有类,也是可以编程的。而在Java和C#中是不可以的。
另外,Java和C#中都支持丰富的MetaClasses,这使得一切皆对象的概念支持的越发深刻。不过Java中的基础类型在这方面的并没有做到,也是一大遗憾。虽然如此,Java仍然是一个一直在学习的语言。
动态语言
在面向对象发展到现今,又出现了一些重大的变革。这就是动态语言的出现。他们也都是支持面向对象技术的。最典型的动态语言有JavaScript, Python, Ruby等等。
他们一个重大的变化就是,将类的信息改变为动态的。并提出Ducking Type的概念。这在很大程度上,提升了编程的生产力。
详细的资料可以参考Python和Ruby的介绍。
为什么是面向对象语言
为什么是面向对象语言而不是其他语言?这个问题有点愚蠢,但是纵观面向对象的发展史,其实不难发现这是软件工程发展的必然结果。在此之前,软件工程遇到了很多问题。
-
程序越来越难以掌控。
-
如果缺少了帮助,越来越难以掌握所有系统函数
-
程序难以复用以前的版本
-
编程不支持团队开发。每一个人必须了解程序中的所有地方,不能独立处理系统的一个方面。
-
业务模型难以转换到程序模型
-
独立运行良好,但集成的时候却不行。
从以上原因看,必须出现一个新的复用技术,而这个技术必须比原来的函数级别要大。这就很自然地会将函数和其他什么的东西组合在一起,进行统一封装。
因此,面向对象的出现是必然的,如果让这段历史重来的话,最多只是名称的变化而已。
总结
面向对象发展是从Simula开始的,Smalltalk第一个做了相对完整的实现,而C++第一个被广泛使用的面向对象语言。
面向对象技术的出现是历史发展的必然,而他在未来还会继续发展。
分享到:
相关推荐
《Inside C++ Object Model》是深入探讨C++面向对象模型的一份重要资料,它揭示了C++对象模型的内部机制,对于理解C++的工作原理及其面向对象特性具有极高的价值。下面将详细介绍其中的关键知识点。 1. **面向对象...
C++作为一种强类型、静态编译的面向对象编程语言,其对象模型是理解C++运行时行为的关键。本书深入到C++语言的内部,揭示了对象在内存中的表示方式、类的结构、继承、虚函数、模板等核心概念的工作原理。 1. **对象...
4. **继承与多态**:C++的继承是实现面向对象编程的关键特性。书中详述了继承层次结构中对象的构造与析构过程,以及虚函数和纯虚函数的使用,解释了多态的实现机制。 5. **模板元编程**:模板是C++中的泛型编程工具...
虚函数和纯虚函数的概念在书中会有详尽的解释,这有助于理解面向对象设计中的“鸭子类型”和“接口”。 5. **模板**:C++模板是一种泛型编程工具,允许创建泛型函数和泛型类。书中会讨论模板的实例化、模板元编程...
1. **对象模型**:C++的对象模型是其面向对象特性的基础,书中详细解释了如何在内存中表示类、对象、成员函数以及继承关系。理解对象模型有助于我们更好地理解和优化代码,避免潜在的内存问题。 2. **作用域和链接*...
本书集中讨论了支持C++面向对象编程的底层机制,包括构造函数语义、临时对象的生成、封装支持、继承以及虚函数和虚继承等内容。Lippman通过揭示这些内部机制,帮助读者更有效地编码并增加编程时的信心。 书中指出了...
虚函数使得动态绑定成为可能,允许子类重写父类的行为,是C++实现面向对象编程的关键特性。书中还会讲解模板和泛型编程,这是C++的一个强大功能,允许编写可复用的代码来处理多种数据类型。 另外,书中还涵盖了异常...
4. **继承和多态**:C++支持单继承和多继承,这在设计面向对象程序时提供了灵活性。虚函数和虚函数表是实现多态的关键,书中详细阐述了这两者的内部工作原理。 5. **访问控制和封装**:C++通过private、public和...
《深入C++对象模型》这本书由斯坦利·B·利普曼编写,旨在揭示支持C++面向对象编程的底层机制。下面将详细解释书中的关键知识点,并探讨它们如何帮助程序员更高效、自信地编码。 ### 一、C++对象模型的基础 #### ...
首先,我们要理解C++中的类是面向对象编程的基础,它定义了一组数据成员(即对象的状态)和成员函数(即对象的行为)。在C++中,类是模板,用于创建具有相同结构和行为的对象。通过实例化类,我们可以创建多个独立的...
《Inside the C++ Object Model》一书深入剖析了C++对象模型的核心概念和技术细节,尤其在前七章中,作者详尽地介绍了C++中对象的内部表示、虚拟函数机制、基类与派生类的关系以及编译器如何处理这些元素。...