Inside Object: 面向对象的发展 编程SmalltalkCC#C++
在我们学习了多年面向对象的思想之后,回过头来,看看面向对象是如何发展起来的,应该是一个非常有意思的事情。
面向对象(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++第一个被广泛使用的面向对象语言。
面向对象技术的出现是历史发展的必然,而他在未来还会继续发展。