当前位置: 首页 > news >正文

为什么每一名程序员都应该学习 C++?

351dce9be29e7a411d1b95a7e2870474.gif

文章来源: InfoQ 架构头条

作者 | Shalitha Suranga

译者 | 平川

策划 | 闫园园

本文最初发布于 Level Up Coding 博客。

1 掌握 C++ 可不容易,但一旦你掌握了,就会获得丰厚的回报。

通常,程序员在他们的编程生涯中会使用多种编程语言。然而,我们也看到,有些程序员一直在使用同一种编程语言。例如,我们经常遇到有几十年经验的 Java 专家和 C# 专家。但是,学习多种语言会使你在软件开发生涯中更加自信和娴熟。例如,如果你掌握了 Go 语言,你就会了解几个令人印象深刻的语言设计概念,提高自己的通用编程技能。

学习 Python 也很好,因为我们可以用 Python 知识来编写任何自动化脚本,而且很有成效。学习一种新的编程语言无疑会给我们带来独特的经验和新的技术专长。与其他流行的编程语言相比,C++ 语言能带给我们许多好处。与其他现代语言不同,学习 C++ 确实不容易,很费时间。因此,现在大多数程序员都跳过了 C++ 的学习,并且更喜欢那些提供更抽象的开发环境的现代语言。

我将解释一下,为什么学习 C++ 是所有努力成为编程专家的程序员的必修课。

2 C++ 激励你学习计算机科学基础知识

每一个技术上合理的软件程序背后,都可以找出几个核心的计算机科学理论。例如,Git 程序使用了图论、散列和许多基本的计算机科学算法。例如,以下是 Git 代码库中的合并排序实现:

c80aa044106fc276c1b0c360c0c74eae.pngGit 中的合并排序实现,作者截图

如今,每个商业实体通常都会向云计算生态系统发展,并努力实现业务流程的自动化。因此,现在大多数程序员通过编程解决商业问题,而不是与计算机科学相关的问题。

但是,即使是从事面向商业的软件开发项目,他们也经常要运用计算机科学理论来编写更好的代码,使软件更有效率。因此,对每个程序员来说,计算机科学理论知识都是必不可少的。

毫无疑问,C++ 是一种高级语言,它提供了比 C 语言更高级、对人更友好的抽象。但是,C++ 鼓励人们像 C 语言一样使用指针和手动管理内存。另外,C++ 标准库的设计注重计算机科学概念、性能和灵活性,而不是仅仅注重开发的便利性。因此,当你学习 C++ 时,会无意中学习到计算机科学的基础知识。

3 使用 C++ 构建轻量级、高性能、简单的解决方案

大多数现代编程语言专注于用类似伪代码的语法来隐藏底层技术细节,而在性能、轻量化和灵活性方面考虑不多。但是,C++ 仍然可以生成轻量级的二进制文件,是编写性能优先的软件系统的最佳选择。

像 Golang 这样符合现代潮流的编程语言,通过提供类似 C 语言的最小语法和自动内存管理(通过垃圾收集)与 C++ 竞争。但是,Go 会生成很大的二进制文件,所以它不适合于轻量级的场景。这就是为什么大多数程序员使用 Go 来构建高性能的云工具,因为对云环境来说,二进制文件的大小并不是问题。在高性能、轻量级的软件开发方面,程序员仍然喜欢用 C++ 而不是 Go。

Go 通常是静态链接标准库实现,当我们导入 fmt 时,它会将一个 1.2MB 的 Go 最小二进制文件增加到 1.8MB。C++ 通常是动态链接,当我们包含 iostream 时,它会将一个 16.5KB 的最小二进制文件增加到 17.3KB。在 GNU/Linux 平台上,Go 二进制文件大小增加了 50%,而 C++ 二进制文件大小增加了不到 5%。

上述简单的实验证明,C++ 更适合于高性能、轻量级的软件开发。C++ 是一种复杂的全加载语言,但通过选择自己偏好的特性,你仍然可以编写出最小的代码。下面这篇文章将帮助你练习用任何编程语言编写最小的代码:帮助你编出更好代码的 5 个编程原则。

