FinOps有望降低企业50%+的云成本! 了解详情
写点什么

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

  • 2022-08-22
    北京
  • 本文字数:3267 字

    阅读完需:约 11 分钟

为什么永远不会有语言取代  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++的备选品,而不是替代品,原因如下:

 

C 和 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引擎

 


Flutter 引擎使用 C/ C++应用 GTK 库函数,截图由作者提供

 

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

 

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

 

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



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

 

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

 

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


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

 

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

 

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



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

 

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

 

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


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

 

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

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


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

 

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

 

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


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

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


现代替代方案仍然需要 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++

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

 

结语


以前的程序员在 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++编写了整个现代计算机历史。

 

感谢你的阅读。

 

原文链接:


https://levelup.gitconnected.com/why-modern-alternative-languages-never-replace-c-c-cbf0afc5f1dc

 

译者介绍:冬雨,小小技术宅一枚,现从事研发过程改进及质量改进方面的工作,关注研发、测试、软件工程、敏捷、DevOps、云计算、人工智能等领域,非常乐意将国外新鲜的 IT 资讯和深度技术文章翻译分享给大家,已翻译出版《深入敏捷测试》、《持续交付实战》。

2022-08-22 15:208378

评论 4 条评论

发布
用户头像
21世纪,哈哈,小编手抖

在 20 世纪 20 年代,程序员实现了 C/ C++的备选品,

2022-10-28 14:13 · 北京
回复
用户头像
变化本身才是永恒不变的
2022-10-01 03:10 · 北京
回复
用户头像
二者比较起来 其实C语言被替代的能行更小
2022-08-28 21:11 · 北京
回复
用户头像
小手一抖,经验到手
2022-08-23 08:47 · 浙江
回复
没有更多了
发现更多内容

从源码解析flutter_redux 的精准局部刷新

岛上码农

flutter ios 安卓开发 跨平台应用 6月月更

GameFi新的启程,AQUANEE将于6.9日登陆Gate以及BitMart

威廉META

大数据生态安全框架的实现原理与最佳实践(上篇)

明哥的IT随笔

大数据 hadoop hive 数据安全

谁说Redis不能存大key

华为云开发者联盟

数据库 华为云

【MySQL字符串数据类型优化】char和varchar的区别

写代码两年半

数据库 sql 6月月更

10个常见触发IO瓶颈的高频业务场景

华为云开发者联盟

数据库 sql 索引 华为云 数据清理

每日一题——leecode59( 螺旋矩阵 II)

武师叔

6月月更

音频 3A 处理实践,让你的应用更「动听」

融云 RongCloud

充电桩的B面是......不只公众号?还有智充小程序!

Geek_60c26d

直播预告 | 在阿里云 ESSD 云盘上部署 PolarDB for PostgreSQL 集群

阿里云数据库开源

数据库 postgresql 阿里云 开源

不止于观测|阿里云可观测技术峰会正式上线

阿里巴巴中间件

阿里云 云原生 可观测技术峰会

InfoQ 极客传媒 15 周年庆征文|手把手教你使用Python实现一键抠图,照片换背景|so easy!

迷彩

Python AI 前端 6月月更 InfoQ极客传媒15周年庆

华为云零代码开发图片压缩工具

乌龟哥哥

6月月更

干货合集│最好用的 python 库都在这

Python 有趣的技术知识 6月月更

【Spring 学习笔记(八)】Spring IoC/DI注解开发 之 原始注解开发

倔强的牛角

Java spring Java EE 6月月更

亚马逊云科技向你发出召唤——游戏开发者,集合!

亚马逊云科技 (Amazon Web Services)

react.js edge postcss

身为程序猿——谷歌浏览器的这些骚操作你真的会吗

孤寒者

6月月更 浏览器操作 小技巧 程序猿必会

尽一份孝心,为家人做一个老人防摔报警系统

华为云开发者联盟

IoT 华为云 防摔倒报警系统

一、Kafka安装

星期35

CREMB Pro 后台子管理员 403 问题分析

CRMEB

【资源分享】综合性的导航网站

小炮

react框架学习之深入研究【王道react】

恒山其若陋兮

6月月更

秒云云原生信创全兼容解决方案,推动信创产业加速落地

秒云

云原生 信创 信创云

君可归烈士寻亲系统开发实战

乌龟哥哥

6月月更

智充推出NET ZERO SERIES储能充一体机,携手比亚迪共创净零未来

Geek_60c26d

入驻快讯|欢迎XCHARGE智充科技正式入驻 InfoQ 写作社区!

Geek_60c26d

快来极狐GitLab SaaS 学习全球顶级的开源项目吧

极狐GitLab

开源

跟我学Python图像处理丨5种图像阈值化处理及算法对比

华为云开发者联盟

Python 人工智能 华为云

在线沙龙 | 开源小秀场——数据库技术应用实践

SelectDB

数据库 技术分享 apache doris 沙龙

什么是集群?为什么要使用集群架构?

Finovy Cloud

集群架构 云渲染 GPU服务器

企业内部Wiki,你建立了么?

小炮

  • 需要帮助,请添加网站小助手,进入 InfoQ 技术交流群
为什么永远不会有语言取代  C/C++?_语言 & 开发_Shalitha Suranga_InfoQ精选文章