林色芬
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不会过时的。
俺村的影城
c语言能做到的事情python做不到,现在很多人总强调汇编如何如何,说这样话的一般不是已经退休的老工程师就是没写过汇编的,汇编的编写本质与c没有区别,我说的是编程思路,但是c语言可以容易实现复杂数据结构,同时通过系统调用而不是自己记忆系统调用号,大大提高了效率,时至今天用汇编写程序的人可以说很罕见了!
大树NB
简单的反驳,就告诉他没有的C哪来的python,现在主流的python还是CPython,底层是由C语言支持的。
为什么C语言不会过时
对于所有编程语言追求的无非两种,提高硬件到的运行效率和提高程序员的开发效率,鱼与熊掌不可兼得,在提高运行效率这一方面是无可比拟的,他只关心程序是否运行的快不快,才不关心你程序员用的爽不爽,而其他编程语言都是在提高程序员的开发效率上下功夫。而且现在的操作系统内核都是C写的,他就像是互联网的基石,怎么会过时.
python为什么会这么流行
因为python简单易上手,而且有丰富的库支持,用于广,可用于爬虫、服务端、人工智能、数据分析、运维等,尤其在人工智能上的应用,把它推向了高峰。
总结
C偏底层,所以学起来难度会很大,而python更高级,简单容易上手,对于编程新手来说建议去学python,而且对于目前环境,需求也不少。
测试轩
python号称21世纪的VB,python简洁易学,相当于我们站在了巨人的肩膀上。而C语言是基础,是编程思想最好的体现。
空空如也Z
我就是忠实信奉C和C++的,每次有人说这种问题,我就说:你大爷永远都是你大爷……[抠鼻]
Polarix
何必计较 爱学啥学啥 一句话 关我屁事 和关你屁事
喧嚣4
人家是靠安利這種東西謀生的,駁他幹嘛。有人踩了屎,巴不得後來的人也踩了,不然顯得自己很蠢,就到處宣傳這裡風光獨好,就這心理。
TonyDeng
大件仍需C语言
大湾区创师记
为什么要反驳他。