0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么C语言不会过时呢?

wFVr_Hardware_1 来源:赵岩 2023-03-16 09:38 次阅读

评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“***!”这个在心理学上有个专业的名字:叫做“二逼”现象!

那我为啥还要做这个挨骂的事呢?作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者。

我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。

因为他们有深深的担忧,万一C语言就像Fortran,perl语言那样过时了怎么办?

先上一个表,这个就是著名的TIOBE语言排行榜。

目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论。

Java和C都在下降,而下降的部分被第三名以后的语言所瓜分。

bb40d1ca-c32d-11ed-bfe3-dac502259ad0.jpg

最新的TIOBE数据显示Java和C分别以17.8%和15.37%排在前两名)

每次C语言的排名上升,都会让做硬件的朋友觉得是硬件的春天来了。。。

对所有的编程语言,他们的最后的目的其实就是两种:提高硬件的运行效率和提高程序员的开发效率。

遗憾的是,这两点是不可能并存的!你只能选一样。在提高硬件的运行效率这一方面,C语言没有竞争者!举个简单的例子,实现一个列表,C语言用数组int a[3],经过编译以后变成了(基地址+偏移量)的方式。对于计算机来说,没有运算比加法更快,没有任何一种方法比(基地址+偏移量)的存取方法更快。

C语言已经把硬件的运行效率压缩到了极致。这种设计思想带来的问题就是易用性和安全性的缺失。例如,你不能在数组中混合保存不同的类型,否则编译器没有办法计算正确的偏移量。同时C语言对于错误的偏移量也不闻不问,这就是C语言中臭名昭著的越界问题。

C语言自诩的“相信程序员”都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。C语言只关心程序飞的高不高,不关心程序猿飞的累不累。就是这样!

这时,会有朋友提出不同的意见了:你这么说C语言,让汇编语言情何以堪?

但是汇编语言的编程效率,是开发周期不能忍受的。

汇编语言,你不会编啊!

bb5ac30a-c32d-11ed-bfe3-dac502259ad0.jpg

现在来看看那些非C的语言,他们的长处都在于提高程序员的开发效率上。或者支持动态的列表,或者支持安全的列表。但是加入任何的中间层,加入任何的安全检验,它不可能比(基地址+偏移量+无检验)的方式更快。这个世界上不存在“开发容易,运行快”的语言,开发容易毕竟来源于对底层的一层一层又一层的包装。

现在回答两个最普遍的问题:硬件这么便宜了,有必要让软件更快吗?有这种疑问的人大部分都是网吧的固定客户,他们理解的计算机只在电脑城,他们理解的计算只是游戏和播放硬盘中的小电影。不要玩个游戏开个挂就乐得不行不行的,别忘了还有全实景仿真,还有3D渲染,还有自动驾驶

人在开车的时候,每秒要收集60个不同的物体,然后根据这60个物体的不同组合和反映来做20个最重要的决定。然后从这20多个决定中选一个执行。所以就算用上最快的硬件,自动驾驶现在还不敢说能像人那样开车。就算是自动驾驶成功了,下一步还要自动飞行呢?因为我们老早就预言了:你咋不上天呢!

所以说:计算速度永远是不够的!因为新的应用会越来越复杂,越来也实时。对了!我还忘了一个更重要的限制:计算的能耗!NASA飞行器上的CPU最多就是32位的,说出来你可能不信,国际空间站上没有一个CPU是64位的,我猜一个最主要的原因是航天员不爱看硬盘小电影吧。

另外一个流行的疑问是:我可以发明一种同样快的语言,但是没有C语言那么多的坑。想法是可以的,而且还真巧有这个语言,真巧它的名字叫D语言,真巧没有太多的人用!这是因为一个基本的事实。现在有太多,太多太多的C代码,他们大部分都在正常工作,就像Linux, Window, MacOS,Unix,Vxworks。你没有看错,这些操作系统的内核都是C,我虽然不确定C在Window中所占的比例,但是我相信微软的人不会傻到用C#去全部改写一个操作系统的内核。你想让这些人去用你的全新的语言,这就不是“有点”很傻,很天真了!

