为什么是C语言?


对的,开门见山的说,我就是要向你推销C语言!我是C语言推销者,麦辣!

我知道你可能是一个Web开发者,整天只与SQL,CSS,HTML和Javascript打交道,或者你可能一直幸福地沉浸在Java的甜蜜世界,每天品尝着各种设计模式的蜜糖。但是我还是想摇醒你,喂,醒醒,C语言来了!


Dennis Ritchie

"什么?C语言?你说的是那个上个世纪70年代初,由Dennis M. Ritchie发明的那种老古董语言吗?省省吧老哥,这个老古董级的系统编程语言,你还来推销个啥呀?洗洗睡吧!"我估计被我摇醒的人,有90%可能会这么回答我。是的,这对于我的确是一种打击。但是我的目标是要做最伟大的C语言推销员,我不会被这点困难吓倒的。

是的,老弟,C语言来了,该醒醒了。确切地说,是C语言又回来了。我知道你上大学的时候可能上过C语言的课程,使用的是“经典”的谭浩强的教材(有些同学可能就跨过C直接上C++了)。我知道你学的时候就觉得这种语言一点都不美,也不fashion,顶顶枯燥。是这样吗?然后,从你毕业以后就一直在作很fashion的web 开发,用的是Java或PHP,以及SQL,CSS,Javascript等等这些很时尚的语言,至于C这个东西,在你印象中,它要么属于实验室,要么属于那些埋头苦干的、呆头呆脑的系统程序员。对吗?

OK,就是这样想的,我知道了。如果你做开发只是想搞一些很潮的程序玩一玩,那么你确实不是我的销售对象,现在就可以走开了。而如果你立志于做一位professional的程序设计者,那么就依然是我的目标,请你别走开,精彩继续。我相信我可以打动你。

其实,关于C语言的话题,已经有很多名家大侠都提到过了。比如Joel Spolsky的一篇《学校只教Java的危险性》就谈到了这个问题。同时,TIOBE编程语言排行榜上,C已经重回榜首(笔者第一次作此文时,C还在第三名)。这些都是其他人的观点,我不予置评(其实我很赞成Joel的观点)。我今天,就想用我自己的观点来打动你。开始:

是的,C很古老,但是这一点都不妨碍你需要他。让我用武林的道理来打个比方。

凡是对武林有所了解的人都知道,中国的习武者,在习武之初都会练习蹲马步。绝对没有人会喜欢蹲马步,会说它真有趣。但是,想要成为职业武者的你,绝对绕不过这一关。电影少林寺里,觉远和尚在被师傅传授真正的武功之前,一直跟随师兄弟一起挑水做饭达一年之久。挑水做饭看似粗俗,其实是绝好的基本功训练,力量基础、身体协调性、平衡能力、体力。这些基本功完了之后,就是拳脚功夫的练习。然而,不论是镖局里的镖师,山寨里的土匪还是武林盟主,他们在现实搏击中几乎总是会使用一种兵刃,拳脚相搏倒是少数。这就造成了一种假象,似乎我只要精炼一种称手的兵器就可以了。是吗?

有点武学常识的人都会回答“不”。那些刚才回答“是”的,你可以下课回家了。一定还有人可能会疑惑或反驳:“麦辣你别忽悠了,你不就是说要练好基本功嘛?这个我们都懂,但是凭啥基本功就非C不可呢?”。哈,非常感谢你,你已经在替我做广告了。是的,在理论上来讲不是非C不可,我不能这么武断地下结论,但是我可以告诉你,C是一个非常难得的、天然就可以用于这个目的的绝佳语言,它具备了其他语言所没有的优势,这个道理就像是“金银天然是货币”一样。让我们仔细地掰扯掰扯。

图灵

冯诺依曼

