因为c语言是在20世纪,第1章 C语言简介

英文原版: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语言工具之一就是lint;lint最初是由UNIX提供的,比大部分C编译器能提供更多的错误分析;如果lint可用的话,则最好就使用;

另一个有用的工具就是debugger;由于C语言的本质,C编译器检测不出许多bugs,这些bugs通常表现为运行时错误或者不正确的输出;因此,对于C程序员来说,必须会使用一个优秀的debugger;

多利用现存代码库

使用C语言的好处之一就是如此多的人都在使用它,你可以在你的程序里使用他们编写的代码;C代码通常是打包成库的;获取一个合适的库是减少错误和节省编程工作的的一种好方法;常见任务的库,包括用户界面开发、图形库、通信库、数据库管理、网络库等都是可用的;有些库是开放的,有些库是可售卖的;

采用编码约定

一种编程约定是一种程序员决定采用的编码风格;良好的编码风格会使代码更统一、更容易读、更容易修改;使用C语言时,编码约定很重要;C语言的灵活性导致程序员写出很多不可读的代码;本书中的代码遵循一套约定;

避免过分的技巧和过复杂的代码

C程序员鼓励编程技巧;使用C语言来完成一个任务通常有许多方式;程序员通常会选择最简单的;最简单的通常是最难理解的;

遵循标准

大部分C编译器都提供一些不在C89或者C99中的特征和库函数;为了保证可移植性,最好避免使用非标准的特征和库,除非这些特征和库是必要的;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值