阅读更多
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

本文转自:伯乐在线 作者:黄小非
  • 大小: 271.8 KB
  • 大小: 22.9 KB
来自: 伯乐在线
0
0
评论 共 1 条 请登录后发表评论
1 楼 linanlin 2015-10-30 17:24
c++要自己释放资源,写代码很容易挖坑

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • c++并发编程

    众所周不知,掌握多线程开发得计算机天下。接下来,让我们从C++11标准开始学习并发编程。从线程的管控到线程间共享数据,再到并发操作同步,再到……

  • 为什么感觉 C和C++ 不火了?

    你身边的所有电子设备内,都是C或者C++写的, 会淘汰吗,有本事你们别用电子设备,C语言和C++在互联网领域热度肯定不如Java、python、js,我现在做的是工业软件,在工业软件、机器人、自动驾驶、嵌入式等等工业自动化...

  • 【干货】带你读懂c++的using namespace std;

    记得在我学习c++面向对象编程(oop)时和小郭同志在学校饭堂吃饭 当时在畅谈人生。书生意气,挥斥方遒 突然,小郭给我说了一件事,小郭当时说他感觉c++学的还差不多,结果有一位朋友提了一个问题: 你知道using ...

  • 有什么好的并发编程书籍推荐?还真有一本

    《C++并发编程实战》(第2版)由C++标准委员会成员编写,囊括C++并发编程多个方面。作者Anthony Williams独自起草并参与编写了许多与多线程和并发相关的提案,这些提案塑造了C++标准的一部分。Anthony Williams持续...

  • 听Ruby之父畅谈编程语言的设计

    本文摘自《松本行弘:编程语言的设计与实现》 1-1 自己创造编程语言的意义 ...大家都知道我是编程语言 Ruby 的作者,我其实还是一个编程语言迷,对编程语言的痴迷程度无人能及。Ruby 是我出于兴...

  • struct和class之间问题(+引发的个人思考,和对共用体思考)

    一、C语言中的struct 在C语言中,struct是一种自定义数据类型,所以在C语言中,struct...原因很简单,C语言中结构体就是为了封装数据类型,统一为一个新的struct数据类型,既然是封装数据而存在,那么定义一个结构体不

  • 经典永不过时!重温设计模式

    | 导语在软工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在199...

  • 经典永驻,重温设计模式 |硬核!

    这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的,设计模式是针对软件设计中常见问题的工具箱,其中的工具就是各种经过实践验证的解决方案。即使你从未遇到过这些问题,...

  • 高效程序员的45个习惯:敏捷开发修炼之道

    编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的? “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会...

  • 一个合格的程序员应该读过哪些书

    ▲点击上方&quot;什么技术值得学&quot;,关注获得更多资料StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的?其实除了前10本之外,...

  • 哪本最具影响力的书,是每个程序员都应该读的?

    对我影响最大的那本书是 Robert Pirsig 的《禅与摩托车维修艺术 / Zen and the Art of Motorcycle Maintenance》。 不管你做什么事,总是要力求完美,彻底了解你手中的工具...“如果能时光倒流,回到过去,作为一个...

  • windows类书的学习心得

    本篇示范两个真实世界中的应用软件,第一个是个freethreaded OLE automation server,第二个是 ISAPI程序,是个IIS(Internet Information Server)扩充软件,示范如何和JET数据库交谈。 本书从理论到实际应用讲得很...

  • 一个合格的程序员应该读的30本书

    原文:...我希望这个书单列表内容丰富,可以涵盖很多东西。” 1、《代码大全》 史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,《代码大全》注重个人技术,其中所有东

  • [copy]一个合格的程序员应该读的30本书

    编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。 6、《 重构:改善既有代码的设计 》 推荐数:617 《重构:改善既有代码的设计》清晰地揭示了重构的...

  • node-v10.9.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

  • 塞北村镇旅游网站设计与实现

    城市旅游产业的日新月异影响着村镇旅游产业的发展变化。网络、电子科技的迅猛前进同样牵动着旅游产业的快速成长。随着人们消费理念的不断发展变化,越来越多的人开始注意精神文明的追求,而不仅仅只是在意物质消费的提高。塞北村镇旅游网站的设计就是帮助村镇发展旅游产业,达到宣传效果,带动一方经济发展。而在线消费与查询正在以高效,方便,时尚等的特点成为广大互联网用户的首选。塞北村镇旅游网站设计与开发以方便、快捷、费用低的优点正慢慢地进入人们的生活。人们从传统的旅游方式转变为在线预览,减轻了劳动者的工作量。使得旅游从业人员有更多时间来获取、了解、掌握信息。 塞北村镇旅游网站根据当地旅游风景和特色的实际情况,设计出一套适合当地旅游信息网站,通过网络,实现该网站的推广从而达到宣传的效果。 本系统在设计方面采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。

  • 其他类别Jsp考试系统-jspks.rar

    JSP考试系统_jspks.rar是一个为计算机专业学生和教师设计的JSP源码资料包,它提供了一个全面的、易于使用的在线考试平台。这个系统是基于Java Server Pages (JSP)技术构建的,这是一种用于创建动态网页的服务器端技术。通过这个系统,用户可以创建、管理和参加在线考试。这个系统的主要功能包括:用户注册和登录,试题管理(包括添加、修改和删除试题),试卷管理(包括创建、编辑和删除试卷),考试管理(包括开始、暂停和结束考试),成绩管理(包括查看和统计成绩)等。此外,系统还提供了丰富的试题类型,如选择题、填空题、判断题和简答题等,以满足不同的考试需求。JSP考试系统的界面设计简洁明了,操作方便,无论是教师还是学生都可以轻松上手。对于教师来说,他们可以通过这个系统轻松地管理试题和试卷,节省了大量的时间和精力。对于学生来说,他们可以随时随地参加在线考试,方便快捷。总的来说,JSP考试系统_jspks.rar是一个非常实用的JSP源码资料包,它不仅可以帮助学生更好地学习和掌握JSP技术,也可以帮助教师更有效地管理在线考试。无论是对于学生还是教师,这个系统都是一个不可或缺的工具。重

  • TypeScript-2.4.1.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

  • Data-Structure-词向量

    词向量

Global site tag (gtag.js) - Google Analytics