在当代程序设计领域,绝大多数主流的程序设计师是工作在冯.诺依曼体系结构的计算机上的。这个体系是对图灵机理论的一个很完美的实现。请允许我在这里对图灵和冯两位大师膜拜一次。在这个体系中,系统的基本层次是:硬件、固件、系统软件(含OS)、应用软件。从编程角度而言,可以认为是机器语言、汇编语言、C语言(中级)、高级语言(Java,   C++, C#,  Perl,  Python…)。那么,我推销C语言的理由是:

第一、C语言,根据我个人的观点,是纯软件层的最后一层皮肤,它仍旧同时保持着程序设计的逻辑性和艺术性(美感)。从C语言再往下到达汇编层以后,逻辑性仍在,然而艺术性已经大大地折损了,你不得不面对“寄存器”这样的硬邦邦、冷冰冰的东西,你不得不称呼的你代码为“指令”。在这时,逻辑性的东西逐渐被大量的物理性的东东所浸泡住。从汇编返回来,你就会突然发现,原来C语言是这么的优美、简洁,竟然能够同时保持了逻辑性和艺术性。译器用最少的魔术,保留了最多的系统层本质性的东西。让你在能够窥探系统本质结构的同时,避免接触大量过于琐碎的物理元素。你需要知道内存这回事,但是不需要有芯片的意识,你只要知道“结构体”、“地址”和“字节”就可以了。你需要实施选择和循环控制,你只要认识if和while这样的英文就可以了,不需要理解“jump”这样生硬的概念。练习编程基本功,一定要对计算机系统结构有准确、深刻的理解。在这一点上,C语言提供了艺术性的支撑,不多、不少,非常地恰到好处,至少我认为还没有其他语言可以做到。C通过这样的抽象,既展示了足够多的系统结构,又掩盖了足够多的琐碎细节,并且封装了各个平台的差异。后来者,像C++,Java,C#这样的语言则掩盖了更多的系统结构,提供了更多的语法糖,至少,像“对象(object)”这样的东西就是纯粹的语法糖。它本身是好东西,但是你不能眼里只有这种糖而不知其背后的机制。总而言之,C语言能够使软件设计师恰到好处地以艺术地眼光,充分地感受系统层面的本质概念和原理,这是软件设计师基本功的必备要素。如果你打算和我争论“软件设计师是否一定要懂得系统结构”这样的话题,就稍稍跑题了,甚至我们已经出现了观念上的分歧了,就此打住吧。作为一个职业程序员,你应该有足够的勇气打开盖子,看看到底盒子里有什么,有些什么under the hood。

第二、C语言,部分地由于第一个原因,它提供了足够的思维训练给程序员。包括变量类型,字符串的处理,数据结构的操控,流程的操控,还有大名鼎鼎的、让人又爱又恨的指针操控。Joel也说过,C语言非常适合用于甄别程序员的水平,我想这是非常有道理的。特别是对于C中指针的操控,更是必备的硬功夫。没有指针的语言,是不适合作这样的事情的。那些语言也是好的语言,但是对于训练基本功是不合格的。它们会让你三下两下就弄好了一个链表,而你都还不知道是怎么回事。我一直认为,结构体和指针,是C语言最精华的部分。它们不仅抽象地地表达了冯诺依曼体系的本质,也投射出图灵机的本质。对编程者而言,是最好的思维训练。可以不夸张地讲,C语言就是程序员的“腰马功夫”。有人说C++也可以,是的C++当然可以,因为它是C的超集,但是C++对于基本功训练,过分复杂了。

第三、C语言,据我看是目前各主流平台上、主流软件的第一位的支撑性语言。你所使用的软件,要么是C语言直接写成,要么是运行在C开发的操作系统或虚拟机上,要么是借助于大量默默工作在底层的C写成的各种库。有人说,“No,我不用C这么低级的语言,我用C++,我OO啦”。听着那么像阿贵的语气呢。那好,阿贵,我问你,主流C++编译器是什么写的?一个具备了这么重要地位的关键性支撑语言,你可以忽视它吗?当你在C语言中有了足够的浸泡经历之后,你会发现这世界其实没那么复杂。那些日复一日变化的、层出不穷的新技术,其实,都只是在冯诺依曼机器上开出的另一朵带有迷惑性的花儿而已,根还在你手里。你不再有疑惑,而只是轻轻一笑。

好了,我推销C语言的主要理由说完了。有人还是会反驳,比如说“我只要精通我开发用的语言就可以了”。呵呵,这句话在我听来,就好像是说“嘿,我只要练好双节棍就可以了,蹲马步就省了吧,因为我是棍不离身的。还有,李小龙就是用双节棍的嘛,多厉害啊”。是的,李小龙大师确实是用双节棍地,但是叶问要求李大师蹲马步的时候你看到了吗?还有,你以为双截棍耍的次数多了就可以精通了吗?熟练和精通是两回事,耍的漂亮和熟练,顶多算是街舞,那是周杰伦不是李小龙。这不是功夫。有些功夫大师,一生中不曾练习过多少兵刃,但是每一样兵刃拿起来都可以瞬间制胜,即使没有兵刃,他徒手可以开碑断石。这才是功夫,因为他已经掌握了功夫的奥秘,他自己身体的奥秘,形式不再重要,至少我这么认为。就算我将来使用的武器是激光枪,我也还是会扎扎实实地练好拳脚功夫,除非有一天我可以用意念来搏击了。

微软的一位招聘负责人被记者问到为什么应聘微软的开发人员都要面试C语言试题时,他说“我们认为C语言是开发人员的基本功,实际工作未必时时处处用到,但是你必须过这一关我们才认为你是一个合格的微软开发者”。我想,这句话应该够分量。

最后,我之所以志愿成为C语言的推销者,并非为了经济利益和忽悠人,没人会为了这件事情给我酬劳,包括Dennis大师。我用这个来忽悠你也一点意思没有。很简单,我自己基于C的编程经历,感觉到自己从C的身上吸取了太多的营养而非常信服、非常惊讶于世间有这么优秀的语言,同时又看到那么多后来人被各种烟幕弹所迷惑而视C为无物,并深陷于其他语言其中甜蜜无比的样子感到深深的惋惜。

其实,我根本就是一个不合格的推销者,因为我压根儿就没想推销,我只是想推醒你,然后把C分享给你。

唉,兄弟/姐妹,醒醒啦!C来了。

注:本文与编程语言优劣话题完全无关

你可能感兴趣的:(语言,c,编程,javascript,java,汇编)