现在的编程语言越来越多,为什么 C 和 C++ 还没有被现在的时代淘汰呢?
创始人
2024-01-17 17:36:46

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和指令集写编译器都是需要烧钱雇人的,历史的工作已经戛然而止,你是不可能把一切推倒重来的。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
怎么样消灭臭虫 臭虫用什么药消... 奔奔虫控|被吸血臭虫骚扰的滋味,你体会过吗?相信被臭虫骚扰过的人都不想再体验一次了吧?那么臭虫应该怎...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...