C++ 记事本: 从历史说起
C 的简史
在谈论 C++ 的历史那么必须先得了解 C 的历史,那么我们先来看一段来自于 <<C专家编程>> 对 C 语言史前阶段的简单阐述:
Ken Thompson(左), Dennis Ritchie (右)
听上去有些荒谬,C 语言竟然源于一个失败的的项目.1969 年,通用电气、麻省理工、学院和贝尔实验室联合创建了一个庞大的项目 -- Multics 工程。该项目的目的是创建一个操作系统,当是显然遇到了麻烦: 它不但无法交付原先所承诺的快速而便捷的在线系统,甚至连一点有用的东西都没弄出来.虽然开发小组最终勉强让 Multics 开动起来,但他们还是陷入了泥塘,就像 IBM 在 OS/360 上面一样.他们试图建立一个非常巨大的操作系统,能够应用于规模很小的硬件系统中.Mutics 成了总结工程教训的宝库,但它同时也为 C 语言体系 "小即使美" 铺平了道路.
当心灰意冷的贝尔实验室的专家们撤离 Multics 工程后,他们又去寻找其他任务.其中一名叫 Ken Thompson 的研究人员对另一个操作系统很感兴趣,他为此好几次向贝尔管理层提议,但均遭否决.在等待官方批准时,Thompson 和他的同事 Dennis Ritchie 自娱自乐,把 Thompson 的 "太空旅行软件" 移植到不太常用的 PDP-7 系统上.太空旅行软件模拟太阳系统的主要星体,把它们显示在图形屏幕上.并创建了一架航天飞机,它能够飞行并降落到各个行星上.于此同时, Thompson 加紧工作,为 PDP-7 编写了一个简易的新型操作系统.它比 Multics 简单的许多,也轻便许多.整个系统都是用汇编写的.Brian Kernighan 在 1970 年给它取名为 Unix,自嘲笑总结了从 Multics 中获取得的那些不应该做的教训.
然而上面所述的好像和 C 语言没有太大的关系.好吧是的,到目前为止所说的都是为引出下面的正文.来看一段中文 wikipedia 对 C 语言的wikipedia
而 C 语言最早是由丹尼斯·里奇为了在 PDP-11 电脑上运行的 Unix 系统所设计出来的编程语言,第一次发展在 1969 年到 1973 年之间.之所以被称为 "C" 是因为 C 语言的很多特性是由一种更早的被称为 B 语言的编程语言中发展而来.早期操作系统的核心大多由汇编语言组成,随着 C 语言的发展,C 语言已经可以用来编写操作系统的核心.1973年,Unix 操作系统的核心正式用 C 语言改写,这是 C 语言第一次应用在操作系统的核心编写上.
其实在 1970 年, Thompson 发现 BCPL 太慢了,而且缺乏运行时的支持,他将 BCPL 进行了实验性的修改,并为它起了一个有趣的名字 B 语言,意思是将 CPL 语言进行压缩,提炼出它的精华.B 是 BCPL 的一个简化版,而且被设计成专门用来进行系统编程,但它依然不能满足程序员们的要求:它的字符处理机制太丑陋了,而且浮点数运算被实现得并不是很理想,处理指针时开销太大.
过了两年即 1972 年,当 PDP-11 进入贝尔实验室时,Thompson 的同伴,同样在贝尔实验室的 Dennis Ritchie,在从 BCPL 中抽取了一些共性放入 B 语言中,对 B 进行了改进,并且在里面加入了数据类型,他把这个扩展的语言称为 NB(New B).随后,他又继续对新语言进行大量修改,似乎可以用新的名字来重新命名它了,于是他取了 B 后面的那个字母作为这种语言的名字,这就是 C 语言.(曾几何时,人们猜测 C 的后裔会被命名为 P──BCPL 的第三个字母,而不是 D,但如今最显见的 C 的后裔语言是叫 C++.).那么下图便是 C 语言大概的发展史:
后来有进过一段的时间 C 语言在此基础上得到了一些改进和发展.形成了一系列对应的体系.体系如下(若想看每个标准中对 C 语言的改进, 点这里):
C++ 由来
在 c 语言风靡一时的时候,由于 Dennis Ritchie 相信程序员能够做好自己的事情所以没有做出过多的假定.所以开发团队的专业水平会导致程序的可读性,以及维护性与扩展性有着天壤之别.于是有些人便希望引入一些特性来缓解这个问题.让程序的具有更好的模块化和可维护性.于是在 1983 年 Stroustrup 的 C++ 横空出世. 来看看 C++ 是如何由来的.下面引入一段在 wikipedia 的 C++ 发展史:
Bjarne Stroustrup
Stroustrup 工作起于1979年的 C with Classes.这个构思起源于 Stroustrup 做博士论文时的一些程序撰写经验.他发现 Simula 具备很利于大型软件开发的特点,但 Simula 的运行速度太慢,无法对现实需求发挥功效;BCPL 虽快得多,但它过于低级的特性,使其不适于大型软件的开发.当 Stroustrup 开始在贝尔实验室工作时,他有分析 UNIX 核心关于分散式计算的问题.回想起他的博士论文经验,Stroustrup 开始为 C 语言增强一些类似 Simula 的特点.之所以选择 C,是因为它适于各种用途、快速和可移植性.除了 C 和 Simula 之外,同时也从其它语言中取得灵感,如 ALGOL 68、Ada、CLU 以及 ML.刚开始时,类型、派生类、存储类型检查、内联和默认参数特性,都是通过 Cfront 引入 C 语言之中.1985 年 10 月出现了第一个商业化发布.
1983 年,C with Classes 改命名为 C++.加入了新的特性,其中包括虚函数、函数名和运算符重载、参考、常数、用户可控制的自由空间存储区控制、改良的类型检查,以及新的双斜线 (//) 单行注解风格.1985 年,发布第一版《C++程序设计语言》,提供一个重点的语言参考,至此还不是官方标准.1989 年,发布了 Release 2.0.引入了多重继承、抽象类型、静态成员函数、常数成员函数,以及成员保护.1990 年,出版了 The Annotated C++ Reference Manual.这本书后来成为标准化的基础.稍后还引入了模板、异常处理、命名空间、新的强制类型转换,以及布尔.
C++ 引进了一些列新的特性.用类来让程序具有更好的模块化,更好的可读性.用静态检查来排错.用模板来解决代码复用的问题.若还想初略地了解下 C++ 的特性可以 点这里.下图是 C++ 的大概的发展:
随着时间的推移,C++ 也形成了一系列对应的体系.体系如下:
后叙(纯属个人观点)
看完 C 与 C++ 的发展由来也可以看出 C 与 C++ 最初的设计初衷,其实每一门语言的设计,都有它的权衡.到底它是设计者怎样的愿景,语言也会在其愿景的特定条件下体现出明显的优势.熟不用其长避其短.语言的特性也一样.例如 C++ 的众多特性一样.它们都有其最适合的使用场景.在编程中应该根据场景而选择性的使用其中的特性 (而选择合适的技术去开发而不是选择最熟练的技术来开发,往往也是最难的).从而提供程序整体的可读性,维护性与扩展性.当然程序的质量,不取决于语言而取决于编码者的编码水平.所以这里不讨论 C 与 C++ 孰优孰劣.
不过 C++ 的特性众多.就像个怪胎.每个特性要是用的好的话也是可以 "一招鲜,吃遍天" 的.但是本人不是太赞成这种做法便是.放松一下.下面来幅 coolshell 21天教你学会C++ 的趣图,有兴趣的朋友可以点击上面链接查看原文:
由于 C++ 的特性众多若想要一一精通的话也是需要不少时间的.下面便是程序员自信心曲线图.同样也来至于 coolshell 中的 C++程序员自信心曲线图 (有兴趣的朋友可以 点这里)
其实,个人感觉 C++ 为一门特性非常多的语言并且它的特性相互不影响.所以这些特点导致你要在特定场景下选择合适的特性使用,否则可能会出现运行效率低下且难以维护的窘境.所以想要能够优雅的使用它或称为一名合格的 C++ 程序员必须付出一段艰辛的学习过程,去了解编译器和类背着你做了很多你不知道的事,例如去了解虚函数表,了解多重继承 (不太建议使用),了解宏和模板等等,让它称为你所使用的一种高效的开发语言.最好抛弃可以在十几天就能搞定它的想法哈.好了上一趣图作为全文结束.