4 C++ 技巧能让你更快地学习其他编程

语言程序员根据自己的喜好学习各种编程语言。有些程序员在开始从事企业级软件开发项目时学习编程语言。同时,有些程序员倾向于把学习编程语言作为一种业余爱好。有些语言很容易掌握,有些则需要不断的试验来获得进一步的经验。

由于复杂的语法(C++ 有 60 个关键词)、多功能的标准库、面向硬件的开发环境以及鲜为人知的最佳实践,C++ 需要更多的时间来获得专业工作经验。C++ 是一种多范式、多功能的编程语言。换句话说,你可以在用 C++ 编写代码时制定自己的编程风格和最佳实践。

学习 C++ 标准库和开发模式需要扎实的计算机科学知识和技术能力。因此,当你精通 C++ 时,学习一门新语言就是小菜一碟。

5 与操作系统 API 交互的最佳语言

每个操作系统都为开发者提供了一个可编程接口,用于处理操作系统级的操作,如进程管理、文件处理、GUI 渲染和网络请求处理(通过套接字)。所有这些 API 都暴露了基于 C/C++ 的接口,因为每个操作系统都是用 C/C++ 编写的。

GNU/Linux 系统以 C 语言头文件的形式提供 Unix 风格的 API 和 GTK GUI 库。MacOS 也提供 Objective-C 接口,我们可以通过 Apple Clang LLVM 编译器来使用。因此,我们可以用 C++ 直接访问任何操作系统级的 API,因为 C++ 是 C 的超集,而且苹果编译器允许开发者混合使用 C++ 和 Objective-C。例如,请看 Electron 如何在 C++ 源文件中使用 GTK C 头文件:

d029d443b8283449d1dbcad966e5b92d.pngElectron 中的文件选择对话框源代码,作者截图

另一方面,其他所有的编程语言都需要特定语言的绑定来访问操作系统的 API。由于这个原因,几乎所有的操作系统级框架都是用 C++ 编写的。看看下面这些基于 C++ 的框架:

  • Electron

  • React Native

  • Flutter

  • Neutralinojs

另外,像 Chromium、Firefox、Tensorflow、LLVM 和 V8 这样的大型软件项目也使用 C++ 作为主要的开发语言。

6C++ 知识有助于你做出更好的技术决策

程序员不仅按照规范编写代码,他们还设计软件系统及组织项目结构。设计阶段在软件开发中非常重要,因为它为整个软件系统奠定了基础。我们经常要在设计阶段和开发阶段做出技术决策。

C++ 是一种复杂的语言——你有许多方法来解决同一个编程问题。另外,C++ 被设计成一门速度很快的语言,但让程序员可以充分控制程序的执行,按照自己的意愿优化代码。因此,你需要谨慎地作出技术决策,根据自己的偏好,为自己的需求选择最佳的 C++ 特性。

C++ 是一种多范式语言,尽管大家都知道它是一种基于 OOP 的语言。一些程序员使用 C++ 编程时会采用传统的 OOP 范式。同时,有些程序员使用 C++ 编程时会采用过程以及函数编程范式。有时,我们经常不得不避免使用一些 C++ 特性,以便简化我们的源代码。例如,谷歌的 C++ 风格指南建议不要使用 C++ 异常。所有这些情况都能提高我们的技术决策能力。

7 小结

我们已经讨论了在编程生涯中学习 C++ 的好处。目前有二十多种稳定的、功能齐全的、流行的编程语言。没有一种编程语言被称为“最好的编程语言”——每一种编程语言都在特定领域有着良好的表现。因此,学习五种自己喜欢的、精心挑选的编程语言,并称它们为“我最好的编程语言”,是一个明智的决定。

如果你仔细挑选五种编程语言,从各方面进行考虑——毫无疑问,C/C++ 也会在你的名单上。我在这篇文章里介绍了我最喜欢的编程语言:每位开发人员都应该学习的 5 种编程语言。

学习 C++ 而不学习 C,就像学习 React.js 应用开发而不试验原生 JavaScript 和 DOM 一样——所以,先学习 C,然后进一步学习 C++,可以为你的编程生涯带来上面所有的好处。

