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++ 程序员必须付出一段艰辛的学习过程,去了解编译器和类背着你做了很多你不知道的事,例如去了解虚函数表,了解多重继承 (不太建议使用),了解宏和模板等等,让它称为你所使用的一种高效的开发语言.最好抛弃可以在十几天就能搞定它的想法哈.好了上一趣图作为全文结束.

C++ 记事本: 从历史说起的更多相关文章

  1. WordPress文章浏览历史插件

    选自:http://www.ludou.org/wordpress-recently-viewed.html 最近有很多网友问我,露兜博客右边栏底部的 您刚刚看过 栏目是怎么实现.其实我也是参考的这篇 ...

  2. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  3. 记事本app TOP5(个人观点)

    1.为知笔记 为知笔记定位于高效率工作笔记,主打工作笔记的移动应用,是目前国内唯一一款"工作笔记"的云笔记类产品.除了常用的笔记功能保存的网页.灵感笔记.重要文档.照片.便签等,为 ...

  4. Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?

    [梁海的回答(99票)]: 简答.一些细节暂无精力查证,如果说错了还请指出. 一句话建议:涉及兼容性考量时,不要用记事本,用专业的文本编辑器保存为不带 BOM 的UTF-8. * * * 如果是为了跨 ...

  5. python---01.各类计算机语言,python历史,变量,常量,数据类型,if条件

    一.认识计算机 1.硬件组成: CPU(大脑)  + 内存(缓冲) + 主板(连接各部分) + 电源(心脏)      + 显示器 + 键盘 +鼠标+ 显卡 + 硬盘 2.操作系统 ①windows  ...

  6. 初识java——Java程序的历史、开发和运行

    上了一节Java试听课,整理出如下笔记.     Java最新版本下载 http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...

  7. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  8. 清空Github上某个文件的历史版本

    title: 清空Github上某个文件的历史版本 author: 青南 date: 2015-01-08 16:04:53 categories: [经验] tags: [Github,histor ...

  9. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

随机推荐

  1. PHP疑惑

    <?php $a = array(); $a[0] = 1; $a[1] = 2; $b = (object)$a; var_dump($b); 怎么从对象$b 中取值??? <?php ...

  2. easyUI学习1

    panel组件: <div id="p" class="easyui-panel" title="My Panel" style=&q ...

  3. ubuntu系统 刷bios

    bios放电后,出现不能识别硬盘.进入bios将Boot设为从UEFI: ubuntu启动.

  4. 关于Yaf的一些说明[转Yaf作者]

    关于Yaf的一些说明[转Yaf作者] 说明下,这篇文章转至于yaf作者鸟哥的博文,因为最近在系统的学习Yaf框架,发现了这篇文章,感觉对于了解Yaf框架还是很有用处,所以转过来和大家分享一下 Yaf是 ...

  5. 用groovy采集网页数据

    首先,用 http://groovyconsole.appspot.com/ 测试下面的代码,发现引用总是失败. 下载了GGTS: https://spring.io/tools/ggts 测试成功: ...

  6. C#分布式缓存一:Couchbase的安装与简单使用

    一.简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和 Redis. 这两个 Cache 系统可以说是比较成熟的解决方案,也是很多系统当然的选择. Memcache的开发团队 ...

  7. 单元测试中使用Moq对EF的DbSet进行mock

    刚用上Moq,就用它解决了一个IUnitOfWork的mock问题,在这篇博文中记录一下. 开发场景 Application服务层BlogCategoryService的实现代码如下: public ...

  8. 在VS中自定义代码段

    这个功能不怎么实用,但毕竟是VS存在的一个功能点嘛,知道一点也好!说它不怎么实用是有原因的,因为现在强大的VS编辑器拥有不计其数的插件,而且这些插件也有很多很强大的!比如Resharper,Code ...

  9. windows平台下redis安装及配置文件介绍

    1.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  10. 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

    开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...