有人说C语言过时了,要学就学Python,怎么反驳他?

林色芬


如果有人说“C语言过时了,要学就学Python,怎么反驳他?”我的答案是不需要反驳他,为什么?因为他不懂编程。

本人从2012年工作,做过Erlang,做过Java,做过iOS,当然也学过C语言,也学过Python,对于这个问题我谈一下自己的观点。

首先过时不过时的评判标准是什么?

我认为过时的评判标准是这个语言已经很少再使用了,市场份额越来越少,最后少到可怜。我们看图说话,下图是2020年3月份TIOBE 编程语言排名,TIOBE是编程语言统计非常著名的一家机构。第一名:Java、第二名:C、第三名:Python。


第一名:Java 第二名:C

Java和C一直在第一名第二名之间变动,Java一般用于开发企业服务,C语言一般用于开发硬件相关的,C语言更接近与电脑语言,运行速度不说是最快的至少比百分之九十九的语言都快吧。


Python为啥能排名第三

Python为啥排名第三是由于最近几年的人工智能,网络爬虫等,随着人工智能越来越火Python的名气越来越大。Python有着很多封装好的工具,能够做一些比较有趣的功能,实现同一个功能,由于Python封装的更多所以写的代码越少,也经常有人说Java要用100行代码搞定的功能Python只需要10行就能搞定,拿着这个标签来标榜Python。

Python真的好吗?

Python的名气来源于人工智能、更少的代码能实现功能。我觉得语言好不好和实现一个功能的代码量有多少没多大关系,Python写一个功能用10行,C写一个功能用100行,照样用C语言写而不用Python语言写。人工智能需要更高的数学知识,从工作的角度上看Java职位有很多职位,而Python的职位也只有一小部分公司会招聘。有很多人抱怨说参加了一个Python培训机构,培训完找不到工作。Python的火也有点培训结构炒的了,当年iOS非常火好多培训机构投进去疯狂量产iOS,到现在iOS程序员很难找工作,PHP火了,iOS不行了培训结构就开始转向PHP了,PHP不火了Python火了,现在培训结构就大肆宣传Python培训,以至于培训出来找不到工作,没有更好的职位


Python的应用场景

Python用于人工智能、用于网络爬虫,我觉得这是它的应用场景。


技术角度对比

Python最大的热点也是人人皆知重大缺点是允许速度,很慢,相对于C语言慢的是好多倍。我最讨厌的是Python的语法缩进,还有那缩写命名的风格,还有那啥都看不出来的方法签名。对于Python的网络爬虫确实是好用,我个人也不觉得使用Python做Web开发也不是很好,感觉Web框架像Django、Flask用的都不太习惯,还是用服务器端写api用大前端技术写前端,前后分离的模式好。


编程语言过时不过时是看编程语言市场占有率而不是看最近一时的名气,名气也有可能是炒作出来的。


Java实用技术


个人认为,这实际上反映了编程语言(教学)史上两大学派--C和Lisp学派经久不息的争论.

C学派和Lisp学派分别代表了自底向上(from bottom to up)和自顶向下(from top to bottom)两种教学方式."自底向上"派观点认为,应当从计算机底层的知识开始教起,然后一步一步提高程序的抽象层次直至达到应用程序水平,所以在学习二进制之前,应该先具有逻辑电路的相关知识;在编写任何严肃的程序以前,必须先掌握内存架构和内存分配相关知识,是一个从具体到抽象的过程.而另外一派的观点则截然相反:应当先教授抽象的程序,这些程序是用什么语言写的不重要,甚至这些程序只不过是伪代码,只能"在心灵中执行",程序的思想不依赖于我们有没有计算机,然后在实现的过程中再教授具体的东西(譬如,如果我们要实现一个排序算法,应该采用什么数据结构,这些数据结构用C语言的结构体如何实现,内存如何管理等等),是一个从抽象到具体的过程(所以Lisp非常适合这一目的,因为Lisp本来可看做一种符号语言,在纸上也能执行演算).

这两种争端在别的学科中也有,比如在数学中有布尔巴基学派(对应着"自底向上").两种方法各有优越性,最后也是殊途同归:C学派最后也会教授程序抽象和结构化程序设计,而Lisp学派也会涉及到计算机底层的细节(譬如内存分配,大概会从垃圾回收器来入手,而不是从C学派所用策略).只不过就目前的趋势来看,"自顶向下"一派似乎更有优势一些.

