现在的编程语言越来越多,为什么 C 和 C++ 还没有被现在的时代淘汰呢?

news2024/12/23 11:03:34

C/C++会不会被时代淘汰?这个问题跳过了一步,关键是这个问题:

C/C++有哪些其它语言难以代替的特殊之处?

1、对实现细节的控制粒度

一般我们常说:C/C++具有较高的执行效率。其实这句话不是特别准确,有时候它们并不一定效率高。换句更恰当的话说:

C/C++,特别是C语言,控制粒度很细,与机器语言有着相当稳固的对应关系。

以C语言的if···else为例,它的汇编代码如下图所示。

 

也就是说,高手可以通过C语言写出完全按照自己的想法运行的程序。从C代码可以直接对应到汇编语言,如果你对C语言有足够的了解,代码在运行时实际做了哪些事情,是相当明确的。

C/C++甚至能指导编译器哪些变量优先放在寄存器,哪些函数内联,哪些变量要避免多线程抢夺,均可以进行非常细致的控制。

与此相反,Java、Python等高级语言在执行时会跨越很多层次。高级语言源代码 ->中间语言 -> 虚拟机执行 -> 分解执行流程 -> 实际执行的一系列操作。这其中的每一步都不是那么简单,最普通的一句代码:

c = a+b

会因为a或b的元方法,产生无数的执行可能性。除非仔细分析每一个细节,否则编程者对于最终代码的执行逻辑是缺乏控制力的,也不可能进行汇编级别的优化。

总结来说,C/C++,特别是C语言,有着极为精细的控制粒度,而更高级的现代语言一般无法进行如此细致的控制。

2、由于极高的控制力,在某些领域难以被代替

需要程序员压榨每一分硬件性能的地方并不多,特别是现在的服务器核心数很多,只要能充分利用多核心,每个核心没有完全挖掘也是可以接受的。

一般来说,需要压榨硬件潜力的领域有:

1、操作系统。因为每个人每天都要用操作系统,操作系统(特别是内核和驱动曾),对优化要求非常高。例如如果对Windows磁盘读取优化1%,几乎全世界电脑用户都会受益1%。

2、游戏引擎。游戏是硬件进步的原动力,大型游戏开发商总是在尽力压榨每一分硬件性能,在60帧以上无止境优化视觉效果、动态效果。C++一直以来都是编写游戏引擎的首选语言,而且几乎是唯一语言。(游戏开发可以用各种技术,但引擎本身一般是用C++编写)

3、嵌入式程序。由于单片机的硬件性能较弱,存储空间极小,必须编写专用的程序代码,使用高级语言可能导致延迟过大,或容量超出限制。未来“万物互联”的潮流,可能会引发超微型嵌入式系统的再度复兴。

4、加密与安全方向。大部分加密/解密模块,与操作系统一样,每个人每天都会频繁使用,所以用C/C++来深入优化是必须的;另外,很多软件硬件漏洞,例如常见的内存溢出漏洞,也需要编写很精巧的C/C++代码才好利用漏洞,才能编写木马或者直接入侵系统。

总之,C++的不可替代性是由它本身的特点决定的。而且目前来看,这种不可替代性在未来几年、几十年也依然不会有变化。
 

很多时候不把问题放在历史角度去思考,就怎么也想不明白——就好比2020年的小朋友可能怎么也想不通“为什么1980年的物理学家不用Matlab来替代fortran”一样。

当年并不是所有处理器的架构都有完整的编译工具链的,哪怕之前的2010年,有一整套某个版本的gcc实现所有功能和bootloader就相当不错了,再往前20~30年,大量的工业用的控制器都是自家手撸出来编译器——在当时的嵌入式设计中,只需要非常少的逻辑和设计,大量的工作用语读取和改写各种寄存器。当年C语言流行是因为:

  1. C语言的特性刚好能满足他们的需求,不需要oop和fp,不需要template,甚至不需要STL。对于嵌入式工程师来说,只需要include进来一堆头文件,把海量的寄存器、一些基本方法的函数、部分提前定义好的数据类型给include & link一下就可以了,而当时的通信、I/O等基本protocol也倾向于用C来完成,其余的交给指针、函数、变量、逻辑控制、数组和结构体就足够了;
  2. C语言编译器足够小巧到一个公司可以自己养一个小小的团队来维护,而C++包括整个std和所有五花八门的feature很难。当时的公司不仅不愿意依赖开源工具链,甚至自家的data sheets都不愿意公开出来,因为里面很可能包含自己的商业机密设计(比如某某寄存器如何read only,某某地址和寄存器如何读写完成加密和锁死)——因此对于很多厂商来说,商业机密非常重要,宁可让客户自己多花钱雇人读一读data sheets和specs,也要守住自己的一亩三分地;
  3. 越来越多的嵌入式开始用上轻量级的real time OS来调度,为了尽可能地兼容更多的设备和架构,比如uc-OS,选择用C语言来开发是工业界一个最大共识子集,这样把bootloader的工作量可以压缩到最小。

