首个 C++ 编译器诞生 30 周年了,来听听 C++ 之父畅谈 C++
C++ 之父 Bjarne Stroustrup 在 cfront 诞生 30 周年的访谈。
整整30年前,CFront 1.0 连同第一版的《C++编程语言》发布。这两个东西在同一天发布,有什么重要意义吗?
其实倒没有刻意的重要意义,但我觉得同时发布是个不错的主意。因为 AT&T(美国电话电报公司,也是贝尔实验室当时的母公司)和 Addison-Wesley(著名科技书籍出版公司)当时都问我选哪天合适,我就跟他们说 10 月 14 日合适。因为那天我要在 ACM(美国计算机学会,也是计算机最高奖图灵奖的颁发机构)大会上作一个演讲,我想在演讲中宣布这个事情。
为了《C++编程语言》这本书,你已经当了两回作家了,以后可能还有更多的写作工作要做。那写书这件事情对你设计编程语言确有帮助吗?
我认为这本书是非常必要的。当时的C++社区规模还很小,但是发展却非常迅速,社区需要这本书。其实写书一开始都不是我自己的主意。Al Aho,我在贝尔实验室的邻居,是他指出社区的这种需求的。我那时完全低估了写《C++编程语言》这本书所需要的工作量。写书写得清楚明白是很困难的。我 真的是做了很多努力,以便清楚地向大家介绍C++。C++本身也做了改进,从逻辑性和功能性上做了增强,从而使我的阐述能够变得容易一些。另外,给这本书 写例程也是一个很需要技术和效率的工作。
你还记得在1985年10月14日星期一那天的感受吗?那天你发布了《A C++ Tutorial》
其实我不记得了。实际上,我对在八十年代发生的大多数事情都没什么印象了。因为我那个时候实在是太忙了。从1979年到1991年间,C++程序 员的数量每7.5个月就翻一倍。这种增长的速度造成了很大的工作量。截至到今天,C++用户的数量大约有440万,详情看《全球有多少 C/C++ 程序员?》。这对我来说可是个大日子。但是我现在唯一有印象的事情就是我拿到第一版的《A C++ Tutorial》的那一刻。
“我确实做了大量的工作,以便让大家了解C++”
感谢 Paul McJones 提供照片
在那个年代,你对C++的愿景是什么?你当时怎么看C++的前途?
很显然,当时我根本没料到C++会发展到如此数量,以及C++爆炸性的增长。我当时的注意力都放在了诸如对语言的改进,对类库的丰富,对编译器的改进,以及对语言进行推广教学上。
“今天我们熟知的很多C++特性都与那个最初的时代渊源颇深”
“人们可能都不太记得,在一开始C++是不支持参数化类型的”
另一方面,我们今天熟知的大部分C++的特性都与那个最初的年代渊源颇深。类,函数声明(函数原型),构造函数,以及析构函数都是一开始就引入的 语言特征。几年以后,我又引入了内联函数和对操作符的重载。当时对初始化和赋值的特性已经区分开了。通用的操作符重载则是几年以后引入的(大约在1983 年左右),虚函数机制也差不多是那个时候引入的。人们通常不太会记得,一开始C++是没有参数化的类型的(也就是template——译者注)。在 CFront的早期版本里,我是用一个向量宏,然后把元素的类型作为一个宏参数传入,以此来实现泛型的逻辑,这些实现都包含 在<generic.h>头文件里。随后几年,我觉得用宏的方式来实现泛型已经足够了。现在看来我当时的这种观点真是非常错误的,不过我认为 (非向量之外的)其他数据类型还是很需要参数化类型的,我的这个判断还是正确的。所以后来模板诞生了(1988年)。
C++的基本设计思想,是要给这门语言提供一种可扩展机制,以便用户可以定义强大、优雅而且高效的抽象模型。这种设计思想与面向某种特定应用的语 言截然不同。直至今日,C++仍然支持C语言的机器模型,使得用户能够在移动设备上高效合理地编程。我们也依然坚持采用循序渐进的方式对C++进行改进, 确保C++对抽象的有效支持。
想发明一种成功的编程语言的人很多,但大多数人都失败了。周围越来越多的人都在用你创造的编程语言,对此你怎么看?从你的角度,你认为这是你成功的主要原因么?
对此我的感觉是既骄傲又有点惶恐。能够创造出一个经得住考验的产品当然是很棒的,但是同样附带的责任也非常巨大——尤其是在语言进化这个方面。如 果我们能把优秀的,有用的特性加入到语言中,那么我们就为世界做了大好事,可是如果我们搞砸了,那带来的危害同样也会很大。目前,我认为C++的进化是在 有条不紊地进行。并不是说之前所有引入的特性都是成功的,但是我们引入的有用的特性要远远多于那些彻底失败的特性。每一年,C++都在朝着更好的方向发 展。如今的C++已经比1985年推出的那个1.0版本优秀了无数倍。今天,我们能够写出比以前更优雅,更高效的代码(即使是你把硬件性能的差异考虑进 来,也是如此)。
“C++的演进采用了小心谨慎,循序渐进的态度,而且与现实问题息息相关。”“C++在不停地成长。它不是一个”象牙塔项目”
提到成功的原因?原因肯定是复杂的。想要获得成功,一个语言需要满足用户的任何需求,而且还要保证在各方面都不能出错。所以在一两个点上做到世界 第一,那是完全不够的。首先,C++在那些对性能和硬件资源相关的编程方面(这个领域称为”系统编程“)独占鳌头,尤其是对那些复杂度需可控的系统更是没 有对手;其次,C++的演进采用了小心谨慎,循序渐进的态度,而且与现实问题息息相关。C++在不停地成长。它不是一个”象牙塔项目“,(目标宏大,结构 复杂但脱离现实——译者注)。最后,我认为非常重要的一点是,C++不会去迎合那些花里胡哨的东西:我采用了相对谦虚谨慎的态度来发展这门语言,并且一直 将这种风格保持了下来。
你花费了几乎毕生的精力在C++上,时至今日还非常活跃。你对这项工作如此投入的主要动因是什么?你现在是不是已经开始设计新的编程语言了呢?
“我有好几次想脱离C++的开发,但是最后总是又被拖回来继续干。”“如果要从头发明一种语言,太容易犯错了。一个成功的大系统,往往都是由一个个小系统逐步进化而来的。”
我有好几次想脱离C++的开发,但是最后总是又被拖回来继续干。我感觉从事C++方面的工作对我来说是贡献世界最好的机会了吧。毕竟,C++是我 从事研究和开发的主要工具。那些经验和教训——来自于我本人或C++社区的无数参与者——会及时反馈到语言本身,以及相关类库上,这样就能让数以百万计的 人得益。
我当然有想过要设计一门更好的新语言,但对于一门语言来说,要实现从思想到工具的转变,这个过程太漫长了。况且C++在自己的地盘上几乎没有对 手,所以我还是把我的兴趣放在如何把C++打造成一套优秀工具上吧。另外还有一点,大部分新发明的语言都失败了。如果要从头发明一种语言,太容易犯错了。 一个成功的大系统,往往都是由一个个小系统逐步进化而来的。
鉴于C++漫长的进化历程以及复杂度,要把一个新特性整合到其中是非常困难的,但是一旦某种特性被采纳了,那么这个特性将会被数以百万计的用户使用。这样规模形成的影响力,比创造一种新语言然后给几百个早期用户使用要大得多了。
30年了,哪些东西变了?哪些东西还维持原样呢?
机器模型没变,对(编程语言)抽象能力的追求也没有变,而且这两者像以往一样相互关联。这也是我一直强调使用静态(编译时)类型系统的原因。
对异常机制和模板这两种特性的支持大大改进了这门语言,使得人们可以书写优雅而高效的代码。我在1986年为《IEEE软件》期刊撰写的论文中, 第一次提出了这两种语言特性的概念。异常机制,连同构造函数和析构函数,在资源管理方面提供了安全保障(RAII)。模板则为 Alex Stepanov 实现STL,以及日后泛型编程的繁荣奠定了基础。在这一年里,我们实现了对概念的语言级支持,从而完成了模板机制。
“1980年后期,人们对类的层次结构的用法非常狂热。”
“我还做过报告,报告的题目就叫“C++不仅是一门面向对象编程语言”。”
“稍后,人们又对使用模板非常狂热。”
1980年后期,人们对类的层次结构的用法非常狂热。那时我倒是不愿意跟风,我更愿意把不同的编程风格混合,从而形成一个相互关联的整体。我写的 书的第一版(故意)没有使用“面向对象编程”这个词。我还做过报告,报告的题目就叫“C++不仅是一门面向对象编程语言”。稍后,人们又对使用模板进行泛 型编程,以及模板元编程非常狂热,认为语言设计的基本元素越少越好。而我则还是在寻找各种方法,来阐释我的理解,我认为优雅的编程语言是基于语言特性和类 库机制的综合体。
最近,我认为还有一件事情会在未来的几年内变得非常重要,那就是要努力制定出一套工具和类库编码指导书。这个东西会帮助C++社区更有效地应用新的语言机 制。在这方面的一个新例子,就是我们现在有工具可以用来消除“野指针”,从而为开创一个完全类型安全,资源安全的新局面提供了可能。尤其是,我们在不使用 “垃圾回收机制“(因为我们根本就不产生垃圾)的前提下避免了资源泄露,这样一来我们就不用为了增强安全性而忍受性能损失之苦了。当然, 我们不会限制C++的用途 。
我希望这能够帮助C++解决长期以来一直被人们诟病的问题:糟糕的教学和糟糕的理解,即使对于C++从业者来说也是如此。业界存在一种趋势,总是把C++ 描述成各种怪异的东西。比如,C++经常在教学中被称为是”一种增加了语言特性的 C 语言“,或者被称为”和 Java 差不多,但是不如 Java 安全,还缺少了一些高级语言特性。”这些说法对现实中C++的应用都造成了非常负面的印象。对此,我希望我最新版的 《C++之旅》 能有所帮助。我在这本书对C++语言本身,以及所有标准库都进行了高层次的描述,但是书的篇幅比经典的 K&R 的C语言教程还要少。本书面向有经验的程序员,对于完全的新手来说则不合适。
几天以后,C++委员会将在夏威夷集结,讨论下一个C++的主要版本事宜。你认为C++17将会是什么样子呢?
委员会将于下周在夏威夷的Kona开会,会后C++17将会颁布。我自己很难预测C++17会是什么样子。但是我(还是)很乐观的。C++11相对于C++98来说,是一个重大的进步,我也希望C++17相对与C++11来说,也能达成同样重大的进步吧。
英文出处: cpp-lang.io 本文转自: 伯乐在线 作者:黄小非
http://www.open-open.com/news/view/ddfd82
首个 C++ 编译器诞生 30 周年了,来听听 C++ 之父畅谈 C++的更多相关文章
- XML 标准诞生 20 周年:这个世界,它无处不在
可扩展标记语言(XML)于 1998 年 2 月 10 日成为 W3C 的推荐标准.昨天,2018 年 2 月 10 日恰好是 W3C 推出的 XML 标准发布 20 周年纪念日.可点此查看原始的新闻 ...
- ERP制造模块操作与设计--开源软件诞生30
赤龙ERP制造模块讲解--第30篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...
- IDA PRO:庆祝成立创新 30 周年
今天,IDA 已经三十岁了.为了纪念周年纪念,我们将描述史诗旅程的开始和主要里程碑. 背景 在 1990 年代初期,DOS 是最流行的 PC 操作系统,主要是 8086,偶尔有 80286(80386 ...
- JEECG-P3首个开源插件诞生!CMS网站插件 Jeecg-p3-biz-cms1.0版本发布!
Jeecg-P3-Biz-Cms ( JEECG 首个微服务插件,支持小程序的CMS系统) 是基于JEECG-P3 微服务框架开发的CMS建站系统,可轻量级集成进jeecg系统,定制各类网站模板, ...
- javascript 版的 SuperMario
注册博客园4年了,还没发表过一篇文章.明年就是超级马里奥这款游戏诞生30周年了,作为一个喜欢2d卷轴游戏的玩家,决定用js实现一个.目前只实现了基本玩法,得分什么的也还没做.项目的GitHub的地址是 ...
- Python实现图片识别加翻译【高薪必学】
Python使用百度AI接口实现图片识别加翻译 另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数字 ...
- Linux 30岁,这些年经历了什么?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 3月19日,Linux基金会在Twitter上发布推文宣布,其小企鹅的标志"Tux& ...
- Visual Studio 20周年,我和VS不得不说的故事(内含福利)
Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...
- Visual Studio 20周年,我和VS不得不说的故事
Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...
随机推荐
- Oracle 字符集的查看和修改 分类: H2_ORACLE 2013-06-19 16:52 316人阅读 评论(0) 收藏
一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...
- DI:依赖注入详解
DI(依赖注入) 依赖注入的理解: 一般写程序的时候service层都需要用到dao层,所以一般都是在service层里面new dao ,而现在利用依赖注入的方式,直接把dao给了service层 ...
- 程序猿的还有一出路:大数据project师
非常多年前我非常郁闷地写了一篇博客<程序猿的出路在哪里?>,之所以郁闷.我记得是看了中国男足的比赛,不由自主对照自已苦逼的程序猿生涯,以前对中国软件的感情有如对中国男足,绝望到没有不论什么 ...
- ChangeWindowMessageFilterEx 概述(用于取消低权限程序向高权限程序发送消息不成功的限制,分6个等级)
ChangeWindowMessageFilterEx 函数,为指定窗口修改用户界面特权隔离 (UIPI) 消息过滤器. 函数原型: BOOL WINAPI ChangeWindowMessageFi ...
- 【机器学习实战】第7章 集成方法(随机森林和 AdaBoost)
第7章 集成方法 ensemble method 集成方法: ensemble method(元算法: meta algorithm) 概述 概念:是对其他算法进行组合的一种形式. 通俗来说: 当做重 ...
- POJ1659Frogs' Neighborhood(lavel定理)
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 7260 Accepted: 31 ...
- 【codeforces 758B】Blown Garland
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树
第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树. 本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...
- Tricks(四十八)—— 注释一段代码
为 if 的条件判断表达式,传一个永假的语句,来注释一段代码: # Python if False: ... ... ... # C/C++ if (false) { ... ... } 永远不要直接 ...
- XMPP之ios即时通讯客户端开发-创建工程添加XMPPFramework及其他框架(三)
XMPPFramework GitHub: https://github.com/robbiehanson/XMPPFramework 获取源代码 git clone https://github.c ...