开发者应该开始学习C++吗?

标签: 开发 学习 | 发表时间:2012-12-20 18:47 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

随着 C++ 11C++ CX的引入,很多人重新燃起了对这门语言的兴趣。不少开发者,尤其是Windows开发者,都想知道是否应该放弃C#和Java,转而支持C++。John Sonmez认为这并不需要。

在“为什么C++并没有‘王者归来’( Why C++ Is Not ‘Back’)”一文中,John Sonmez认为只有如下三个原因才会使用C++:

  • 需要榨干软件每一寸可能的性能,并且想用支持面向对象抽象的语言来实现。
  • 编写直接面对硬件的代码。(例如,编写底层驱动。)
  • 内存控制与定时极为重要,因而系统的行为必须是完全确定的,还必须能够手动管理内存。(想一下控制机器移动部件的嵌入式实时操作系统。)

Herb Sutter高度称赞了这篇文章,认为文中的“观点有些深度,没有夸张”。关于C++的应用场景,他又做了一些补充:

  • 服务,依赖于运行时会更为困难。
  • 测试,对比一下全部或者大部分采用静态链接的应用程序与在最终用户机器上往往是首次执行时才编译或即时编译(JIT)的应用程序,后者无法完整地测试。

John Sonmez反对学习C++,过于复杂是原因之一。即使C++ 11让开发容易了一些,但是程序员仍然不得不学习各种老式的C++编码方法。“你会碰到20年前的C++代码,看起来就像是完全不同的语言。”为了加强其观点,他向准备应聘C++职位的开发者提出了36个问题。下面列出几条:

1.在C++中,基本数据类型有多少种初始化方式?你能都说出来吗?
12.什么是复制构造函数,何时会用到?尤其是与赋值操作符相比,你能区分吗?
16.在C++中,何时适合通过引用来返回值,何时不适合?
33.为什么绝对不应该在析构函数中抛出异常?

反对C++的另一个理由是“编程语言真正需要的是简化并提高抽象层次,而不是反其道而行之”。他继续道,

编写底层代码的需求总是存在的,但我们今天编写的大部分都是较高层次的代码。

很多年前,当我终于无法再坚持认为我用C++开发应用的速度比C#快时,我跳下了C++这条船。

我坚持良久,试图让自己相信我在C++上的所有投入并没有白费, 但是事实证明, C#带来的简化是如此之大,以至于与此相比,C++所提供的额外的力量并不值得这些额外的付出。

在文章结尾,John Sonmez说到,学习C++对于理解计算机的一般工作原理仍然是有用的,“但是我认为C++不会东山再起,这是好事”。

关于这一点,Alo补充到:

我是从C++开始的,而且我职业生涯的前四年都花在了C++上。这种经验对我非常有价值,正如您的文章中所指出的那样,因为一旦把C++学到了足够的水平,就可以很快地捡起其他任何语言;此外,还能从一个更低的层次上更深刻地理解软件工作原理——如果从其他层次更高的语言开始学习编程,获得这种知识的难度就大多了。正因如此,我一直不赞成让程序员从Java开始学起。

Richard Dunks反驳到:

我认为,在第一学期的程序设计导论课程和数据结构的教学中,C++是没什么帮助的,因为光实现就要耗费很多时间,反而让同学们忽略了他们要复现的结构。我很高兴自己能够精通C++,但我认为这并不值得,而且C++绝对不是一门万能的教学语言。

Stephen Cleary有一条评论谈到了可重用性:

我原来是C++开发者,几年之前,市场的压力让我成了一名C#开发者。C# 的确更有生产率,但是完全不可能实现C++模板那种级别的代码复用。

经典的例子就是容器、迭代器和算法这三驾马车。在C++中,能够创建一个用于任何容器的算法,而且可以在编译时对算法加以调整以便必要的情况下利用随机访问能力。你可以用C#试试。这还是尚未谈到“新C++”的情况;1998年的C++对代码复用的支持就比现在的C#好了。

关于性能,Herb Sutter给出了如下建议:

在任何语言中,如果非常关注性能,都会大量使用数组(未必“总是”使用,只是“大量”用到)。不过这在有些语言中很容易,可以很好地控制一般内存布局,特别是控制数组;而在其他语言或环境中就困难一些(有可能让你使用,但更为困难),如果这些语言或运行时特别偏爱通过指针构造的数据结构,你就不得不“放弃”或者“尽量避开”。

