为什么永远不会有语言取代 C/C++?

关注+星标,每天学习C语言新技能

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源:网络

数以百计的 C/C++ 替代品将会出现,但 C/C++ 将永远与我们同在!

每个 CPU 都带有一种称为 ISA(指令集架构)汇编的电路语言。ISA 程序集是一种硬件语言,由基本数据操作、数学计算和结构化编程(即 jmp)的操作组成。但是,为每个计算需求编写汇编代码无疑是耗时的,因此过去的程序员发明了对人类友好的语言和编译器。

计算机科学家先驱 Dennis Ritchie 为 Unix 操作系统的研发需求实现了 C 语言。在这段时期,整个计算机技术领域都在进行基础的最初建设,所以几乎所有的程序员都使用 C 语言来构建早期的计算程序,比如编译器、操作系统、数据库软件和网络程序。后来,C++ 扩展了 C 语言,保留了 C 语言的性能特点,一门具有更多开发人员特性的新的编程语言诞生了。

在 20 世纪 20 年代,程序员实现了 C/ C++ 的备选品,如 Go、D、Rust 和 Carbon,它们具有 C/ C++ 从未提供的各种特性。但这些语言仍然只是 C/ C++ 的备选品,而不是替代品,原因如下:

1C 和 C++ 是基础语言

如果我们追根溯源当今活跃在我们生命中的每一款计算机程序,总会发现它们诞生自 C 或 C++。想想你现在在做什么,你可能在谷歌 Chrome 上读到这篇文章,Chrome 开源浏览器 (Blink 渲染引擎、V8 和浏览器应用程序) 是用 C++ 写的。假如你在 GNU/Linux 上运行 Chrome,Linux 内核是用 C 写的。MySQL,最流行的关系数据库管理系统,是用 C/ C++ 写的。所有流行的操作系统都为内核函数提供了核心 C 或 C++ API。

即使存在稳定的 C/ C++ 替代方案,许多程序员仍然喜欢用 C 或 C++ 进行系统编程。在大多数情况下,程序员选择 C++ 是因为它是与操作系统级 API 通信的最佳语言。例如,谷歌用 C++ 编写了 Flutter 引擎:

f0c80fbbc628dcdb931cd2a4d0b141a5.png

Flutter 引擎使用 C/ C++ 应用 GTK 库函数,

截图由作者提供

数十年来,计算领域的大多数核心组件都使用 C/ C++ 作为实现语言,C/ C++ 语言也长期维持着语言语法的标准。打造 C/ C++ 的替代品就像在所有的建筑工程完工之后改变房子的地基。

2C 和 C++ 完全控制我们所写的内容

在编写源代码时,C/ C++ 可以自由地处理程序资源。例如,C/ C++ 允许你直接分配 / 释放用于存储数据元素的物理内存。C/ C++ 提供了一种使用本机操作系统级线程的方法,而不是像 Go 那样管理单独的并发运行时。C/ C++ 没有提供自动内存管理 (垃圾回收) 特性,因此程序员应该谨慎有效地防止内存泄漏。看看 Meta 的 Folly 库源代码是如何实现手动内存管理策略的:

fe43b318b34cf5bb1c9f336603301125.png

Meta 的 Folly 库使用了手动内存管理功能

自动内存管理和内存处理的限制无疑是使语言变得现代、高效和更抽象的好方法,但是这些特性会在语言运行时产生性能开销,并降低程序员的自由度。

C 和 C++ 不限制内存访问,提供手动的内存管理操作,让程序员按照自己的意愿控制程序,从而把自由给了程序员。当你用 C/ C++ 编写程序时,你的源代码将有效地执行你指示的操作,就是这样。

3C 和 C++ 确实又快又高效

一个特定程序的效率取决于两个主要因素:程序员使用的算法的时间复杂度和二进制程序的效率。毫无疑问,我们可以控制算法的复杂性,因为我们可以通过更新源代码来改变它们。另一方面,二进制文件是编译器生成的,因此我们无法轻易从这方面提高效率。

但是,我们可以选择一个能够生成快速有效的二进制文件的编译器。GNU 编译器生成特定于平台的二进制文件,而不嵌入专用的运行时环境。C 编程执行模型使用 crt0 汇编指令段中定义的最小启动代码。看看下面的例子,Linux 上的 crt0 部分:

157a11e4dc59845e2c94f084c7fe4a85.png

在 C 语言中 main 函数之前执行的启动代码

C++ 无疑是一门复杂的语言,但它不像 Python 和 Golang 那样提供更高的抽象。此外,它还为你提供了一种使用首选标准语言版本 (即 C++ 14) 进行编译的方法。因此,自现代 C++ 特性使 C++ 开发复杂化以来,你可以只使用 C++ 中最小的特性。C++ 已经有 30 多年的历史了,并且从早期计算时代开始就对其性能进行了优化。

4C 和 C++ 是学术友好型语言