跳出来看,兼顾图灵完备、可读性、最大可移植等几个尺度,毫无疑问C语言的编译器是公认的最小实现——尤其考虑到历史上大量工作都是在老的设备和架构硬件上完成的,C语言在这些最后的嵌入式阵地上也是不太可能被取代的。

另一个地方就是上古时期科学计算库的屎山,因为上世纪大学和研究院内部没有像样的software engineering的management,任由屎山套屎山,或者单纯用惯了blas形成了思维惯性,导致存在一大堆各个小领域做computation的还在使用C语言——这些地方就算用了C++,也是link到C的屎山里而无法自拔。

语言不是问题,圈地自萌怎么折腾都没人管你,想着“大一统”才是问题。给每个architecture和指令集写编译器都是需要烧钱雇人的,历史的工作已经戛然而止,你是不可能把一切推倒重来的。

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

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

相关文章

npm报错整理

npm报错整理一、代理1. 因为使用公司的镜像源导致的403 forbidden总结一、代理 1. 因为使用公司的镜像源导致的403 forbidden 在更新脚手架的时候,遇到了403的报错: 遇到问题不要怕,我们根据错误去解决就好。 (1)首…

【黄啊码】MySQL入门—13、悲观锁、乐观锁怎么用?什么是行锁、页锁和表锁?死锁了咋办?