除了在Herb Sutter和John Sonmez的相关博客上的大量高质量评论,Reddit的 ProgrammingCoding子群组也有很多可以学习的东西。

参考英文原文Should Developers Start Learning C++?

您可能也会喜欢

相关 [开发 学习] 推荐:

HBase开发实例学习

- - 互联网 - ITeye博客
在进行Hbase开发前,需要安装JDK、 Hadoop和HBase,选择一款合适的开发IDE,具体安装方法就不介绍了,网上有很多参考资料,这里给出我的开发环境:. 操作系统:Ubuntu 14.04 LTS. Java版本:jdk1.7.0_79. Hadoop版本:hadoop-2.6.0-cdh5.7.1.

PHP API 框架开发的学习

- 郑小东 - 标点符
基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用. 对外提供的API 调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户、开发者和中小网站带来了更大的价值. 在开发API前,你需要的是给API设定一个框架,这个框架一定是要简单的且是容易扩展的. 下面就是用就来看看如何使用PHP来创建一个API.

Android Native 代码开发学习笔记

- iDesperadO - WindStorm
本文提供排版更佳的PDF版本下载. JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁. 代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码.

一份游戏开发学习路线

- -
认真学完 C++ Primer 是否有能力写个小游戏. 读完  C++ Primer,不在开发环境中写代码练习,还是啥也写不出来. 读完 C++ Primer, 同时把书中的习题和例子在开发环境中操作练习,但是不了解 Windows API 或者 QT,MFC  等框架或者其他图形库,或许就只能写出控制台小游戏.

开发者福利:iOS开发学习资源、解决方案大放送

- - ITeye博客
百度iOS入门教程 http://wenku.baidu.com/course/view/1ce3571252d380eb62946d8c . M了个J博客  http://www.cnblogs.com/mjios/tag/objective-c/  . iOS应用源码保护: http://www.ijiami.cn/ios.

我常用的iphone开发学习网站[原创]

- Azad - 博客园-首页原创精华区
Box2D的 - 首页如何只使用碰撞检测的cocos2d iPhone Box2D的|雷Wenderlich“一个SpaceManager游戏|适用于iPhone的cocos2dBox2D 论坛box2d用户手册Box2D 论坛iPhone. iOS 开发中心iOS Dev Center - Apple DeveloperIOS开发人员库Foundation框架参考内存管理编程指南:内存管理The Objective-C Programming Language.

开发者应该学习SQL的九个理由

- 飞羽飞之猪 - Solidot
Eric Tou 写道 "Jeremiah Peschka写了他认为开发者应该学习SQL的九个理由(中文):1.SQL是可移植的;2.SQL从不改变;3.SQL易于性能增益;4.SQL使你成为更好的开发者;5.增进团队间的交流;6.工作保障;7.SQL真的不那么难;8.理解什么时候不适合数据库;9.让故障排除更简单".

个人整理的前端开发相关的学习网站

- - Starming星光社最新更新
今天有空就整理一些我学习前端开发技术时常看的一些网站,希望能够对刚接触前端开发的朋友们有所帮助. 很多人不知道怎么学前端开发,这里的站点只要你都看过一遍,想必也能成个合格的前端工程师了. W3.ORG是W3C的官方网站,做前端开发的朋友是一定要经常去看看的. 理由我不想多说了,W3.ORG里的官方WEB标准文档如果你都没有认真看过,就不要说你熟悉什么WEB标准.

HTTP Server开发相关学习资料整理推介

- - IT技术博客大学习
标签:   HTTPServer.     本文整理了我在学习过程中接触到的一些与HTTP Server有关的资料、文章及书籍,在这里分享给大家,希望对大家有所帮助.     HTTP协议标准文档,所有从事HTTP相关开发的人员必备参考资料,建议仔细研读.     TCP协议标准文档.     CGI1.1协议标准文档,描述了Web Server与CGI Application通过CGI协议进行交互的所有细节.

开发者应该开始学习C++吗?

- - InfoQ cn
随着 C++ 11和 C++ CX的引入,很多人重新燃起了对这门语言的兴趣. 不少开发者,尤其是Windows开发者,都想知道是否应该放弃C#和Java,转而支持C++. John Sonmez认为这并不需要. 在“为什么C++并没有‘王者归来’( Why C++ Is Not ‘Back’)”一文中,John Sonmez认为只有如下三个原因才会使用C++:.