程序员编程通常始于职业生涯的不同阶段。一些程序员在他们上学的时候就使用第一台计算机设备学习编程。然而,大多数程序员都是在大学期间提高他们的编程技能的。幸运的是,几乎所有的大学都是为了让学生有机会学习计算机程序如何与硬件组件一起工作而开始教授了 C 语言编程。我写了以下文章来进一步解释计算机程序是如何与硬件连接的:

编写优化代码前需要知道的 5 件事

https://www.infoq.cn/link?target=https%3A%2F%2Flevelup.gitconnected.com%2F5-things-to-know-before-you-write-optimized-code-3ca424110db1

这些事实有助于您以优化的性能给硬件和程序员留下深刻印象

https://www.infoq.cn/link?target=https%3A%2F%2Flevelup.gitconnected.com%2F5-things-to-know-before-you-write-optimized-code-3ca424110db1

后来,大多数大学教授 C++ 的数据结构和算法基础知识,而不使用 C++ 的复杂部分。大学生通常在学习了与算法相关的课程后,就会进入竞争激烈的编程领域。大多数有竞争力的程序员都喜欢 C++,因为它速度快,内置的最优数据结构可用性高,语法少。

Rust 无疑是一种很好的语言,具有内存安全、高性能和内置特性,但是 Rust 语法对于第一次编写代码的开发人员并不友好。对于工业用途来说,如果你的团队希望获得类似 C 语言的最小的高效代码和类似 python 的开发环境,Go 是一种很好的语言。但是,对于学术用途来说,Go 的抽象太过简单,并且不能与传统的伪代码保持一致,所以学术讲师永远不会用 Go 来替代 C/ C++。

下面的文章解释了为什么每个程序员都应该用 C 语言开始编程:

为什么每个开发人员都应该使用 C 语言开始编程

https://www.infoq.cn/link?target=https%3A%2F%2Fshalithasuranga.medium.com%2Fwhy-every-developer-should-start-programming-with-c-39b3a87392bf

你可以从任何一种语言开始编程——但是从 C 开始有更多的好处!

https://www.infoq.cn/link?target=https%3A%2F%2Fshalithasuranga.medium.com%2Fwhy-every-developer-should-start-programming-with-c-39b3a87392bf

5现代替代方案仍然需要 C,它们专注于不同的目标

如前所述,所有 POSIX 操作系统和非 POSIX 操作系统 (即 Windows) 都提供了一个 C 库来处理内核操作,因此从 C/ C++ 调用内核特性很容易,因为我们不需要编写特定于语言的绑定或第三方包装器。一些操作系统甚至预先包含 GNU C/ C++ 编译器和调试器来促进 C/ C++ 的开发。如果我们使用 Rust 和 Go,需要特定于语言的第三方绑定来与操作系统 API 通信。现代替代语言仍然提供了调用 C 代码的方法。例如,Go 提供 Cgo 特性来调用 C 代码。

几乎所有的 C/ C++ 替代方案都力求用与 C++ 截然不同的语言语法来提供缺少的 C++ 特性。

如果程序员在寻找 C/ C++ 的替代方案,他们通常会期望一个平稳且耗时较少的迁移过程。

此外,他们也不期望学习一门新语言来为他们不喜欢的 C/ C++ 特性找到解决方案。

程序员们针对低层次编程用例设计和改进了 C 语言,没有一种现代语言是完全针对 C 语言的目标而创建的。C++ 使 C 语言更具有未来感,并自低级编程阶段进行了提升。Rust、Go、D 和 Carbon 都是 C/ C++ 的备选品——而不是替代品,这些备选品都有自己的未来目标。

下面的文章解释了为什么每个程序员在他们的职业生涯中都需要学习 C++ 语言:

为什么每个程序员都应该在他们的职业生涯中学习 C++

https://www.infoq.cn/link?target=https%3A%2F%2Flevelup.gitconnected.com%2Fwhy-every-programmer-should-learn-c-during-their-careers-959e1bc2ea68

掌握 C++ 并不是一件容易的事,但是一旦你做到了,你将获得无价收益

https://www.infoq.cn/link?target=https%3A%2F%2Flevelup.gitconnected.com%2Fwhy-every-programmer-should-learn-c-during-their-careers-959e1bc2ea68

6结语

以前的程序员在 C/ C++ 进化时期书写了我们的计算机历史。他们用 C 和 C++ 构建操作系统内核、编程语言、数据库系统、移动操作系统和网络软件。多亏了 C/ C++,现在几乎所有的现代 Web 服务都能工作。例如,最流行的 Web 服务器软件,如 Apache HTTP 和 Nginx,就是使用 C/ C++ 作为实现语言。以前的程序员几乎用 C/ C++ 编写了所有流行的内部网络浏览器和网络软件组件。Web 开发人员喜欢选择 Java 和 Node.js 用于 Web 服务,但 Java 和 Node.js 都是因 C/ C++ 而来的。