感谢您的阅读。

查看英文原文:

https://levelup.gitconnected.com/why-every-programmer-should-learn-c-during-their-careers-959e1bc2ea68

RECOMMEND

推荐阅读

319722e0c7504fe2dd64803af4fcc79c.png

01

《C++程序设计语言(原书第4版)》

052d8dc249439920e14c58c7b2e6d48a.png

作者:本贾尼·斯特劳斯特鲁普

C++之父作品

豆瓣评分9.2!畅销全球40余年!

数百万程序员推崇之作!世界名校核心教材!

内容全面,探究原理,698条编程建议、1000余代码示例

推荐理由

从C++语言设计者的角度讲解了专业C++程序员需要的每个语言特性和标准库组件,并解析了它们的设计初衷、原理和制约因素,是数百万C++程序员学完后推崇备至的C++语言学习宝典。

738b9ae1980cc53eed5b17bb803c583f.png

02

《C++程序设计:原理与实践(原书第2版)》

da2c643ad438fa5f68acdcbb45d6540b.png

作者:本贾尼·斯特劳斯特鲁普

C++之父作品

豆瓣评分8.9!畅销全球20余国!

专注程序设计而非C++语言,教你编写“有用的程序”

1182道习题助你实现从“工匠”到“艺术家”的升华

推荐理由

专注于C++程序设计技术、实践和技巧,而非C++语言本身,是一本能让你学到基本的实用编程技术(包括支持这种技术的编程思想和语言工具)的最简单书籍,能帮助你理解并编写复杂的程序。它会教你编写“有用的程序”,而非“玩具程序”,帮助你实现从“工匠”(码农)到“艺术家”的升华。

544729dd8d232cf717ba67d6bf3948f0.png

03

《C++语言导学(原书第2版)》

0e262a912e5758765ede445b790de7be.png

作者:本贾尼·斯特劳斯特鲁普

C++之父作品

豆瓣评分8.9!适合有一定编程基础的程序员阅读学习

322条编程建议,3小时带你认识完整的C++

推荐理由

本书是为有其他编程语言经验(如Java)快速了解C++量身定做的,它覆盖了C++大多数语言特性和标准库组件,但只是概览,能带你在3个小时内认识完整的C++及其背后的设计思想。写作手法、内容结构、示例选取都推陈出新,不枯燥,不教条;文字虽少,内容却丰富,直指关键。

b6aa8ac4cbc77b898daa17528f3d06f8.png

04

《C++编程思想(两卷合订本)》  

28dda8d25eaddda2e71350d21b2de0a4.png

作者:(美)Bruce Eckel, Chuck Allison

荣获《软件开发》杂志评选的Jolt生产力大奖

推荐理由

本书是《C++编程思想》两卷的汇总。第1卷是在第1版的基础上进行了更加深入分析和修改后的第2版,其内容、讲授方法、选用实例以及配套的练习别具特色,可以供不同程度的读者选择阅读。第2卷介绍了C++实用的编程技术和最佳的实践方法,深入探究了异常处理方法和异常安全设计;介绍C++的字符串、输入输出流的现代用法;解释多重继承问题的难点,描述了典型的设计模式及其实现,特别介绍了多线程处理编程技术。

56ce49ac83a9def7774f7bfdbf93a2cd.png

05

《Big C++中文版(原书第3版)》  

0bc9be60a9c3b80433ce77eaa894c7c9.png

作者:(美)凯·霍斯特曼

《Java核心技术》作者作品

先学习基础理论,之后通过实例逐步掌握面向对象编程思想

推荐理由

本书由经典畅销书籍《Java核心技术》的作者Cay Horstmann撰写,非常适合C++初学者和爱好者阅读,不仅能够帮助新手快速入门,掌握基础知识,而且有益于培养读者解决实际问题的思维和能力。

书中采用传统的讲授方法,首先强调控制结构、过程分解和数组算法,在较为靠前的章节中就适时地引入了对象的概念。从第9章开始,读者将动手设计和实现自定义的类。最后介绍数据结构和算法,涉及高级C++特性。

7e1db7821eca66e3a55070d48aec15f7.png

06

