The C Book - 目录 The C Book - 前言(2)
Apr 06

 

关于本书

 

    本书在写作时考虑了两类读者。也许你从未接触过C并想学习这门语言,或者已经学习过这门语言的旧版本,但想知道更多关于新标准的内容(译注1)。无论是哪一种情况,我们都希望你觉得本书的内容有用,并且有趣。

    本书不是给初学编程者用的教材。本书所设想的读者,是已经有过一些使用现代过程化编程语言经验的。就像我们后面还要再讲到的,C语言并不适合没有任何经验的 初学者--尽管还是有很多初学者学会使用它了--所以本书假设读者已经在诸如语句、变量、条件执行、数组、过程(或子程序)等等概念上下过工夫了。与其浪 费你的时间来罗嗦怎么把两个数做加法,或是乘法的符号是*,还不如把重点放在C语言与众不同的地方。具体来说,本书强调的是如何使用C语言

    已经学过旧版C的读者会对新标准感兴趣,会想知道新标准对旧有的C程序有什么影响。初看上去,新标准对旧有程序的影响似乎对初学者没有太大意义,但是实际上 C语言新旧版的问题对初学者也同样是存在的。在新标准通过后的若干年内,程序员很容易就会碰到新旧版程序混在一起的情况,具体取决于他们所用程序有多老 旧。正因为如此,本书突出强调了新旧版有重大区别的地方。旧版中的一些特性可不是点缀,必须尽量避免;在新标准中这些特性甚至被认为是应该废弃不用的。因 此,这些特性在本书中就不作过于详细的讲解,而只是讲到你能明白它们是什么意思为止。如果有人想用这些旧的特性来程序的话,那么他们就根本不应该来读这本书。

    这是本书的第二版,在第一版的基础上,我们针对最终的、已获批准的新标准做了修订。第一版是根据新标准的草案来写的,其中有一些与最终批准的标准出入的地 方。在修订时,我们借这个机会加入了更多小结的内容,另外还加了一章来示范如何用C语言及其标准函数库来解决一些小问题。

 

C语言的成功

 

    C语言是一个非同寻常的语言。最开始由新泽西州AT&T贝尔实验室的Dennis Ritchie一人独力设计,而后日益普及。时至今日,它也许是世界上被应用得最广泛的编程语言之一(译注2)。C语言的成功,有几个原因。其中没有一个 是决定性的,但所有的原因都很重要。也许这其中最重要的原因,就是C语言是由第一线的程序员开发出来的,而且是被设计用来做日常工作,而不是作秀或是演 示。就好像任何设计精良的工具一样,它非常称手,使用方便。它没有约束,没有检查,没有严格界限。它致力于给你力量而不是拖你的后腿。

    正因为如此,它才更适合老手而不是新手。在初学编程时,你需要一个保护你的环境,让它对你的错误给出反馈,让它帮助你很快得到结果,也就是能够运行的程序, 尽管它也许没能做到你想做的事。C语言可不是这样的!丛林中的老手会用链锯很快地把树锯断,而且十分清楚当机器运转时用手碰锯齿的危险;C程序员也是一样 的。尽管现代的C编译器在发现有什么地方异乎寻常的时候会给出那么一点反馈,你还是几乎总能够强迫编译器去做你说你想要做的事,并且让它闭嘴。如果你说你 想要做的事的的确确是你想要做的事,那么你就能得到你想要的结果。用C语言编程就好像是大块吃肉、大碗喝酒,只不过你的动脉和肝脏更可能幸存下来罢了。

    C语言不仅仅是受欢迎,也不仅仅是天天编程的程序员军火库里的重炮;它的成功还有别的原因。它总是和UNIX操作系统联系在一起,并且得益于UNIX操作系 统的日益流行。尽管对于大型商务数据处理应用程序来说,C语言初看起来并不是最好的选择,但C语言有一个最大的优势,就是每个商业化的UNIX系统都能运 行C程序。UNIX本身就是用C语言写的,所以每当UNIX在一种新的硬件系统中实现的时候,首要的任务必然是在这系统上运行一个C编译器。这样,最后的 结果就是几乎找不到一个UNIX系统不支持C语言的。所以,针对UNIX市场的软件供应商们发现,如果想要软件在尽可能多的系统上运行的话,C语言是最好 的选择。事实上,如果要让软件在UNIX环境下可移植,那么C语言就是首选。

    随着个人电脑市场的爆炸式扩展,越来越多的人能够使用C语言,C语言也被越来越多的人使用。C语言就好像是为了在PC上开发软件而量身定做的一样--开发者不仅从中得到了高级语言的高效、可读,也同时能发掘PC架构的大部分潜能而无需使 用汇编代码。C语言在这点上是独一无二的,即它同时跨越了两个层面上的编程;在提供高级的流程控制、数据结构以及过程的同时--所有这些都是现代高级语言 的特点--它也可以让系统程序员去存取某一个机器字,进行位操作,以及在他们需要的时候直接操作底层的硬件。这样的特色组合在竞争激烈的PC软件市场中是 十分有用的,其结果就是越来越多的开发者选择C做为他们的首选开发语言。

    最后,C语言如此受欢迎,与它非常容易扩展的特点也很有关系。很 多其它的编程语言不能提供业界应用程序所需要的文件存取以及通用的输入、输出功能。从传统上来讲,在这些语言中,I/O都是内置的,而且实际上是由编译器 负责的。而C语言设计中的神来之笔(有意思的是,这也是UNIX系统的强项)一直以来都是这样一种理念:如果你不知道如何对某种通用要求提供完整的解决方 案,那么,不要提供半个解决方案(这必然不会让任何人满意),而应该让用户去构建他们自己的解决方案。全世界的软件设计者都应当从这里学到点东西!这就是 C语言一直以来采取的思路,而不仅仅是针对I/O。通过调用库函数,你可以从很多个方面来扩展这个语言,从而提供语言设计者想到没有想到过 的功能。这在所谓标准I/O库(stdio)中就有明证。这个函数库成熟起来比C语言本身要慢得多,但在标准委员会正式给予它承认之前,它自身已经成为了 某种意义上的标准。它证明了,尽管最初诞生于UNIX,由此开发出的文件I/O模型及其它相关功能,是完全有可能在UNIX之外的许多系统上移植的。尽管 C语言可以对底层硬件进行操作,明智的风格以及stdio包的使用成就了高度可移植的程序;其中很多程序可以在看起来完全不同的操作系统上运行。这个函数 库的好处在于,如果你对它的功能不满意,又有恰当的专业技术,那么你通常可以扩展它,使它做你想做的事,或者干脆跳过它不用。

 

