写点什么

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

  • 2012-12-20
  • 本文字数:1697 字

    阅读完需:约 6 分钟

随着 C++ 11 C++ 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 的 Programming Coding 子群组也有很多可以学习的东西。

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

2012-12-20 04:477881
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 137.9 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

都在说DevOps,你真正了解它吗?

龙智—DevSecOps解决方案

DevOps 运维 开发

CSS 文本阴影 text-shadow 悬停效果

南城FE

前端 动画 HTML5, CSS3 7月月更 hover

回顾V神 Rollups 神作,详解以太坊为何需要二层扩展方案

TinTinLand

区块链 科技

2022年中国移动阅读市场年度综合分析

易观分析

移动阅读

易周金融 | Q1保险行业活跃人数8688.67万人 19家支付机构牌照被注销

易观分析

金融 银行

基于STM32+华为云IOT设计的酒驾监控系统

DS小龙哥

7月月更

浅识k8s中的准入控制器

火线安全

云安全 云安全技术 云安全攻防 云安全研究

Helix Swarm中文包发布,Perforce进一步提升中国用户体验

龙智—DevSecOps解决方案

perforce Helix Core Helix Swarm

【LeetCode】粉刷房子Java题解

Albert

LeetCode 7月月更

程序员转方向

沃德

程序员 7月月更

抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

捉虫大师

开源 dubbo 问题排查 7月月更

洞见科技解决方案总监薛婧:联邦学习助力数据要素安全流通

洞见科技

数据安全 隐私计算 数据隐私计算

一个数据人对领域模型理解与深入

松子(李博源)

大数据 领域模型 模型设计

实时云交互如何助力教育行业发展

3DCAT实时渲染

实时云渲染 云交互

关于对JavaScript变量提升的理解

是乃德也是Ned

JavaScript 前端 7月月更

Node の MongoDB安装

空城机

mongodb Node 7月月更

分布式BASE理论

源字节1号

软件开发 后端开发

自主工业软件的创新与发展

Geek_2d6073

国内酒店交易DDD应用与实践——代码篇

Qunar技术沙龙

架构

Qt如何实现打包,实现EXE分享

小肉球

qt 7月月更

程序员的焦虑

沃德

程序员 7月月更

产品好不好,谁说了算?Sonar提出分析的性能指标,帮助您轻松判断产品性能及表现

龙智—DevSecOps解决方案

【一库】vueuse:我不许身为vuer,你的工具集只有lodash!

摸鱼的春哥

Vue 前端 Vue3 7月月更

结合案例:Flink框架中的最底层API(ProcessFunction)用法

百思不得小赵

大数据 flink 7月月更

实战:fabric 用户证书吊销操作流程

BSN研习社

fabric

室外LED屏幕防水吗?

Dylan

LED显示屏 室外显示屏

SpringSecurity会话管理

急需上岸的小谢

7月月更

【Docker 那些事儿】容器为什么傲娇?全靠镜像撑腰

Albert Edison

7月月更

对话龙智高级咨询顾问、Atlassian认证专家叶燕秀:Atlassian产品进入后Server时代,中国用户应当何去何从?

龙智—DevSecOps解决方案

Server Atlassian Jira DC版

小程序直播 + 电商,想做新零售电商就用它吧!

CRMEB

教你学c++算法题中最头疼的动态规划

KEY.L

7月月更

开发者应该开始学习C++吗?_C++_Jonathan Allen_InfoQ精选文章