《C++20编程技巧:98个问题解决方案示例(原书第2版)》  

ac531d745ae0545800d063758244764e.png

作者:J. 伯顿 布朗宁(J. Burton Browning)

布鲁斯 萨瑟兰(Bruce Sutherland)

探索C++20新特性,涵盖C++核心语言标准,

含98个实际问题解决方案示例

推荐理由

本书带你探索 C++20 的主要新特性,包括模块、概念、飞船运算符和智能指针。通过本书,你将学习数字、字符串、日期、时间、类、异常、流、流程和指针等。 此外,你还将看到各种代码示例、C++ 算法模板、并行处理、多线程和数值处理、 3D 图形编程代码等。同时,本书还提供了大量的STL模板,如函数对象模板、适配器模板、分配器模板和扩展模板。

d850189e3da7cbe1d47c7b2fee1ef838.png

直播预告

35880772ac839d04ca9a813ee3f0befa.png

fc20536d760a837c16223230899c12ac.gif

0c1575f18d66d2579fb3e136459d9ae5.png

扫码关注【华章计算机】视频号

每天来听华章哥讲书

80a4f53080eced3ed71bb588d2213c0e.gif

更多精彩回顾

书讯 | 5月书讯(上)|  元宇宙、因果推断、薛定谔方程...你关注的都在这

书讯 | 5月书讯(下)|设计致物系列+少儿编程好书推荐

资讯 | 分布式系统一致性的本质,看这篇秒懂

书单 | 知乎高赞:有哪些你看了以后大呼过瘾的数据分析书?

干货 | Go语言精进之路:你知道什么是Go语言编程思维吗?

收藏 | 终于有人把Scrapy爬虫框架讲明白了

上新 | Verilog HDL与FPGA数字系统设计第2版

赠书 | 【第102期】传统企业如何应对数字化转型?这些书给你答案

活动 | 【向上突破系列】第1期:互联网裁员潮下,去还是留?

干货 | 如果机器翻译始终存在缺陷和错误,那它还有什么用处?

157d9a4fdf210e38b29f1457bc6b5eeb.gif

45e4cfb09c236a183df55985f6bee878.gif

点击阅读全文购买

相关文章:

  • 终于有人把数据、信息、知识讲明白了
  • 因果推断会是下一个AI热潮吗?朱迪亚•珀尔新作《因果论》重磅上市!
  • 为企业数字人才建粮仓:专访极客邦科技双数研究院院长付晓岩
  • 2022美国科学院院士名单公布:图灵奖得主、龙书作者Alfred V. Aho当选!
  • 客户留存的4个产品策略
  • 5种常用格式的数据输出,手把手教你用Pandas实现
  • 漫画:什么是IaaS、PaaS、SaaS?
  • Java核心技术:日期和时间新旧API对比
  • JavaScript框架发展的四个时代,你经历过其中几个阶段?
  • C#代码整洁之道:代码重构与性能提升
  • 详解边缘计算系统逻辑架构:云、边、端协同
  • 人工智能技术的演进和发展
  • 终于有人把工业数据采集讲明白了
  • 揭秘华为数字化转型框架:1套方法、4类场景、3个平台能力
  • 【第104期】7本适合设计师提升交互设计能力的书
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • android图片蒙层
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • ReactNative开发常用的三方模块
  • SpingCloudBus整合RabbitMQ
  • WebSocket使用
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • const的用法,特别是用在函数前面与后面的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​学习一下,什么是预包装食品?​
  • #if #elif #endif
  • #include到底该写在哪
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)bark-ml
  • (7)STL算法之交换赋值
  • (C++17) optional的使用
  • (Java数据结构)ArrayList
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)hibernate配置管理
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)理解angular中的module和injector,即依赖注入
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • .java 9 找不到符号_java找不到符号
  • .NET : 在VS2008中计算代码度量值
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Remoting学习笔记(三)信道
  • .NET 分布式技术比较
  • .Net8 Blazor 尝鲜
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .Net下的签名与混淆
  • @RestControllerAdvice异常统一处理类失效原因
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android Pro] AndroidX重构和映射
  • [Android]创建TabBar
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C++]拼图游戏