标准

 

    值得一提的是,C语言在没有一个正式的标准之前就已经取得了成功。更值得一提的是,在这段时间里,虽然C语言被越来越多的人使用,C语言却从来没有发展成出 几个非常不同的分支,而这正是诸如BASIC之类语言式微的根源。不过,其实这也并不奇怪。因为一直以来,C语言都有一个“用户手册”,也就是Brian Kernighan和Dennis Ritchie合著的那本鼎鼎有名的书,通常称之为“K&R”。

The C Programming Language,
B.W. Kernighan and D. M. Ritchie,
Prentice-Hall
Englewood Cliffs,
New Jersey,
1978

    另一个防止C语言发展成为几个分支的因素是,在UNIX系统上,一直以来实际上只有一个C编译器,即最早由Steve Johnson写成的,所谓“可移植C编译器(Portable C Compiler)”。这个编译器成为了C语言的参照实现--如果K&R有点晦涩难懂,那么这个UNIX的C编译器的行为就被当成是C语言的定义了。

    这个情形几乎是很理想了(用户手册和参考实现,是用极低成本实现稳定性的好方法),直到PC世界里出现的各种各样的C编译器开始威胁到了这个语言的稳定性。

    美国国家标准协会(American National Standard Institute,即ANSI)的X3J11委员会于80年代初开始为C语言起草一个正式的标准。这个委员会把K&R作为参考,开始了漫长而艰苦的工 作。这项工作的目的,是为了消除歧义、明确规定、弥补语言中最令人头痛的缺陷并同时保留C的精神--所有这些,再加上尽其可能地兼容当时已有的惯例。幸运 的是,几乎对于所有相互竞争的C语言版本,其开发者在委员会上都有一席之地。而这本身从一开始就起到了强大的同化作用。

    与很多其它标准的制定一样,C语言标准的制定花费了相当长的时间。尽管技术上的工作也很费时,但很多工作不仅仅是技术上的,也是程序上的。人们很容易低估 在制定标准时程序上的工作,把它看成是技术工作美玉上的瑕疵,但其实程序上的工作也是和技术工作同等重要的。如果一个标准没有被业界普遍认同,那么它就很 难被普遍采用,而且很可能成为无用、甚至是有害的东西。取得委员会成员的普遍认同这一艰苦工作,对于实用的标准来说是非常关键的。尽管这有时意味着对于技 术上的“完美”进行妥协--且不论这个“完美”是何含义。这是个民主的过程,对所有人公开,所以有时会走上岔路,有时又会过分放纵技术纯粹主义者,而且不 幸的是,在标准制定的最后关头,程序上的而不是技术上的问题又拖了后腿。技术上的工作到1988年12月就已经完成了,但为了解决程序上的争议又多花了一 年的时间。最后,这个标准终于在1989年12月7日获准作为正式美国国家标准公布了。

 


 

译者注:

[1]、这本书出版于1991年,正是标准C(即C89)刚刚正式发布不久。这里所谓的“旧版本”,指的是之前以K&R(即《The C Programming Language》第一版)为实际标准的旧版C,也称为K&R C。

[2]、这句话放在今天(2009年),也仍然是成立的。

“The C Book - 前言(1)”有2篇评论

  1. 咨询 Says:

    如果给初学者推荐教材
    对方英语不好,必须使用汉语
    那本书比较靠谱?

    编著和翻译得不错的能否都推荐一两本?

    十分感谢


    除了谭浩强的C语言,我没有认真读过中文的编程的书。以前还试者读过几本,但因为翻译错误或不知所云读不下去。所以无从推荐。抱歉! — eng

  2. 咨询 Says:

    只有期待您早日翻译完成,出个合集了

    否则,英语不行的那些家伙,岂不是只有上谭师傅的当一个选择了.

发表评论

CAPTCHA Image
*