当有朋友希望我教授编程的时候,有一个问题对我很困扰。
教哪一门编程语言
我想现在大家或多或少会听说过那么几种编程语言
- Java
- Ruby
- Go
在Wiki上还专门有一个页面列出了几乎所有的编程语言List of Programming Language。没仔细数,感觉怎么也得有几百种。我想这也是想学习编程的初学这感到头大的事情,究竟要从哪个开始学习?
对我个人而言,教大家c语言是最轻松的,因为我这么多年的工作经验就是c语言。随便挑一个点,都可以讲上很久,直到把你讲晕。然而这么做没有意义。对来听的同学,学不到真的东西。而对于我,这就是随便糊弄。
在《通往财富自由》专栏,老师对知识的定义又加了一个维度--时间。有些知识的时间作用范围比较短,而有些知识的时间作用范围比较长。我想
那些时间作用维度长到一定界限的知识就是经典。
经过多日的思考,我认为c语言确实可以算得上是经典。
历史悠久
C语言在1969年由两位贝尔实验室的科学家创造。仅从年头上来看,也就四十年。但是要知道第一台电子计算机是1946年才发明的,而第一台晶体管计算机诞生于1954年。所以c语言的历史,几乎就是整个计算机发展史。
别看c语言是编程界的老大爷,他老人家身体还硬朗着呢。
这是2017年,全球编程语言的排名。大家可以看到c语言排名第二,活跃程度依然很高。然而与c语言同期的其他很多语言,几乎已经看不到他们的身影了。
看完了这张图,我突然想插入一个观点。
c语言并不难学
现在有不少不推荐入门者学习c语言的原因是觉得c语言的语法太复杂,对初学者来说不容易理解。然而这个排名却恰恰显示了这个观点是不正确的。如果这个语言的语法真的非常难学,那么应该会有更多的项目会采用更好的语言来实现。也就不会有c语言依然保持这么高排名的情况了。比如说大家几乎已经不记得的COBOL。
子孙众多
另一个可以说明c语言是经典的就是由c语言实现或者和c语言相关的语言达到了60多种。
这个网站上列出了这些相关的语言,其中包括了大家耳熟能详的
- Java
- Go
这么庞大的c语言家族正说明了c语言本身的优势。
- 或是运行快速
- 或是代码精简
- 或是结构简练
如果我们从生物学的角度来看,凡是后代众多的都是因为其基因强大。而c语言这么多的后代,也证明了其语言自身强大的生命力。
其中我最想强调的不是运行快速,而是结构简单。当大家去看c语言代码的时候,如果和其它语言进行比较你会觉得c语言代码简直有种“裸”的感觉。
从一个层面上讲,“裸”带来的是“慢”。正如大家知道的,用Ruby搭一个网站可能只要几分钟。但用c语言,那么。。。
但是从另一个层面讲,“裸”带来的是“活”。就好像降龙十八掌,虽然只有十八掌,但是只要内功深厚能破一切。就好像我们所说的“元认知”,虽然简单,却可以用来认知万物。就好像《道德经》中的道,能够“道生一,一生二,二生三,三生万物”。
承上启下
假入我们把编程语言的发展看做是物种的演化,那么粗略的可以把编程语言分成这么几类
- 机器语言
- 汇编语言
- 高级语言
机器语言基本就不是人能看的,一般能看得懂机器语言的我都称之为神。汇编语言也很难懂,除非特别熟悉计算机体系结构的。而高级语言则是我们大家通常能够见到的。比如Java, Ruby, Python这些都是高级语言。
而c语言是最接近机器的高级语言
绝大部分高级语言中出现的语法,在c语言中都有呈现。
- 判断
- 分支
- 循环
这几个套路在各种高级语言中都是一样一样的。从底层逻辑来讲,学好了c语言,其余的高级语言也就学会了。
而c语言还有这其他语言没有的特点--接近机器。
很多人认为这是c语言的缺点,暴露了机器的运行情况对大部分用户来说是不关心的。但是我在使用过程中却并这么认为。
了解了底层机制,你能更好理解语言的运行,发挥语言的效能
通过c语言的代码,你可以完全确认代码执行的行为。但是对于其他的高级语言,你可能必须要查阅手册,甚至是做实验你才能知道函数的行为。这点其实非常让人头疼。在这我就不举例子了,因为大部分读者应该很难理解。
那我说另一个点,为什么理解机器运行是有益的,尤其对初学者来说。最近在看python的代码,发现python中仍然对数据类型需要区分定义。比如fload64, float是区分的,但是不理解原理的就不清楚这是在说什么。
这么讲大家估计还是不懂,那我做一个类比。
就好像食堂师傅炒菜和家里炒菜,使用的锅应该是不一样的。食堂里用的应该会大一些,家里用的会小一些。食堂用小锅,那估计大厨要累死,吃饭的要饿死。家里用大锅,连放哪都不知道。而float64和float之间的关系就类似于这个食堂大锅和家里小锅的关系。
如果你知道了原理,这个概念就非常好理解。而c语言的概念中就包含了这些原理性的东西,让你在一次学习之后就能举一反三,知道这一类问题在其他语言中的处理。
这种原理性的东西和举一反三的能力,我认为就是经典。
写在最后
王强老师说过“读一流书,做一流人”,所以学习就要学经典。
经过了几日的思考,我终于确认在编程语言界,c语言是我能见到的经典语言。大家通过对c语言的学习,不仅能掌握绝大部分高级语言必须的知识,更能够通过c语言了解计算机体系相关的知识点,做到融会贯通,举一反三。那么此时我再推荐大家学习就问心无愧了。
PS:不知道王强老师的请关注微信公众号《杨小伟的世界》,查阅文章《学编程,究竟学的是什么》。