其实也没什么奇怪的,考虑到计算机的普及,越来越多非专业人士也有编程的需要,这些并不关心任何计算机实现的细节,他们仅仅希望将手头的任务完成,他们需要一门编程语言来实现他们头脑中的想法,编程语言抽象层次越高越好,因为这样就越接近他们的想法,实现的难度也就下降.例如抽象数据结构(Abstract DataStructure),一个人只需要知道这个数据结构上的接口(例如Python的List可以append,extend等等),就可以使用这个结构,而无须担心这个List到底在堆上还是在栈上,实现的时候是单链表还是链表加上数组等等.

注意,这并不是说(像这个回答下一些人表达的观点),采用"自顶向下"方法的人,就比采用"自底向上"方法的人,要"低级"一些.只不过这些人不必做某事,不代表他们不能做某事.

一个使用Python的人,一样可以学习内存分配的相关知识(或者Java在这里更加合适),只不过,他并不像在C语言中那样要频繁使用到这个内存分配的知识,因为垃圾回收使得手动内存分配这件事情变得没有必要.这也不是说内存分配知识在动态语言中毫无必要,只不过在动态语言中,内存分配的相关知识的运用,并不在于进行手动分配这一点上,而在于如何与编译器的内存优化(局部变量放在栈上,逃逸变量检测)和垃圾回收器协作.同样的,Python没有显式的指针,不代表在Python不能学习指针这个概念,在动态语言中,引用是和指针对应的概念(引用是隐式的指针,动态语言的变量和静态语言的变量不是一回事).

换句话说,如果上述底层实现的知识对于一个人而言是必要的(不管这个人是出于好奇还是什么缘故),那么从理论上说,他可以从Python出发来获得这些知识,只不过实际上有一些因素限制了这一点,那就是绝大多数的较为底层的应用和教材都是用C语言写的(也还有一些是用Java或者伪代码之类的写的),由于C的设计比别的语言更加simple(不像例如Rust之类的基于LLVM的语言,优化就有好几层,编译以后代码都严重变形了),可以更好在课堂上教授(例如汇编代码更加好阅读等等,类型系统更加简单).

所以这又产生了一个新的问题:任何试图了解更多的人(尤其是操作系统和网络编程的这些知识)都不可能绕过C语言(不管是考虑到历史还是教育因素等等).但这并不能证明C语言没有过时(当然也不能证明C语言就过时了).

如果"过时"的含义是从编程语言设计的角度说的,不是从编程语言流行程度的角度说的.从某种意义上看,C语言和Python语言都"过时"了(当然Python还是比C年轻),因为他们都差不多是上个世纪80,90年代的产物了,至多只能反应当时的编程语言的设计水平,也就是面向对象风靡的时刻,而像近几年出现的Typescript等编程语言才能算是比较"先进",从这个角度说,没有吸收最新编程语言研究成果的C语言确实就已经"过时"了.不过这种"过时"并不说C语言就不好,只不过是说对于这种编程语言,大家都已经研究透彻了,所以大家在着手设计更加复杂,更加抽象的编程语言.简单的语言包含在更加复杂的语言之中,这并不代表简单的语言过时.举例而言,正则表达式比图灵完备的语言简单,但是日常编程的时候程序员仍然大量使用正则表达式,但这也并不代经常使用的正则表达式就要比更少使用的更加强大LL(1)优越一些。

说了那么多,就想指出一件事情:如果我们抽象的看待编程语言,那么C语言是完全包含在Python之中的,因此理论上,任何使用C的教材可以改成用Python来写(但是这种改写实际上至多发生在程序员的心灵之中,不会有人真的干这种事情),因此Python程序员无须因为Python比C更好写而感到自不如人或者低人一等.从编程语言设计的角度上(和上手难易度)说,C语言确实比不上现在出现的新语言,但是从实际的使用上看,C语言还是比较比较主流的选择.

其实这种纠结并不只是你有,还有800多万的小伙伴在陪你一起纠结。


让我来说,答案很简单:选你感兴趣的!我们都知道,兴趣是好老师,所以培养兴趣很重要。而如果你不确定自己对哪个语言更感兴趣,那么可以参考下面的方案:

