1.1 C++与C
有人说C++语言是从C语言发展过来的,下面我们就先从C语言开始来探讨一下C语言和C++语言的发展历史。
1.1.1 C语言
早期的操作系统等系统软件主要是用汇编语言编写的,如UNIX操作系统。由于汇编语言依赖于计算机硬件,程序的可读性和可移植性都比较差。为了提高可读性和可移植性,最好改用高级语言,但一般高级语言难以实现汇编语言的某些功能,而汇编语言可以直接对硬件进行操作,例如,对内存地址的操作、对位(bit)操作等。人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,于是C语言就应运而生了,之后成为国际上广泛流行的计算机高级语言。它适合作为系统描述语言,既可用来写系统软件,也可用来写应用软件。
C语言是在B语言的基础上发展起来的,它的根源可以追溯到ALGOL 60。1960年出现的ALGOL 60是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统程序,1963年英国剑桥大学推出了CPL(Combined Programming Language)。CPL在ALGOL 60的基础上更接近硬件,但规模比较大,难以实现。1967年英国剑桥大学的Matin Richards对CPL作了简化,推出了BCPL(Basic Combined Programming Language)。1970年美国贝尔实验室的Ken Thompson以BCPL为基础,又作了进一步简化,它使得BCPL能挤压在8KB内存中运行,这个很简单而且很接近硬件的语言就是B语言(取BCPL的第一个字母),并用它写了第一个UNIX操作系统,在DEC PDP-7上实现。1971年在PDP-11/20上实现了B语言,并写了UNIX操作系统。但B语言过于简单,功能有限,并且和BCPL都是“无类型”的语言。
1972年至1973年间,贝尔实验室的D.M.Ritchie在B语言的基础上设计出了C语言(取BCPL的第二个字母)。C语言既保持了BCPL和B语言的优点(精练、接近硬件),又克服了它们的缺点(过于简单、数据无类型等)。最初的C语言只是为描述和实现UNIX操作系统提供一种工具语言而设计的。1973年,K.Thompson和D.M.Ritchie两人合作把UNIX中的90%以上的功能用C语言进行了编写,即UNIX第5版。原来的UNIX操作系统是1969年由美国贝尔实验室的K.Thompson和D.M.Ritchie开发成功的,是用汇编语言写的。这样,UNIX使分散的计算系统之间的大规模联网以及互联网成为可能。
后来,C语言多次进行了改进,但主要还是在贝尔实验室内部使用。直到1975年UNIX第6版公布后,C语言的突出优点才引起人们普遍注意。1977年出现了不依赖于具体机器的C语言编译文本——可移植C语言编译程序,使C移植到其他机器时所需做的工作大大简化了,这也推动了UNIX操作系统迅速地在各种机器上实现。例如,VAX、AT&T等计算机系统都相继开发了UNIX。随着UNIX的日益广泛使用,C语言也得到迅速推广。C语言和UNIX可以说是一对孪生兄弟,在发展过程中相辅相成。1978年以后,C语言已先后移植到大、中、小、微型机上,如IBM System/370、Honeywell 6000和Interdata 8/32,且已独立于UNIX和PDP了。现在C语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一。
以1978年由美国电话电报公司(AT&T)贝尔实验室正式发表的UNIX第7版中的C编译程序为基础,Brian W.Kernighan(柯尼汉)和Dennis M.Ritchie(里奇)合著了影响深远的名著《The C Programming Language》,我们常常称它为“K&R”,也有人称之为“K&R标准”或“白皮书”(White Book),它成为后来广泛使用的C语言版本的基础,但在K&R中并没有定义一个完整的标准C语言。为此,1983年,美国国家标准化协会(ANSI)X3J11委员会根据C语言问世以来的各种版本对C进行了发展和扩充,制定了新的标准,称为ANSI C,ANSI C比原来的标准C有了很大的发展。K&R在1988年修改了他们的经典著作《The C Programming Language》,按照ANSI C标准重写了该书。1987年,ANSI又公布了新标准——87 ANSI C,目前流行的C编译系统都是以它为基础的。当时广泛流行的各种版本的C语言编译系统虽然基本部分是相同的,但也有一些不同之处。在微型机上使用的有Microsoft C(MS C)、Borland Turbo C、Quick C和AT&T C等,它们的不同版本又略有差异。到后来的Java、C++、C#都是以C语言为基础发展起来的。
1989年,C语言被ANSI标准化(ANSI X3.159-1989),标准化的目的是扩展K&R C,这个标准包括了一些新的特性。在K&R推出后,一些新的特征被“非官方”地加到C语言中。
在ANSI标准化自己的过程中,一些新的特征被加了进去。ANSI也标准了函数库。ANSI C标准被ISO(国际标准化组织)采纳成为ISO 9899。ISO的第一个版本文件在1990年出版。
在ANSI标准化后,C语言的标准在相当一段时间内都保持不变,尽管C++继续在改进。实际上,Normative Amendment1在1995年已经开发了一个新的C语言版本,但是这个版本鲜为人知。标准在20世纪90年代才经历了改进,这就是ISO9899:1999(1999年出版),这个版本就是我们通常提及的C99,它被ANSI于2000年3月采用。
在C99中包括的特性有:
❑ 可变范围的数组;
❑ 新增加的数据类型,包括long long int、布尔类型和用于表示复数的类型;
❑ 支持用//表示注释(这个特性实际上在C89的很多编译器上已经被支持了)。
但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其他一些商业编译器支持C99的大部分特性的时候,微软和Borland却似乎对此并不感兴趣。
从C语言诞生之日起直到现在,C语言已经被世界各国的程序开发人员所采用,从而成为编程语言中使用最广泛的编程语言。
1.1.2 C++
语言的发展是一个逐步递进的过程,C++是直接从C语言发展过来的。1979年4月,Bjarne博士等人开始分析研究UNIX的内核。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成了一个开发小组,专门进行研究。
当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是Bjarne博士更具有先见之明,他为了避免受到C语言局限性的影响,参考了很多语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了“//”注释,从Ada得到了模板、名字空间,从Ada、Clu和ML获得了异常。
到今天为止,C++已经有20多年的历史了,在这20多年中,大致可以分为以下三个阶段。
❑ 第一阶段从20世纪80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大的份额。
❑ 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击。
❑ 第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
C++的发展过程中已经形成了一个自身的标准,称为标准C++,标准C++的最大好处就是可以在不同标准的C++编译器上运行并得到相同的运行结果,使用标准C++的开发人员之间可以充分地使用标准C++提供的标准库,从而提高开发人员的开发速度和工作效率,提高抽象编程的程度。
使用C++语言进行编程时可以根据实际情况采用不同的程序设计方法,在现代社会中,编程的规模既有小且经济型的又有大且复杂型的,因此,当开发人员进行编程时,就要根据实际的情况选择不同的程序设计方法,而编程语言也应该更加灵活、方便且涉及面较广,可以说C++语言是一种复合性的语言,而且这种复合不但没有以放弃计算机高效运行的速率为代价,而且在面对较复杂的编程时也提高了程序的编程质量以及程序语言的描述能力。C++语言较好地继承了C语言的优良传统,而且在C语言的基础上继续发扬光大。
1.1.3 C和C++比较
C++语言是在C语言的基础上发展起来的,C++的发展与壮大主要体现在其程序设计思想的进步,使其更加有利于大型复杂程序的开发,尤其是面向对象开发思想的提出,从很大程度上提高了开发人员的编程效率和代码组织能力,C语言到C++的转变是编程思想由面向过程的程序设计思想到面向对象的程序设计思想的转变,在本节中,我们将对C语言和C++语言进行比较。C语言主要拥有以下特点。
❑ 简洁、灵活:C语言将高级语言的基本结构和语句与低级语言的实用性进行了结合,使其可以像汇编语言一样对位、字节和地址进行操作,使得开发人员使用C语言进行编程时更加灵活。
❑ 运算符比较丰富:C语言中大概有34个运算符,使用这些运算符可以表达和计算各种各样的表达式,通过运算符的灵活使用可以表达在其他高级程序语言中才能表达的表达式。
❑ 数据结构比较丰富:C语言中除了包含其他语言中包含的基本数据类型(如整型、字符型等),还引入了指针类型的数据类型,在程序中恰当地运用指针可以极大提高程序的灵活性和工作效率。
❑ C语言是结构式的语言:程序的结构化可以降低程序之间的耦合度,利用C语言中提供的控制语句,可以很容易将C语言中的功能进行单独开发,为后期代码的维护提供了方便。
❑ 可以直接对硬件进行操作:C语言可以像汇编语言那样直接对计算机硬件进行操作,利用C语言可以进行计算机操作系统的开发,例如著名的Linux操作系统。
❑ 执行效率比较高。
❑ C语言开发出来的软件具有较强的移植性。
使用C语言进行开发的软件可以在不同的操作平台之间运行,并得到正确的结果。具有较强的移植性也是C语言一直以来受到广大开发人员青睐的一个重要特点。
C++语言从C语言的基础上发展而来,其不但继承了C语言的优点,而且还在C语言的基础之上设计出了新的编程思想,下面来着重讲述一下C++语言的优点。C++语言主要拥有以下特点。
❑C++语言继承了C语言的一些特点,不但具有面向过程的思想,还支持面向对象的思想,使熟悉C语言的程序员可以快速地进入C++领域的开发工作。
❑ C++语言生成的代码质量高且运行速度与C语言的差距在±5%之间。
❑ C++语言中引入了异常处理机制,在代码中使用异常处理机制可以提高软件系统的健壮性,使开发人员可以利用较少的代码来处理程序中的异常信息。
❑ C++语言提供了重载函数以及可以在函数中使用默认参数。重载函数的函数名可以相同但是函数的参数个数和参数类型却不可以完全相同,程序运行时系统根据参数的个数和类型来匹配相应的函数。默认参数可以使得程序员能够以不同的方法调用同一个函数,并且可以利用默认参数提供的默认参数值。如果在调用时传递了参数值,则忽略函数定义时的默认参数值。
❑ 提供了模板机制。模板技术可以大大地减少代码的开发量。模板又可以分为函数模板和类模板。模板的使用提高了代码重复使用的效率,并且减少了代码的开发成本。
❑ 类的使用,类可以将具有相同特征的一些数据、方法组织到一起,且能够很好地实现代码的封装。
❑ 除此之外,C++语言还对C语言进行了扩展,例如注释符的使用,不但继承了C语言的“/**/”注释符号,还扩展了“//”注释符号。
在现在的开发过程中,C语言和C++都扮演着重要的角色,很难从某一方面来判断到底哪种语言更加优越,C和C++语言将在很长一段时间内相互依存,程序开发者要根据实际情况以及实际工作要求来选择合适的语言进行程序的开发。