大家好!我是黄啊码,MySQL的入门篇已经讲到第12个课程了,今天我们继续讲讲大白篇系列——数据库锁 目录 从数据库管理的角度对锁进行划分 共享锁也叫读锁或 S 锁 排它锁也叫独占锁、写锁或 X 锁。 意向锁(Intent Lock&#xf…

C++库——windows下使用Qt5.15.2+mingw64+msys2编译c++数学库GSL

文章目录准备配置msys2编译GSL准备 下载gsl库的源代码。大家可以到GSL的官网下载gsl的源代码。目前版本为2.7,下载完成后解压缩。 下载msys2。msys2是一套在windows上运行的用于构建库和程序的工具库,下载地址可以使用清华源的下载地址。下载完成后&…

【论文解读】伪装物体检测 Camouflaged Object Detection

文章目录伪装物体检测 Camouflaged Object DetectionSINet v1RF模块:PDC模块:SINet v2特征提取Texture Enhanced Module 纹理增强模块Neighbor Connection Decoder 邻居连接解码器Group-Reversal Attention 组反转注意力总结伪装物体检测 Camouflaged Ob…

计算机毕业设计之java+javaweb的烯烃厂压力管道管理平台

项目介绍 系统权限按管理员和用户这两类涉及用户划分。 (a) 管理员;管理员使用本系统涉到的功能主要有:主页、个人中心、通知公告管理、用户管理、管道信息管理、单位信息管理、管道统计信息管理等功能。 (b) 用户登录进入系统可以对主页、个人中心、通…

2022高频经典前端面试题(html+css+js上篇,含答案)

博主经历过多轮面试,因此想将自己的面试经验以及答题技巧,分享给即将面试找前端工作的同学。 2022高频经典前端面试题分为上中下三篇,分别会有html,css,js,es6,vue,ts,nodejs,以及hr面和反问面试官几个维度去进行,完整的还原面试场…

在 Linux 中使用 tcp 转储命令来分析网络

前言 Tcpdump是用于分析网络和查找相关网络问题的出色工具。它会在数据包经过时捕获数据包,并向您显示网络上正在发生的事情和传入情况。该命令的输出显示在 STDOUT 上,也可以存储在文件中。 感谢开发人员,他们将Tcpdump保留为开源项目。它…

LinkedIn最好工具-领英精灵有哪些批量加好友方法?

领英工具-领英精灵有哪些批量加好友方法 使用领英的人都会使用领英精灵,因为领英精灵是目前本土做得最好的领英工具,具有很多强大的功能。特别是拓展人脉方面,提供了很多批量加好友的方法。刚使用的新手可能不知道如何操作,下面就…

施耐德电气“创新开放日”走进中国软件研发中心 以软件与创新驱动产业“双转型”

来源 | 施耐德电气 2022年10月27日,施耐德电气在位于北京亦庄的中国软件研发中心举办“创新开放日”,充分展示其在中国深化研发的战略布局。当天,施耐德电气展示了该中心成立一周年以来的创新研发成果,并与合作伙伴共话软件发展趋…

【jsdoc-to-markdown】一步步实现js文件的文档生成

文章目录导读开发环境安装Vs code插件:Doxygen Documentation Generator效果优势jsdoc-to-markdown的使用了解 jsdocjsdoc-to-markdown安装创建测试文件example.jsjsdoc-to-markdown使用jsdoc-to-markdown踩坑!!!参考资料导读 这个…

【C++】一文带你吃透string的模拟实现 (万字详解)

🌈欢迎来到C专栏~~ 模拟实现string (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort🎓🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤🤔&#…

生态流量智能终端机 水电站生态流量多媒体智能终端-视频叠加、数据采集、远程传输

平升电子生态流量智能终端机 水电站生态流量多媒体智能终端是一款集人机交互、视频叠加、4G路由、数据采集、逻辑运算与远程传输功能于一体的多媒体智能终端设备。 此款产品为水电站生态流量监测项目的专用产品,便于监管单位及时掌握水电站的流量下泄情况&#xff…

【Django框架】——19 Django视图 01 路由配置

文章目录一、视图介绍二、路由配置1. 配置URLconf2.编辑项目中urls.py(根路由)3.创建应用中 urls.py (子路路由)4.路由文件urls.py5.API讲解一、视图介绍 视图就是应⽤用中views.py⽂文件中的函数 视图的第⼀个参数必须为HttpRequest对象,还…

计算多张图片的移位距离

( A, B )---25*30*2---( 1, 0 )( 0, 1 ) 做一个二分类的网络分类A和B,让A和B的训练集中都有多张图片,用一种平均值的办法把多张图片等效成两张图片,统计两张图片的移位距离,并比较移位距离和迭代次数的关系。 设AB训练集都只有两…

Python编程 赋值,逻辑,位运算符

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.赋值运算符 1.基本赋值运算符 2.注意 二.逻辑运算符 1.逻辑运算符使…

【LeetCode】No.70. Climbing Stairs -- Java Version

题目链接:https://leetcode.com/problems/climbing-stairs/ 1. 题目介绍(Climbing Stairs) You are climbing a staircase. It takes n steps to reach the top. 【Translate】: 你正在爬楼梯,爬到山顶要走n步。 Each…

最受欢迎的职业榜单!医生还是程序员?

最受欢迎的男友职业排行榜终于更新了,医生荣归榜首成为了第一名。 出人意外的是,公务员竟然只排名第六。 榜单上可以看出程序员也霸榜,占据了排行前三的位置。 程序员相对于医生有什么样的优势呢? 首先是逻辑分析能力。 虽然医生…

CMSC5707-高级人工智能之自编码器Auto-encoders

这章讲述模型框架和概念的时间较多,好像并没有涉及过多的运算,重在一些概念的理解。 Traditional Autoencoder 传统的自编码器常用来进行图像去噪的任务,需要了解其模型架构和流程。 自编码器由两部分组成:从Noisy Input到Z称为…

【附源码】计算机毕业设计java学生社团管理系统设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Python Flask教程学习02

书接上文Python Flask教程学习01 文章目录Flask 教程Flask 会话Flask 消息闪现Flask 文件上传Flask 扩展/寻找扩展Flask 教程 Flask 会话 与Cookie不同,Session(会话)数据存储在服务器上。会话是客户端登录到服务器并注销服务器的时间间隔。…