如果你想做技术,走技术路线,那毫无疑问先学C语言百利而无一害。

如果还不确定以后的路想怎么走,那无所谓先学Python还是C,随缘吧。

如果确定了不想走技术路线,那么请先从Python开始。

其实,从两种语言入门,各有各的好处。

从C语言开始入门的话,它的语法结构比较严谨,把C语言学透彻了,再学其他的语言就简单多了,可谓是一通全通。C语言是一种面向过程的语言,而Python是一种面向对象的解释型计算机程序设计语言。先了解什么是面向过程,然后去了解什么是面向对象,这样学习更有效率。

从Python入门,也有它的道理。Python入门程序比较简单,在前期也比C语言容易学一些。学习C语言就比较枯燥,很难迅速见到成效,可能会摧毁你的学习积极性。先学习Python,虽然可能对底层实现方面了解比较模糊,但是这方面也可以等学完Python再补上。

当然,这个问题没有标准答案。最终,还是要靠你自己实践,才能知道什么最适合自己。


铁杆军迷


C语言效率高,适用面广,是经典的程序设计语言,不会过时的。

优点: 简洁紧凑、灵活方便

C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

运算符丰富

C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

数据类型丰富

C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

C是结构式语言

结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

语法限制不太严格,程序设计自由度大

虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。

允许直接访问物理地址,对硬件进行操作

由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。

生成目标代码质量高,程序执行效率高

一般只比汇编程序生成的目标代码效率低10%~20%。

适用范围大,可移植性好

C语言有一个突出的优点就是适合于多种操作系统,如MS-DOS、UNIX、Microsoft Windows 以及Linux;也适用于多种机型。C语言效率高,可移植性好,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画,它也是数值计算的高级语言。

综上,C不会过时的。


俺村的影城


1.最核心的一点,Python的多线程是有线程锁的,它的多线程其实只是单线程的轮询,Python要想并行计算,要通过系统fork出子进程才才行,但这是重量级操作,系统开销较线程较大。

2.Python为解释型语言,运送速度慢,较C语言速度相去甚远。

3.Pyhon因性能和解释型语言的基础限制,无法直接运行与硬件平台上,需要一定的软件环境基础,C语言通过BIOS和汇编引导入内存可以直接运行于硬件只上,因此C语言可广泛应用于操作系统开发以及硬件控制系统的开发,这是Pyhton做梦都不行的。


计算理论


c语言能做到的事情python做不到,现在很多人总强调汇编如何如何,说这样话的一般不是已经退休的老工程师就是没写过汇编的,汇编的编写本质与c没有区别,我说的是编程思路,但是c语言可以容易实现复杂数据结构,同时通过系统调用而不是自己记忆系统调用号,大大提高了效率,时至今天用汇编写程序的人可以说很罕见了!


大树NB


简单的反驳,就告诉他没有的C哪来的python,现在主流的python还是CPython,底层是由C语言支持的。

为什么C语言不会过时

对于所有编程语言追求的无非两种,提高硬件到的运行效率和提高程序员的开发效率,鱼与熊掌不可兼得,在提高运行效率这一方面是无可比拟的,他只关心程序是否运行的快不快,才不关心你程序员用的爽不爽,而其他编程语言都是在提高程序员的开发效率上下功夫。而且现在的操作系统内核都是C写的,他就像是互联网的基石,怎么会过时.


python为什么会这么流行

因为python简单易上手,而且有丰富的库支持,用于广,可用于爬虫、服务端、人工智能、数据分析、运维等,尤其在人工智能上的应用,把它推向了高峰。

总结

C偏底层,所以学起来难度会很大,而python更高级,简单容易上手,对于编程新手来说建议去学python,而且对于目前环境,需求也不少。



测试轩


python号称21世纪的VB,python简洁易学,相当于我们站在了巨人的肩膀上。而C语言是基础,是编程思想最好的体现。


感性的疯子


不值一驳,他根本不懂是Unix是咋回事。


振于无境


我就是忠实信奉C和C++的,每次有人说这种问题,我就说:你大爷永远都是你大爷……[抠鼻]


Polarix


何必计较 爱学啥学啥 一句话 关我屁事 和关你屁事


分享到:


相關文章: