1.2 认识C语言
C语言的前身是B语言,于1972年由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)在PDP-11的UNIX操作系统上设计出来。里奇最初的目的主要是将其作为开发UNIX操作系统的工具,但因为C语言使UNIX操作系统开发难度降低且进行顺利,所以它也开始应用在其他的程序设计领域。众所周知的开放源码操作系统——Linux操作系统与微软的Windows操作系统,甚至苹果公司的macOS系统所提供的超炫功能,都是用以C语言为基础的面向对象语言Objective-C开发完成的。C语言具有以下4个特点。
■ 拥有硬件处理能力。
C语言在计算机领域中是一种接近“天然”的程序语言。谈到最“天然”的程序语言,当然非机器语言莫属,虽然使用这种语言来写程序非常麻烦,但只要将其放进计算机就能够直接阅读与执行。
Tips
机器语言是最早期的程序语言,由1和0两种符号构成。任何程序在执行前都必须被转换为机器语言,不过不同的计算机制造商往往会因为计算机硬件设计的不同而开发不同的机器语言。
C语言虽然没有机器语言般的执行效率,但是除了具有高级语言易懂好学的特性外,还可以处理低阶存储器与位元逻辑运算问题,即拥有直接控制硬件的能力,称得上是最低阶的高级语言。例如单晶片(如8051)或嵌入式系统的开发,也都可以使用C语言来设计。
■ 高执行效率的编译型语言。
编写程序是为了得到执行的结果,因此程序都必须转换成机器语言。从转换的方式来看,程序语言可分成编译型语言与解释型语言两种。编译型语言属于“先苦后甘”型,C语言、C++、Pascal、FORTRAN语言等都属于编译型语言。
原始程序写完后并不能马上执行,必须使用编译器经过数个阶段的处理,才能转换为机器可读取的可执行文件(.exe),而且每修改一次原始程序,就必须重新编译一次。这样的方式虽然看起来有点麻烦,但因为目的程序会对应成机器码,所以在计算机上能够直接执行,不需要每次执行时都进行编译,执行速度自然快了许多,但程序所占用的空间较大。
Tips
解释型语言就属于“先甘后苦”型了。原始程序可以通过解释程序(又称解释器)将程序一行一行地读入,再逐行解释并交由计算机执行,不会产生目的文件或可执行文件。解释的过程中如果发生错误,则解释动作会立刻停止。解释语言表面上不需要等待几个步骤后才能执行,但每执行一行程序就解释一次,这样执行速度反而变得很慢。不过由于其仅需存取原始程序,不需要再转换为其他类型的文件,因此所占用的存储空间较小。Basic、LISP、Prolog等语言都属于解释型语言。
■ 程序可移植性强。
我们知道汇编语言对于不同的CPU会有不同的指令集,每一种操作系统的汇编语言都不一样。就计算机而言,其使用的是80×86的汇编语言。可移植性差的问题会造成用户汇编语言使用上的困扰。
Tips
编译器的主要功能是将汇编语言所编写的程序翻译成机器码,它还必须提供给链接器及载入器所需要的信息,找到每一个变量的地址。翻译的机器码称为目标程序。汇编语言是一种低阶的程序语言,可直接对计算机硬件进行控制。
自从美国国家标准学会为C语言制定了一套完整的国际标准语法ANSI C后,许多操作系统纷纷开发了C语言的编译器,如MS-DOS、Windows、UNIX/Linux,甚至macOS操作系统等,让C语言具备了相当强的可移植性。也就是说利用C语言开发出来的软件,只要稍做修改就能立刻“搬”到别的操作系统上运行。所以目前如果读者要学习C语言,只要使用最简单且符合ANSI C格式的C语言语法,就可在各个平台上通行无阻了。
■ 结构化语法设计。
正如前言所述,C语言在语法设计上具有高级语言的结构化与模块化特性,可以利用函数来增加程序代码的可读性,并包含顺序、循环和选择等结构,具有层次清楚、条理分明的风格。此外,除了可以自定义函数之外,C语言还提供了标准函数库(C standard library),可以让用户直接利用#include语句在表头文件中引用所需的函数。
Tips
具有传统“结构化程序设计”功能与特性的技术着重于将算法分解成许多模块来加以执行,面向对象设计的理念就是把每一个对象都看作一个独立的个体。通常对象并不会凭空产生,它必须有一个可以依据的原型,这个原型就是一般在对象导向程序设计中所称的“类”(class)。类是一种用来具体描述对象状态与行为的数据类型。我们无须理解这些特定功能如何实现这个目标过程,仅需将需求告诉这个独立个体,如果此个体能独立完成,便直接将此任务交付给命令发出者。对象导向程序设计的重点是强调程序的可读性、重复使用性与扩展性。