一些程序员认为像 Rust、Go、D 和 Carbon 这样的流行语言可以替代 C/ C++。同时,一些程序员考虑使用这些语言作为 C/ C++ 的备选品,认为它们在未来可能取代 C/ C++。这些现代语言是为特定的目的和需求而设计的——而不是取代 C/ C++。

微软创建了 TypeScript,但我们仍然使用 JavaScript。Jetbrains 创造了 Kotlin,但我们仍然使用 Java。数以百计的 C/ C++ 备选品出现了,但程序员仍将使用 C/ C++,因为重写面向 C/ C++ 的计算机历史是不现实的。这并不意味着 C 和 C++ 是最好的语言——在某些方面 (例如复杂性、内存安全性等),备选语言可能比 C/ C++ 更好,但它们无法进入 C/ C++ 的领域,因为以前的程序员用 C 和 C++ 编写了整个现代计算机历史。

感谢你的阅读。

abb4f5ffaba1575349a7a9d596a027ef.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,10名额!

80d84277655e760bfaa077722a7cb004.png

扫描二维码-免费领取

推荐阅读
Intellij IDEA 神级插件!效率提升 10 倍!被通知一个月离职,我修改了项目中的所有注释……“告别 8 万行 C++ 代码,我用 4 千行 C 代码就搞定了!”学生时代,你有遇到过像我这样理解C语言的吗?

点击 阅读原文 了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt 表格中插入一行_在EXCEL表格中,快速插入多行、多列的技巧

在使用Excel过程中,我们会遇到需要插入相同格式的多行或多列,如果一行行或一列列的插入,对于插入的数量较少的情况还是适用的。可是如果需要插入上百的行或列,使用此方法就比较费时费力啦。分享几个小技巧实现快速插入多行或多列.…

amber 口译_口译员设计模式示例

amber 口译本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff…

别再自己瞎写工具类了,SpringBoot内置工具类应有尽有,建议收藏!!

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络断言断言是一个逻辑判断,用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-en…

ad转换器工作原理_AD转换中参考电压的作用

AD转换AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号&…

面试大全 | C语言高级部分总结

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络一、内存大话题1.0、内存就是程序的立足之地,体现内存重要性。1.1、内存理解:内存物理看是有很多个Ban…

ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

maven介绍Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运…

戴尔集群监控与管理系统_监控与管理

戴尔集群监控与管理系统本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道&#xff0…

三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...

期末复习读万卷书 <做一好题第二单元两、三位数除以两位数计算能力1、竖式计算5106740961700262914246829810132、简便方法计算150253810(92)560353、填空720秒( )分300分( )时336时( )日调商1、小李计算一道除法是两位数的除法算式,商是12&#x…

单例模式示例_单例设计模式示例

单例模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

解读C++即将迎来的重大更新(一):C++20的四大新特性

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络C20(C 编程语言标准 2020 版)将是 C 语言一次非常重大的更新,将为这门语言引入大量新特性。…

小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?

我们如今所处的时代,科技创新的速度日新月异,生活方式多彩多姿。人人都说:科技改变了生活。今晚《开门大吉》也迎来了三大改变生活的神奇黑科技!智能且生态的“移动城堡”在网上预定好酒店以后,到了现场没有前台和服务员&#xff…

产品原型示例_原型设计模式示例

产品原型示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

13 年,MySQL 之父赌赢了:另起炉灶的 MariaDB 成功上市!

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络,侵权删!今年 2 月,开源数据库厂商 MariaDB 完成了 1.04 亿美元的 D 轮融资,同…

太阳粒子是什么东西_太阳光子前世今生告诉我们现在享受之阳光是十几万年前诞生的老光...

我们都知道天晴时阳光明媚,但这个阳光是怎么来的呢,很多人就不一定清楚了。在这里我们首先来了解几个概念:光子、光、电磁波、电磁辐射。光子是传递电磁波相互作用的基本粒子,是一种规范波色子,是电磁辐射的载体&#…

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 …

推荐一些小而美的互联网公司

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络,侵权删!这两年互联网大厂都在频繁裁员,今天汇总了一些网友们推荐的小而美企业供大家参考&…

int类型存小数 mysql_MySQL基本数据类型

1)整形1.介绍分类:tinyint , smallint , mediumint , int , bigint 应用场景:存储年龄,等级,id,各种号码等典型存储范围介绍:https://images2017.cnblogs.com/blog/1036857/201708/1036857-201708011814337…

枚举重名_举重设计模式示例

枚举重名本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01…

data在python_python-data-英语单词

In this video well be talking about data analysis and the scenario in which well be playing the data analyst or data scientist.在这个视频里,我们将讨论数据分析和用脚本语言分析数据或成为数据科学家Data analysis and, in essence, data science, helps …

装饰着模式示例_装饰器设计模式示例

装饰着模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &…