写点什么

开发者应该开始学习 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:478322
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

明道云APaaS在保险业中的应用场景例举

明道云

NFT商业落地中的思考:区块链

CECBC

一口气面试7家大厂,已拿下4家offer,其实大厂没有你想象中难!

程序员小呆

Java 程序员 面试 架构师 资料

索信达助力国有大行提升监管报送质量

索信达控股

大数据 数据治理 金融监管 金融行业 银行业

#1024我在现场# 征集线索引爆大奖!

InfoQ写作社区官方

1024我在现场 热门活动

重学 Java 之 5种字符流读取方法

进击的王小二

java基础 字符流 java

怎么阅读 Linux 内核源码

程序员小呆

Java Linux 程序员 架构师

架构实战营 设计微博系统中”微博评论“的高性能高可用计算架构

💤 ZZzz💤

架构实战营

内卷把同事逼成了“扫地僧”,把 Github 上所有面试题都整理了一遍~ 足足 24W 字!

编程 程序员 IT 计算机 java

国家第一梯队!开物入选特色专业型工业互联网平台

百度大脑

人工智能 百度 智能云

真香!在Github一夜爆火的面试题库,被各大厂要求直接下架

程序员小呆

Java 程序员 面试 架构师

微博评论高性能高可用计算架构

Imaginary

山东移动用明道云赋能一线,打通业务创新最后一公里

明道云

健身房CRM软件帮你寻找更多客户

低代码小观

企业管理 管理系统 健身房 管理软件 行业

模块五作业

potti

架构实战营

Webrtc Rtp/rtcp (2)

webrtc developer

WebRTC rtp/rtcp

反序列化漏洞复现总结

网络安全学海

黑客 网络安全 信息安全 WEB安全 安全漏洞

Java核心基础——注解

老农小江

注解 java

面对疾风吧,如何搭建高协同的精准告警体系?

阿里巴巴云原生

阿里云 产品 云原生 Arms 告警运维中心 告警体系

金九银十吃透这份Spring Boot实战文档,让你超过90%的Java面试者

Java 编程 架构 面试 springboot

极光笔记丨iOS 15推送新特性

极光GPTBots-极光推送

ios 消息推送 移动端

阿里P8爆肝三月!最新出土SQL手册:收获不止SQL优化,抓住SQL的本质

Java 编程 程序员 IT 计算机

WeTest自助压测1折起,最低1分钱参与Q币抽奖

WeTest

Zookeeper配置详解

Regan Yue

zookeeper 配置 10月月更

从Android系统架构学习设计模式

轻口味

android 架构设计原则 10月月更

“区块链+物联网”融合 推动产业创新发展

CECBC

服务业CRM软件能为你提供哪些服务?

低代码小观

企业管理 CRM 管理系统 管理工具 管理软件

绝绝子!美团大牛吐血整理总结“消息队列核心知识笔记”是真的吊

进击的王小二

分布式 MQ 消息队列 java

太香了!Github疯传的阿里分布式设计实录让面试进阶齐飞!

Java 程序员 架构 面试 后端

直接霸榜Github!阿里内网流传P8大牛的“满级”分布式架构笔记,

程序员小呆

Java 程序员 面试 架构师

用区块链技术打造AEO高信用国际贸易生态圈的创新实践

CECBC

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