您好, 访客   登录/注册

浅谈C语言的前世今生

来源:用户上传      作者:

  C语言,从20世纪70年代设计并实现之初,就注定是带有强烈工程师文化,而缺乏一些学术气息的语言。它的许多细节设计,都带有强烈的实用化痕迹。C语言因Unix操作系统而生,是Unix系统的母语。这导致在这个广泛应用的操作系统上开发,必须通过C语言的形式和系统进行交互。这不仅影响了Unix一个平台上的软件,也影响了后来世界上最大的桌面系统Windows,以及越来越多的嵌入式平台。
  C语言并不是绝对意义上最快的语言,但是它的效率非常好,在切合大部分机器模型并给出统一抽象的基础上,几乎没有其他语言做得更好了。这也是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语言已经非常稳定,不会再有(它本身也不希望有)大的变化,不用担心学到的知识会过时。C语言在1990年制定出一个现在通行的标准(C90)以来,在C的主流开发社区中几乎没有变过。虽然,从1999年开始,C语言委员会几经修订C语言的新标准(C99),但似乎并不被广泛接受。虽然有很大程度上,这是源于世界上最大的C/C++商业编译器提供商微软对其不感兴趣,但在开源界,即使有GNUC对C语言新标准的不断推动,那些实际用C语言做开发的大佬们还是纷纷表示,新的标准还不是很成熟。新的特性也不是特别有必要。
  C语言从语言角度上讲,最大缺陷在于要求程序员自己去做内存管理。用C语言去处理复杂的数据结构,程序员大部分的时间都花在了这上面,并且滋生了无数Bug。调试C程序变成了一项独立于编写C程序的技能。防止缓冲区溢出、防止数据读写越界、正确的动态回收内存、避免悬空指针,这些在大部分语言看起来不可思议的关注点,在C语言程序员眼里变得稀松平常,甚至是衡量C程序员技能经验水平的重要标志。可要知道,这些和具体问题的解决过程无关。
  这个问题在一定程度上也促使了Java的诞生。Java采用虚拟机和字节码的方式改造了底层的机器模型,并在底层模型的基础上加入了垃圾回收机制,并在语言层面取消了指针。在C语言的原生地,也有更多的动态(脚本)语言出现。先是有Awk这样的简易语言,后有Perl,再是Python等的流行。在Unix风格下,程序员倾向于为特定领域设计特定的语言。C和Unix的设计哲学是一体的。它们都鼓励清晰的模块化设计,让模块之间独立,再用薄的胶合层联系起来。脚本语言在现代类Unix系统上大量出现并充当这种粘合工作就是一种发展必然。而原本的充当粘合部分的脚本语言,也逐步发展起来,远远超出脚本的用途范畴。作为程序员,尤其是C程序员,必须对它们有所了解并掌握其中的一些,才能适应现代的挑战。
  我们不应该指望一门语言解决所有的问题。至于C语言本身,它将在很长的一段时间,带着它的优点和缺陷,继续扮演它在计算机世界中重要的角色。
   作者单位:徐州空军学院基础部
  参考文献:
  [1]严桂兰.C语言程序设计与应用教程[M].福建:厦门大学出版社,2001.
  [2]谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,2005.


转载注明来源:https://www.xzbu.com/9/view-939937.htm