而且有些代码,我们根本就不能改!NASA一个简单的5个CPU飞控软件编写完毕后,要进行一种“全覆盖”测试。如果CPU A坏了会发生什么?如果CPU A,B坏了呢?如果CPU A,C坏了呢。。。。?如果你愿意,你可以做个简单的数学组合。测试完毕后,别说重写,就算加个注释都不行。因为主管payload的大妈会非常严肃的质问你,为什么你上报的东西数量增加了,但是质量没有增加?你需要和她详细的解释:硬件和软件是不同的,硬件是那种摸起来硬硬的东西,但是软件不是那种摸起来软软的东西。看着大妈鄙夷的眼神,这个时候你会非常后悔自己手欠加入的哪一行注释。你还别不当真,这个是NASA的真实故事。

哪为什么C语言还下降这么多呢?很简单,有些任务本身就不是C语言的。我上学的时候还用C语言编过窗口界面呢?然后很快微软的人就推出了MFC,就是一大堆宏把底层的C windowAPI包装了起来。

再后来这个技术也过时了。因为微软的人认识到,带有窗口的应用程序说到底不是C语言的本职工作,再这么一层一层包下去就有露馅的危险,于是他们发明了一个全新的语言C#来负责这个任务。

Java也是这样,突出网络,易用,安全,跨平台。无论是Java, c#还是python, 他们都有意避开提高硬件的运行效率这个问题,因为这个问题上没办法和C竞争,也无法撼动Linux, Unix,GNU tool这些已有C代码的位置。剩下的就只是提高程序员的开发效率上大作文章。这对C语言是好事,把自己不善长的东西去掉,让自己跑的更快!

伴随着嵌入和实时系统的兴起,AI机器人,自动驾驶等。这些都是C语言的核心应用,而且在这种应用上面,C语言没有竞争者。所以我感觉C语言会稳定在自己核心的应用中,并开始逐步回升。

但是Java语言我个人不乐观。小型和灵活性上,Python更胜一筹。一行python代码后,你根本不知道自己还是不是duck类型?平台领域,每个平台都推出自己专属的语言。Windows会继续支持C#,苹果偏爱Swift, Android推出Kotlin,Google用go。Java宣称自己可以自由到每家做客,但是无论是到谁家,都会发现客厅里面坐着一个亲儿子,这个时候自己这个干儿子多多少少有点尴尬。所以我猜测,最后Java会稳定在对跨平台有严格要求的,大型非实时应用上。

最后说点闲话,C++不会淘汰C语言。有了对象后你会发现再简朴的对象也耗费资源,而且有了对象以后,总是不由自主的去想继承这个事,一但继承实现了,你会发现继承带来的麻烦远超过你的想象。Java的发明人James被问到如果可以从新设计Java语言的话,第一个要做什么事?他说:“去掉对象”!作为一个已婚,有两个孩子的程序猿,我感同身受。如果大家感兴趣,我可以再写一个博客,聊聊C++和C的真实区别所在。

如果你看到这里,还什么都没记住。那就只记住一点:没人能预测未来。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    210

    文章

    28180

    浏览量

    206377
  • JAVA
    +关注

    关注

    19

    文章

    2956

    浏览量

    104534
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136120
  • MFC编程
    +关注

    关注

    0

    文章

    8

    浏览量

    6246

原文标题:为什么C语言不会过时?

