为什么C语言不会过时?

2024-01-19 09:58
文章标签 语言 不会 过时

本文主要是介绍为什么C语言不会过时?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg

来源 | http://zhaoyan.website/blog/index.php/2017/07/15/future/

作者 | 赵岩

评价任何一门编程语言,都是招人骂的。 永远是这样。 就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字: “傻逼! ”这个在心理学上有个专业的名字: 叫做“二逼”现象!
那我为啥还要做这个挨骂的事呢? 作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者。 我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。 这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。 因为他们有深深的担忧,万一C语言就像Fortran,perl语言那样过时了怎么办?

先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论。Java和C都在下降,而下降的部分被第三名以后的语言所瓜分。 

640?wx_fmt=png

对所有的编程语言,他们的最后的目的其实就是两种: 提高硬件的运行效率和提高程序员的开发效率。
遗憾的是,这两点是不可能并存的! 你只能选一样。 在提高硬件的运行效率这一方面,C语言没有竞争者! 举个简单的例子,实现一个列表,C语言用数组int a[3],经过编译以后变成了(基地址+偏移量)的方式。 对于计算机来说,没有运算比加法更快,没有任何一种方法比(基地址+偏移量)的存取方法更快。
C语言已经把硬件的运行效率压缩到了极致。 这种设计思想带来的问题就是易用性和安全性的缺失。 例如,你不能在数组中混合保存不同的类型,否则编译器没有办法计算正确的偏移量。 同时C语言对于错误的偏移量也不闻不问,这就是C语言中臭名昭著的越界问题。
C语言自诩的“相信程序员”都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。 C语言只关心程序飞的高不高,不关心程序猿飞的累不累。 就是这样!
现在来看看那些非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的真实区别所在。

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

全世界只需要五台电脑 -IBM创始人 

640K内存足够了 -微软创始人 

没必要在家里用电脑-DEC创始人 

如果再有人对你说C语言已经过时了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。  

扫码下载 GitChat App 
在技术世界里 每日精进

640?wx_fmt=png

这篇关于为什么C语言不会过时?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622060

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、