C语言的发展方向-The development direction of C language

20世纪80年代初,C在UNIX系统的小型机世界已经是主导语言了。从那时开始,它已经扩展到个人计算机(微型机)和大型机(庞然大物),如图所示。许多软件开发商都首选C语言来开发其子处理程序、电子表格软件、编译器和其他产品。这些公司知道,C可以产生紧凑而高效的程序。更重要的是他们知道这些程序易于修改而且易于适应新的计算机模式。

C的应用领域

对于公司和熟悉C语言的人有益的东西,对其他用户同样有益。越来越多的计算机用户已转向使用C以便利用其优点。不一定非得是计算机专业人员才能使用C。

在20世纪90年代,许多软件开发商开始转向使用C以便利用其优点。不一定非得是计算机专业人员才能使用C。

在20世纪90年代,许多软件开发商开始转向使用C++语言来进行大的编程项目。C++向C语言嫁接了面向对象编程工具(面向对象编程是一种哲学思想,它试图让语言来适应问题,而不是让问题来适应语言)。C++差不多是C的一个超集,意味着任何C程序都同时是,或差不多是一个有效的C++程序。通过学习C,您还会学习到C++的许多知识。

不管C++和Java这样较新的语言如何流行,C在软件产业中仍然是一种重要的技能,在最想获得的技能中,它一般都列前10名。特别是在嵌入式系统的编程中,C已经开始流行,也就是说,它将用来为汽车、照相机、DVD播放器和其他现代化设备中逐渐普及的微处理器编程。同样,C已经开始进入长期以来一直属于FORTRAN的科学编程领域。最后,由于它是一种适合用来开发操作系统的语言,C在linux的开发中也扮演着重要的角色。因此,在21世纪的前10年中,C仍将保持强劲的势头。

简言之,C是最重要的编程语言之一,并将继续如此。如果你想找一份编写软件的工作,则首先您应该能够回答“是”的一个问题就是:“请问,您会使用C吗?”

计算机的工作的基本原理-The basic principle of computer work

既然打算学习如何用C编程,您就应了解计算机工作原理方面的一些知识。这些知识会帮助您理解用C编写程序与运行该程序时最终会发生的事情之间的联系。

现代计算机可分为几个部件。中央算是单元(或称CPU)担负着绝大部分的计算工作:随机访问存储器(或称RAM)作为一个工作区来保存程序和文件:永久存储器,一般是硬盘,即使在计算机关机时也能记下程序和文件:还有各种外围设备(如键盘、鼠标和监视器)用来提供人与计算机之间的通信。CPU负责处理程序,所以我们集中来讨论它的功能。

CPU的工作非常简单,至少在我们所做的这一简短描述中是这样的。它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令,然后从内存中获取下一个指令并执行。一个千兆CPU有自己的小工作区,该工作区由若干个寄存器(registers)组成,每个寄存器可以保存一个数。一个寄存器保存下一条指令的内在地址,CPU使用该信息获取下一条指令。获取一条指令后,CPU在另一个寄存器中保存该指令并将第一个寄存器的值更新为下一条指令的地址。CPU只能理解有限的指令(指令集)。还有,这些指令是相当具体的,其中许多指令要求计算机将一个数从一个位置移动到另一个位置,例如,从内存单元移到寄存器。

这段说明中有两个有趣的地方。首先,存储在计算机中的一切内容都是数字。数字是以数字形式存储的,字符(如文本文档中使用的字母字符)也是以数字形式存储的,每个字符有一个数字代码。计算机装载到寄存器中的指令是以数字形式存储的,指令集中的每条指令具有一个数字代码。其次,计算机程序最终必须以这种数字指令代码(或称为机器语言)来表示。

明白了计算机运行方式的一个结果就是:如果您希望计算机做某件事,就必须提供一个特定的指令列表(一套程序)确切地告诉计算机要做的事及如何去做。您必须以一种计算机可以直接理解的语言(机器语言)来创建该程序。这是一项繁琐、乏味、费力的任务。即使将两个数字相加这样简单的事也必须被分解成若干个步骤:

  1. 将内存单元为2000中的数字复制到寄存器1。
  2. 将内在单元为2004中的数字复制到寄存器2。
  3. 将寄存器2的内容加到寄存器1的内容上,答案保留在寄存器1中。
  4. 将寄存器1的内容复制到内存单元2008。

而且您必须用数字代码来表示这些指令中的每一个!

如果您喜欢以这种方式编写程序,那么很不幸,您将会发现机器语言编程的黄金时期已经过去很久了,但如果您喜欢更有乐趣的事,则请向高级编程语言敞开您的心扉。

高级计算机语言和编译器-The advanced computer language and compiler

如C这样的高级编程语言,可以从几个方面简化您的编程过程。首先,您不必用数字代码表示指令。其次,您所使用的指令更接近您考虑问题的方式,而非接近计算机使用的详细操作步骤。现在您不用再考虑特定CPU实现特定任务所必须采取的精确步骤,面是可以在更抽象的层次上表达您的意图。例如,要对两个数求和,您可以编写下列内容:

total = mine + yours:

看到这样的代码,您就会清楚地知道它的作用。但如果看到用数字代码表示的由若干条指令组成的机器语言等价代码,则不会让人这么明白。

不幸的是,对计算机来说正好相反。对计算机来说,高级指令是不能理解的胡言乱语。而这正是出现编译器的原因。编译器是将高级语言程序解释成计算机所需的详细机器语言指令集的程序。您进行高级思考,编译器则负责乏味的琐碎工作。

采用编译器还有另一个好处。一般来说,每种计算机在设计上都有其自身特有的机器语言。所以用机器语言为一个Intel Pentium CPU编写的程序对Motorola PowerPC CPU来说什么都不是。但您可以将编译器匹配一种特定的机器语言。这样,使用正确的编译器或编译器集,您就可以将同一高级语言程序转换为各种不同的机器语言程序。您解决一个编程问题只须一次,然后可以让编译器将该解决方案解释为各种机器语言。

简言之,高级语言(如C、Java和Pascal)都以更抽象的方式描述动作,并且没有与特定的CPU或指令集相关联。同样,高级语言更易于学习,而且用高级语言编写程序比用机器语言容易得多。

boxone

boxtwo

boxthree

boxfour

boxfive

boxsix

boxseven