文章出处:【微信号:Hardware_10W,微信公众号:硬件十万个为什么】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    2019年这些编程语言不会过时

    2019年学习哪些编程语言不会过时
    发表于 06-26 10:10

    嵌入式过时了吗?会不会被淘汰?

    嵌入式过时了吗?会不会被淘汰?每一个想学习嵌入式的人肯定都考虑过这个问题。对于很多想入行的嵌入式开发的新人而言,其实有这种疑虑是应该的。学习一门技术不考虑其前景显然是不科学的!从目前的形式看,随着
    发表于 11-24 17:00

    C语言基础怎么学51单片机

    C语言基础怎么学51单片机?为什么学好C语言不会弄单片机
    发表于 10-18 09:17

    C语言具有什么特点

    了解嵌入式开发的朋友们都非常的清楚其核心的开发语言C语言C语言在嵌入式开发的过程中占有十分重要的地位,可以说两者之间“你中有我,我中有你
    发表于 11-08 07:26

    C/C++编程语言学习难点及语言

    一般学C++前都要学C,所以通常叫它们C/C++。C/C++历经40余年,也是经久不衰的号称“永
    发表于 08-15 10:24 2257次阅读

    C语言究竟会不会过时

    专业的名字:叫做“二逼”现象!  那我为啥还要做这个挨骂的事?作为《C语言点滴》《drop of knowledge of C++
    的头像 发表于 10-17 14:09 4700次阅读

    市面上编程语言几百种,是不是C语言就不行了

    如今,市面上编程语言几百种,很多人觉得Python、 JAVA这种语言比较火,是不是C语言就不行了
    的头像 发表于 07-23 11:29 4208次阅读
    市面上编程<b class='flag-5'>语言</b>几百种,是不是<b class='flag-5'>C</b><b class='flag-5'>语言</b>就不行了<b class='flag-5'>呢</b>?

    C语言到底是不是真的过时了吗

    现在说到编程,大家提得更多的似乎永远是前端、后端、小程序、Android App、iOS App,但奇怪的是,在编程语言排行榜上, C语言却永远是前一、前二,那C
    的头像 发表于 02-05 11:02 3301次阅读

    为什么C语言不会过时

    先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论。Java和C都在下降,而下降的部分被第三名以后的语言
    的头像 发表于 06-05 16:12 2072次阅读
    为什么<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>不会</b><b class='flag-5'>过时</b>?

    单片机C语言C语言为什么有差异?

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学
    发表于 09-01 16:39 3742次阅读

    嵌入式开发为什么不选择汇编、Java而是C语言?

    ID:技术让梦想更伟大作者:李肖遥对于现在我们从事嵌入式开发的人员来说,C语言好像是必备的技能,也是最常见的开发语言.但是我们有没有想过为什么嵌入式开发要使用C
    发表于 11-02 19:21 45次下载
    嵌入式开发为什么不选择汇编、Java而是<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>呢</b>?

    [ 爱找茬 ]都是C语言,单片机C语言和普通的C语言究竟有什么差异

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学
    发表于 11-20 19:36 31次下载
    [ 爱找茬 ]都是<b class='flag-5'>C</b><b class='flag-5'>语言</b>,单片机<b class='flag-5'>C</b><b class='flag-5'>语言</b>和普通的<b class='flag-5'>C</b><b class='flag-5'>语言</b>究竟有什么差异<b class='flag-5'>呢</b>?

    短期精通C语言

    C语言的学习上少走弯路,其实这何尝不是一种花时间最短且高产出的精通C语言的方法?这里不会教你
    发表于 01-13 13:49 7次下载
    短期精通<b class='flag-5'>C</b><b class='flag-5'>语言</b>

    C语言C++的区别看法

    编写了自己的业务爱好项目。那么,为什么我没有抛弃 C 而选择其他语言?我对于 C++的看法又是如何的? 1 为什么说
    的头像 发表于 07-06 14:29 991次阅读

    为什么说指针是C语言的灵魂

    指针是C语言的灵魂,这句话并不夸张。
    发表于 09-05 17:03 657次阅读
    为什么说指针是<b class='flag-5'>C</b><b class='flag-5'>语言</b>的灵魂<b class='flag-5'>呢</b>?