C语言并不是这个世界上唯一的编程语言,可惜的不是所有程序员都认识到了这点。对于把C语言作为自己唯一开发语言的程序员来说,很有必要开拓自己的眼界,这样才能更为清晰地理解C语言的内在精神。并不是说,某某语言本身是用C语言来实现,那么C语言就可以以同样的方式,解决那种语言解决的问题(甚至更为高效)。一些C语言中的概念,到了另一种语言中,很可能用完全不同的方式展现出来。正如自然语言会影响人的思维方式一样,编程语言一样会影响人对某种算法的编码形式。在C里,我们总以为某些写法是自然而然的,但换了种语言很可能并不尽然。
无论如何,C语言的语法和设计影响了许多其他语言,最为彻底的是 C++ ,以及大多数程序员都能叫得出名字的一些流行语言:Java 、PHP、JavaScript、Perl、C#、D、Objective-C等。这给人造成一种错觉:新的语言取代了旧的,对旧语言做了改良和完善。最广泛传播的观点是,C++是C的一个超集,它能做C能做的所有事情,且能做得更好。持有这种观点的C++程序员们甚至把已有的各种C代码用C++重新实现。但实际上,C和C++更应该被看成是相互平等的存在。C++ 更像是一种借用了几乎全部 C 语法(但还是有细微差异)的全新语言。它们在很多方面都有设计理念上的差异。C++企图完全兼容C的语法却不想完全继承C语言的理念,这使它背负了巨大的包袱。而C的另一个继任者:Objective-C,抛弃了一些东西,则显得清爽一些。
回顾C++出现的时代背景是把面向对象当成解决复杂问题的“银弹”的年代。这使得 C++ 在发明之初,迅速占领了大量原本是C语言的市场,甚至被看成是C语言的替代品。但C++的拥趸们并没有等到这一天。历史证明,面向对象也不是“银弹”。最近十年,C++的粉丝们从C++语言的犄角旮旯里挖掘出来的各种武器,让C++语言变成了包含多种编程范式的巨无霸,却并没有让解决问题变得更容易。这并不完全是语言的问题,可能有很大程度上是面向对象等开发方法本身的问题。这也证明了C语言保持自身的简洁正是其生机昂然的源泉。
和浩如烟海的C++书籍相比较。如果你已经是程序员,但还不了解C语言的话。学习C语言,只需要读一本书,而这本书没有第二选择,就是经典的《The C Programming Language》(K&R)。薄薄的一本就讲透了语言的方方面面。可惜的是,C语言过于注重对机器模型的抽象,并不适合用来程序员入门。尤其是在国内的教材市场,充斥着大量糟糕的C语言教材。在这些拙劣的教材中,甚至把开发工具(比如特定的C语言开发集成环境)和特定的硬件环境(甚至是过时的8086内存模型)与语言教学混为一谈。
对于C语言不是母语的程序员来说,有充分的理由去学习一下C语言。那是低投入、高产出的。它会使你学会在硬件层次上思考问题(这或许对你是一个新的思维角度),而且C语言已经非常稳定,不会再有(它本身也不希望有)大的变化,不用担心学到的知识会过时。C语言在1990年制定出一个现在通行的标准(C90)以来,在C的主流开发社区中几乎没有变过。虽然,从1999年开始,C语言委员会几经修订C语言的新标准(C99),但似乎并不被广泛接受。虽然有很大程度上,这是源于世界上最大的C/C++商业编译器提供商微软对其不感兴趣,但在开源界,即使有GNU C对C语言新标准的不断推动,那些实际用C语言做开发的大佬们还是纷纷表示,新的标准还不是很成熟。新的特性也不是特别有必要。
我用C99开发有一些年头,但也只使用了其中一个子集,不太敢在正式项目中完全推广。至于C语言近年来的发展,我个人比较欣赏苹果公司对C语言添加的 blocks 扩展以用来实现closure。但并不看好这些新特性会迅速融入C语言社区。