1.2.3 程序设计和程序设计语言

第03讲

程序设计是按指定要求编排计算机能识别的特定指令组合的过程,而程序设计语言是为方便人进行程序设计而提供的一种手段,是人与计算机交流的语言。程序设计语言随着计算机技术的发展而不断发展。

计算机能直接识别的是由“0”和“1”组成的二进制数——二进制是计算机语言的基础。一开始,人们只能用计算机能直接理解的语言去命令计算机工作,即写出一串串由“0”和“1”组成的指令序列交给计算机执行,这种语言称为机器语言。如图1-2a所示,由“0”和“1”组成的一行数字序列对应一条机器语言指令。用机器语言编写的程序非常难以阅读,使用机器语言编写程序是一项十分痛苦的工作,特别是在程序有错需要查找、修改时更是如此。而且,由于每台计算机的指令系统往往各不相同,因此在一台计算机上执行的程序,要想在另一台计算机上执行,必须重新修改程序,这就造成了重复工作。所以,现在很少有人用机器语言直接写程序。

为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、有一定含义的符号串来替代一个特定指令的二进制串,比如,用“ADD”代表加法,用“SUB”代表减法,用“MOV”代表数据传递等,这样一来,人们很容易读懂并理解程序在干什么,从而使得纠错及维护都变得方便了,这种程序设计语言称为汇编语言,即第二代计算机语言。图1-2a给出的八条机器语言指令可用图1-2b所示的八条汇编语言指令来对应,它们实现相同的功能。然而对于计算机而言,它只认识“0”和“1”组成的指令,并不认识这些符号,这就需要一个专门的程序来将这些符号翻译成计算机能直接识别和理解的二进制数的机器语言,完成这种工作的程序被称为汇编程序,它充当的就是翻译者的角色。汇编语言同样十分依赖于机器硬件,其移植性不好,但效率很高。现代的桌面计算机,其功能已经非常强大,效率已经不是首要关注目标。所以,通常只有在资源受限的嵌入式环境或与硬件相关的程序设计(如驱动程序)过程中,汇编语言才会作为一种首选的软件开发语言。

图1-2 三种语言程序片段

虽然机器语言发展到汇编语言已经有了很大的进步,但是由于每条指令完成的工作非常有限,因此编程过程仍然很烦琐,语义表达仍然比较费力。于是,人们期望有更加方便、功能更加强大的高级编程语言。这种高级语言应该接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。C语言就是一种能满足这种要求的语言,它既有高级语言的通用性又有底层语言的高效性,展示出了强大的生命力,几十年来一直被广泛应用。如图1-2c所示,一条C语言语句可以对应多条汇编或机器语言指令。许多高校也将C语言作为计算机专业和相关专业的重要必修课,作为高校在校学生接触的第一门编程语言。同样,计算机本身并不“认识”C语言程序,因此需要将C语言程序先翻译成汇编程序,再将汇编程序翻译成机器语言,这个过程往往由编译程序来完成。

为了使程序设计更加接近自然语言的表达,方便用户实现功能,包括C语言在内的所有程序设计语言必须具有数据表达和数据处理(称为控制)这两方面的能力。

1.数据表达

为了充分有效地表达各种各样的数据,人们通常会对常见数据进行归纳总结,确定其共性,最终尽可能地将所有数据抽象为若干种类型。数据类型(data type)就是对某些具有共同特点的数据集合的总称。如常说的整数、实数就是数据类型的例子。

在程序设计语言中,一般都事先定义几种基本的数据类型供程序员直接使用,如C语言中的整型、浮点型、字符型等。这些基本数据类型在程序中的具体对象主要有两种形式:常量(constant)和变量(variable)。常量在程序中是不变的,例如,987是一个整型常量。对于变量,则可对其做一些相关的操作,例如,改变它的值。

同时,为了使程序员能更充分地表达各种复杂的数据,C语言等程序设计语言还提供了丰富的构造新数据类型的手段,如数组(array)、结构(struct)、联合(union)、文件(file)和指针(pointer)等。

2.数据处理的流程控制

高级程序设计语言除了能有效地表达各种各样的数据外,还必须能对数据进行有效的处理,提供一种手段来表达数据处理的过程,即程序的控制过程。

一种比较典型的程序设计方法是:将复杂程序划分为若干个相互独立的模块,使每个模块的工作变得单一而明确,在设计一个模块时不受其他模块的影响。同时,通过现有模块积木式地扩展又可以形成复杂的、更大的程序模块或程序。这种程序设计方法就是结构化程序设计方法,C语言就是典型的采用这种设计方法的语言。按照结构化程序设计的观点,任何程序都可以将模块通过三种基本的控制结构(顺序、选择和循环)的组合来实现。

当要处理的问题比较复杂时,为了增强程序的可读性和可维护性,常常将程序分为若干个相对独立的子模块,在C语言中,子模块的实现通过函数完成。