第1章 C语言简介

作者: 橡树人 | 来源:发表于2020-02-20 21:20 被阅读0次

    英文原版:P1

    什么是C语言?
    简单的答案:一种广泛使用的编程语言,该语言是由贝尔实验室在20世纪70年代早期开发。
    这个简单的答案没有体现出C语言独有的风格。
    在深入C语言的细节之前,先看一看C语言从哪里来,C语言为啥而设计,这么多年来发生了哪些变化等。然后,讨论一下C语言的长处和缺点,基于C语言如何才能获得最多的好处等。

    1.1 C语言的历史

    快速浏览一下C语言的历史:从它的起源,到它成为标准语言的时代,再到它对新近产生的语言的影响。

    起源

    C语言是UNIX操作系统的副产物,UNIX操作系统是由Bell实验的Ken Thompson、Dennis Ritchie等人开发的。

    1969年,Thompson一个人使用汇编语言编写了UNIX的初始版本,该初始版本可在Dec PDP-7计算机上运行。
    Dec PDP-7计算机是一台早期的微型计算机,内存只有8K个字。

    跟同时代的其他操作系统一样,UNIX是用汇编语言编写的。由于使用汇编语言编写的程序通常很容易出bug,很难维护,UNIX也不例外,所以Thompson决定为后续的Unix开发一种更高级的语言。
    Thompson基于BCPL设计了B语言。BCPL是一种在20世纪60年代中期开发的系统编程语言,可追溯其祖宗到Algol 60,其中Algol 60是最有影响和最早的编程语言之一。
    Ritchie很快就加入了UNIX项目,并使用B语言编程。

    1970年,Bell实验室为UNIX项目获取了一台PDP-11。当B语言能在PDP-11上启动并运行时,Thompson就使用B语言重写了部分UNIX。

    截止1971年,由于B语言非常不适合PDP-11,所以Ritchie就开发了B语言的拓展版本。
    最初,Ritchie将他的新语言叫做NB。后来,随着NB跟B语言的差别越来越大,Ritchie就将名字由NB改成C语言。

    到1973年,C语言已经足够稳定,可使用C语言来重写UNIX系统。

    从汇编语言切换到C语言提供了一种非常重要的特征:可移植性。通过为Bell实验室的其他计算机编写C语言的编译器,UNIX团队可使UNIX能在那些安装了C语言编译器的机器上运行。

    C语言标准:C89、C99

    在整个20世纪70年代里,C语言继续演变,尤其是在1977年到1979年。正好在这一时期,有关C语言的第一本书出现了。由Brian Kernighan和Dennis Ritchie所写的《C Programming Language》在1978年出版,很快就成为C程序员的圣经。由于缺少有关C的官方标准,所以这本书就暂时充当所谓的标准。

    在整个20世纪70年代,有相对较少的C程序员,且这些C程序员又是UNIX的用户。截止20世纪80年代,C语言已经拓展到了UNIX的狭窄边界之外。C编译器在许多运行着不同操作系统的机器上都可用。尤为特殊的是,C语言开始在快速增长的IBM PC平台上确立自己。

    伴随着C语言的流行,同时也出现了很多问题。编写新的C编译器的程序员拿K&R当做参考书。不幸的是,由于K&R对一些语言特征讲的很模糊,导致编译器对待这些特征的方式也不同。还有,K&R没能清楚地区分哪些特征是属于C语言的,哪些特征是属于UNIX的。更糟糕的是,在K&R出版后,C语言继续变化,添加了一些新的特征,移除了部分老旧的特征。此时,显然需要一份全面的、精确的、持续更新的C语言描述规范。如果没有这样的一个标准,将会出现有关C语言的各种方言版本,会极大地破坏C程序的可移植性,其中可移植性是C程序的主要的优势之一。

    在美国国家标准委员会ANSI的主持下,从1983年起,有关C语言的美国标准开始开发。
    在许多版本后,在1988年,标准开发完成。
    在1989年12月,作为ANSI标准X3.159-1989正式发布。
    在1990年,该标准被国际标准组织ISO接受,作为国际标准ISO/IEC 9899:1990
    因此,这一版本的C语言标准常被引用为C89或者C90,用于区分C语言的初始版本K&R。附录C中总结了C89和K&R之间的不同。
    在1995年,C语言经历了一些改动。
    在1999年,C语言发生了更多的意义重大的改动,作为新的标准ISO/IEC 9899:1999。用这个标准描述的C语言被称为C99。

    由于C99还不是通用的,且还需要维护使用旧版本C语言编写的上百万行代码,所以本书将会使用一些标记来说明这个特征是C99里添加的。没有识别C99的特征的编译器跟C99不是兼容的。如果历史可以作为参考的话,在所有的C编译器都编程C99兼容型之前还要花费一段时间。在附录B中列举了C99和C89之间的区别。

    基于C的语言:C++、Java、C#

    C语言对当今的编程语言有着深远的影响,其中许多语言都从C语言中借鉴了很多。在许多基于C的语言里,有一些是非常流行:

    • C++
      C++包括了C的所有特征,但添加了类class和其他特征来支持面向对象编程;
    • Java
      Java是基于C++的,因此继承了许多C的特征;
    • C#
      C#是更新的、从C++和java导出的语言;

    考虑到较新的编程语言的流行,很自然的提出一个问题:是否还值得花费功夫来学习C语言?
    第一,学习C语言可让你更深刻地理解C++、Java、C#等语言的一些特征。许多学习C++、Java、C#等语言的程序员经常不能掌握从C语言继承过来的一些基本特征。
    第二,存在许多老旧的C语言程序,可能需要你去阅读和维护。
    第三,C语言仍被用于开发新的软件,尤其是内存有限情形或者处理器性能有限情形或者需要C语言简单性的情形等。

    如果你还没有使用过C++、Java、C#等语言之一,则你将会发现本书会为学习这些语言打下坚实基础。本书强调数据抽象信息隐藏等在面向对象编程里扮演重要角色的原理。

    由于C++包含了C的所有特征,所以如果您后来接触C++的话,您就可以用上所有从本书学到的知识。此外,C语言的许多特征也能在其他基于C的编程语言中发现。

    1.2 C语言的优点和缺点

    跟其他编程语言一样,C语言有优点,也有缺点。
    C语言的优点和缺点都源自C语言的最初的使用(编写操作系统和其他软件)及其基本哲学:

    • C语言是一种底层语言
      作为一种为服务于系统编程而生的编程语言,C语言可访问其他语言尽力隐藏的机器级别的概念(比如字节及地址);
      C语言提供一些跟计算机内置指令紧密相关的操作,以便程序可快速执行;
      由于应用程序要依赖操作系统来完成I/O、存储管理等服务,所以操作系统不能容忍执行速度慢;
    • C语言是一种小语言
      跟其他语言相比,C语言提供了更小的特征集;
      为了保持小数量的语言特征,C语言严重依赖标准库函数;
    • C语言是一种自由度很高的语言
      由于C语言假设您知道你正在做什么,所以C语言允许给您的自由度要比其他语言高;
      C语言没有强制要求详细的错误检查机制;

    C语言的优点

    C语言的优点对解释为什么C语言如此流行有帮助:

    • 效率高;
      从C语言诞生起,效率高就一直是其优点之一;
      因为C语言是为曾使用汇编语言的应用而开发的,所以C程序能在有限的内存上运行地快很关键;
    • 可移植性;
      虽然程序的可移植性不是C语言的主要目标,但是已证明可移植性是C语言的优点之一;
      当一个程序能在从PCs到超级计算机上都能运行时,则这个程序经常都是使用C语言编写的;
      C程序拥有可移植性的一个原因是多亏了C语言早期跟UNIX系统及后来的ANSI/ISO标准的联系;另一个原因是C编译器很小且很容易编写,使得C程序的到处可得;
      C语言自身有一些特征就支持可移植性;
    • 功能强大;
      C语言大量的数据类型和运算符使其成为一种功能强大的语言;
      其他语言通常需要很多行代码完成的工作,如果使用C语言,则仅需几行;
    • 灵活性;
      虽然C语言最初是为系统编程而设计的,但是C语言并没有内在的非得要局限在系统方面的限制;
      C语言适用于各种类型的应用,从嵌入式系统到商业数据处理等;
      C语言对其特征的使用有非常少的限制,在其他语言里有些操作是非法的,但在C语言里是合法的,比如C语言允许一个整数值(或者一个浮点数)和一个字符相加等;
      这种灵活性使得编程更容易;
    • 标准库;
      C语言跟其他语言相比的巨大优势就是C语言的标准库,这个标准库包含上千个函数,比如I/O、字符串处理、存储分配等;
    • 跟UNIX相互整合;
      跟UNIX的结合使得C语言非常强大;实际上,有些UNIX工具本身就假设用户知道C语言;

    C语言的缺点

    • 容易出错
      C语言的灵活性使其成为一门容易出错的语言;
      在其他语言里通过编译器可检测出的编程错误不能被C编译器检测到;从这方面讲,C语言非常像汇编语言,许多错误直到运行时才能被检测出;更糟糕的是,对于粗心的人,C语言包含一些陷阱;在后面的章节里,我们将看到一个额外的分号如何导致死循环,缺少一个&符号是如何导致程序崩溃的;
    • 难于理解
      一个问题是虽然C语言是一门小型的语言,但是C语言有一些特征是在其他语言里没有的;这些特征可以多种方式进行组合,导致有些特征对于程序作者来说很显然,但对于别人来说很难理解;因此,为了最小化进入和编辑程序花费的时间,程序C程序有目的地保持简洁;C语言的灵活性也能成为一个负面因素,比如很聪明的程序员可能会使程序变得不可能被理解;
    • 难于修改
      如果使用C语言编写大型程序时没有时刻牢记程序的可维护性,则修改该程序会很难;现在的编程语言都提供一些特征,比如类class和包packages来将一个大型程序分割成多个可管理的单元,但C语言没有这些特征;

    有效使用C语言

    有效地使用C语言要求利用C语言的优点,同时尽可能地避免C语言的缺点。这里给出一些建议:

    • 学习如何避免C语言的陷阱
      完整的C语言的陷阱,可参考《C traps and Pitfalls》;
    • 使用软件工具来使程序更可靠
      C程序员是多产的工具构建者;最著名的C语言工具之一就是lintlint最初是由UNIX提供的,比大部分C编译器能提供更多的错误分析;如果lint可用的话,则最好就使用;
      另一个有用的工具就是debugger;由于C语言的本质,C编译器检测不出许多bugs,这些bugs通常表现为运行时错误或者不正确的输出;因此,对于C程序员来说,必须会使用一个优秀的debugger;
    • 多利用现存代码库
      使用C语言的好处之一就是如此多的人都在使用它,你可以在你的程序里使用他们编写的代码;C代码通常是打包成库的;获取一个合适的库是减少错误和节省编程工作的的一种好方法;常见任务的库,包括用户界面开发、图形库、通信库、数据库管理、网络库等都是可用的;有些库是开放的,有些库是可售卖的;
    • 采用编码约定
      一种编程约定是一种程序员决定采用的编码风格;良好的编码风格会使代码更统一、更容易读、更容易修改;使用C语言时,编码约定很重要;C语言的灵活性导致程序员写出很多不可读的代码;本书中的代码遵循一套约定;
    • 避免过分的技巧和过复杂的代码
      C程序员鼓励编程技巧;使用C语言来完成一个任务通常有许多方式;程序员通常会选择最简单的;最简单的通常是最难理解的;
    • 遵循标准
      大部分C编译器都提供一些不在C89或者C99中的特征和库函数;为了保证可移植性,最好避免使用非标准的特征和库,除非这些特征和库是必要的;

    相关文章

      网友评论

        本文标题:第1章 C语言简介

        本文链接:https://www.haomeiwen.com/subject/lhexqhtx.html