
1.2 程序与程序设计
现代计算机具有计算速度快、计算精度高、自动化程度好以及通用性强等特点,在我们的生活中扮演着越来越重要的角色,被广泛应用于数值计算、数据处理、自动控制、计算机辅助设计以及人工智能等众多的领域。然而计算机并不能自主地实现这些任务,其每一步的操作都是在计算机程序的指挥下完成的,可以说计算机程序就是计算机的灵魂。
“程序”一词来源于生活,通常指完成某项工作的一整套活动过程及活动方式。有了程序这个概念,人们就可以对一系列步骤的执行过程进行详实地描述。
同样的道理,计算机要正确地运行并且完成相应的任务,也需要按照计算机程序的安排去执行。在计算机当中,程序是指使计算机完成某一特定任务而编写的若干条指令的有序集合。计算机程序往往简称为程序,这是计算机系统中最基本的概念。
一个计算机程序具有如下性质。
(1)目的性:程序有明确的目的,在运行时能正确完成赋予它的功能。
(2)分步性:程序为完成其复杂的功能,由一系列计算机能执行的步骤组成。
(3)有限性:程序中所包含的步骤是有限的。
(4)有序性:程序的执行步骤是有序的,不能随意改变这些步骤的执行顺序。
(5)操作性:程序是对某些对象的操作,能完成有意义的功能。
1.2.1 程序设计范型
程序设计的本质就是对计算进行描述。这里所讲的计算是指广义上的计算,而不是简单的加、减、乘、除等算术运算。程序设计范型是计算机编程中的基本风格和典范模式,是编程者在其所创造的虚拟世界中自觉或不自觉采用的世界观和方法论。范型引导人们带着其特有的倾向和思路去分析和解决问题。以不同的计算模型来对计算进行描述就形成了不同的程序设计范型。目前存在若干种程序设计范型,典型的程序设计范型有过程式(面向过程)、对象式(面向对象)、函数式以及逻辑式等。
1. 过程式
过程式程序设计是一种以功能为中心、基于功能分解的程序设计范型。一个过程式程序由一些子程序构成,每个子程序对应一个子功能,它实现了功能抽象。子程序描述了一系列的操作,它是操作的封装体。过程式程序的执行过程体现为一系列子程序调用。在过程式程序中,数据处于附属地位,它独立于子程序,在子程序调用时作为参数传给子程序使用。著名的计算机科学家Nicklaus Wirth提出了如下的经典公式,刻画了过程式程序设计的本质特征。
程序=数据结构+算法
上述公式中的算法是指对数据的加工步骤的描述,而数据结构则是对算法所加工的对象的数据描述。早期的程序设计都采用了过程式程序设计范型,它与冯·诺依曼计算机模型直接对应。过程式程序设计对程序功能的描述比较清晰,所描述的计算过程容易理解。过程式程序设计不足之处在于:数据与操作分离,缺乏对数据的保护;功能会随着需求的改变而发生变化,而功能的变化往往会导致整个程序结构的变动,使得程序难以维护;子程序往往是针对某个应用而设计的,它们很难用于其他应用程序,导致程序难以复用。
2. 对象式
对象式程序设计是一种以数据为中心、基于数据抽象的程序设计范型。对象式程序设计通常称为面向对象程序设计。一个面向对象的程序由一些对象构成,对象是由一些数据及可施加于这些数据上的操作所构成的封装体。对象的特征由相应的类来描述,一个类可以从其他的类继承。面向对象的程序的执行过程体现为各个对象之间相互发送和处理消息。面向对象程序可简单地表示成下面的公式:
程序=对象/类+对象/类+…
对象/类=数据+操作
在面向对象程序设计中,把数据和对数据的操作封装在一起,对数据的操作必须通过相应的对象来进行,从而加强了对数据的保护。对象是相对稳定的实体,由对象构成的程序能够适应软件需求的变化,易于维护。某个领域中的对象往往具有通用性,它们可以用于该领域类似的系统中,因此面向对象程序设计对软件复用有较好的支持。另外,面向对象程序设计范型是对问题领域活动的直接模拟,其中的对象往往对应着问题空间中的有形或无形的实体,它使得解题空间有自然的对应关系,从而有利于对大型复杂问题给出解决方案,使得程序容易设计、容易理解与容易维护。面向对象程序设计的不足之处在于:对程序的整体功能描述不明显;程序会包含较多冗余信息,这对小型应用系统有时不适合;程序效率有时不高。
3. 函数式与逻辑式
函数式程序设计是围绕函数及函数应用来进行的,它基于递归函数理论和λ演算(λ演算即一套用于研究函数定义、函数应用和递归的形式系统),其中,函数也被作为值来看待。逻辑程序设计是把程序组织成一组事实和一组推理规则,它基于的是谓词演算。上述两种程序设计范型常用于人工智能领域的程序开发。
目前,使用较广泛的是过程式和对象式这两种程序设计范型。它们已成为现在的主流程序设计范型,适合于解决大部分的实际应用问题,已被广大的程序设计者所熟悉和采用。本教程只围绕过程式程序设计范型展开,介绍过程式程序设计的基本思想和技术。
1.2.2 程序设计语言
程序设计的结果必然要用一种能被计算机接受的语言表示出来,即编程实现。计算机程序设计语言是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。简单地说计算机程序设计语言是人与计算机进行信息通信的工具。
1. 程序设计语言分类
按照计算机语言的发展过程,程序设计语言可以分为机器语言、汇编语言和高级语言3大类。
(1)机器语言
机器语言是由0、1组成的机器指令的集合。机器语言可以被计算机直接执行。然而不同型号的计算机其机器指令是不能通用的,即按照某种计算机的机器指令编写的程序,不能在另一种计算机上执行,所以机器语言是一种面向机器的语言,也被称为低级语言。机器语言程序具有计算机能够直接识别、执行效率高的优点,但其具有书写难、记忆难、编程困难以及可读性差等缺点。目前,除了计算机生产厂家的专业人员外,绝大多数程序员已经不再去学习机器语言了。
【例1-1】用机器语言程序实现“6+8”的运算。
10110000 00000110 :将6送入累加器AL中 00000100 00001000 :8与累加器AL中的值相加,并将结果放在AL中 11110100 :停机结束
(2)汇编语言
汇编语言克服了机器语言的一些缺点,采用助记符和符号地址来表示机器指令,因此也称作符号语言。在【例1-2】中,用助记符“MOV”表示数据传送,代替了例1-1中的机器指令“10110000”;用助记符“ADD”表示加法运算,代替了例1-1中的机器指令“00000100”;用助记符“HLT”表示停机结束,代替了【例1-1】中的机器指令“11110100”,这样使程序的可读性有了很大的提高。
【例1-2】用汇编语言程序实现“6+8”的运算。
MOV AL, 06 ADD AL, 08 HLT
汇编语言增加了程序的可读性,但其还是低级语言,它也是面向机器的语言。用汇编语言编写的程序不能被计算机直接识别和执行,必须要经过“汇编程序”(一种能把用汇编语言编写的程序翻译成机器语言程序的软件)将其转换成机器语言之后才能执行,这一过程称为汇编。由于汇编语言比机器语言可读性好、执行效率高,所以,许多系统软件的核心部分仍采用汇编语言编制。
(3)高级语言
高级语言是一种接近于自然语言的程序设计语言,它按照人们的语言习惯,使用日常用语、数学公式和符号,按照一定的语法规则来编写程序。
【例1-3】用C语言程序实现“6+8”的运算。
#include<stdio.h> int main( ) /* 主函数 */ { int a; /* 定义整型变量 a */ a=6 + 8 ; /* 6+8 的结果赋给 a */ printf("a=%d\ n", a); /* 显示结果 */ return 0; }
高级语言与自然语言更接近,而与硬件功能相分离(彻底脱离了具体的指令系统),编程者不必了解过多的计算机专业知识便可掌握和使用。高级语言的通用性强,兼容性好,便于移植。高级语言的产生,有力地推动了计算机软件产业的发展,进一步扩展了计算机的应用范围。
2. 程序翻译方式
使用高级语言编写的程序称为高级语言源程序,但计算机不能直接接受和执行源程序,必须通过“翻译程序”将其翻译成机器语言形式后才能执行。这种“翻译”通常有两种方式:编译方式和解释方式。
(1)编译方式
编译方式需要事先编好一个被称为“编译程序”的程序,将其放在计算机中。当高级语言源程序输入到计算机中时,编译程序便把源程序全部翻译成机器指令表示的目标程序;然后执行该目标程序,得到计算结果,如图1-3所示。

图1-3 编译方式
(2)解释方式
解释方式需要事先编好一个被称为“解释程序”的程序,将其放在计算机中。当高级语言源程序输入到计算机中时,解释程序将源程序的每一条语句逐句翻译,逐句执行,也就是边解释边执行,如图1-4所示。需要注意的是,解释方式并不产生目标程序。

图1-4 解释方式
现在用于编程的语言有很多,目前流行的Python语言属于解释方式,其简单易学,开发高效,可移植,可扩展,可嵌入;而C语言属于编译方式。目前,高级语言正朝着面向问题和面向对象的设计方向发展。相信未来的高级语言将会更加便于编程人员的使用。
1.2.3 程序设计步骤
因为计算机的本质是程序的机器,所以只有通过对程序设计的学习才能更好地掌握和使用计算机。程序设计就是设计和编制程序的过程,是将实际问题用计算机方法解决的一个转化过程。尽管不同规模的程序因其复杂程度不同,设计步骤有所差异,但是一些基本步骤是相同的。
(1)问题分析:一般来说程序要解决的是一个具体的问题,所以程序设计人员需要具体问题具体分析,在把任务交给计算机处理之前必须对问题做出明确的分析与定义,确定问题的条件及期望的结果,找出解决问题的规律。
(2)算法设计:算法是解决问题的步骤及其描述,是程序设计的核心内容。算法是根据问题分析中的具体要求而设计的,是对问题处理过程的进一步细化。算法设计过程中,要求采用某种算法描述工具来表示程序运行的具体步骤。
(3)程序编码:编码就是使用计算机编程语言编写源程序代码的过程。在这个过程中,首先应当选择编程语言,然后用该语言来实现上一步骤中设计好的算法。应当注意,对于相同的算法,采用不同的编程语言会对程序的执行效率产生影响。
(4)调试运行:指在计算机上调试程序。调试运行程序有两个目的:一是消除由于疏忽而引起的语法错误或逻辑错误等;二是用各种可能的输入数据对程序进行测试,验证程序是否对各种合理的数据都能得到正确的结果,而对不合理的数据也能做适当的处理。
(5)文档编制:指整理并写出文字材料。文档包括程序说明文件和用户操作手册。程序说明文件记录了程序使用的算法、实现过程,用以保证程序的可读性和可维护性。用户操作手册则需要包含程序功能、运行环境、程序的安装与启动、基本参数的输入等内容。对于开发、维护周期较长的程序来说,适时地编制相应的文档显得尤其重要。