1.2.1 程序设计范式
从本质上说,用计算机来解决实际问题就是通过对反映问题本质的数据进行处理来实现的,因此,一个程序包含数据和对数据的加工(操作)这两部分的描述,下面的经典公式反映了程序的这一本质特征,其中,算法(algorithm)是对数据的加工步骤的描述,而数据结构(data structure)则是对反映待解问题本质的数据的描述。
程序=算法+数据结构
虽然程序包含数据和对数据的操作两部分,但在进行程序设计时如何看待和组织它们存在着不同的做法,从而形成不同的程序设计范式。程序设计范式(programming paradigm)是设计、组织和编写程序的一种方式,它往往要基于一组概念、原则和理论。不同的范式将采用不同的程序结构和程序元素来描述程序,并且范式具有针对性,不同的范式往往适合解决不同类型的问题。
目前存在多种程序设计范式,其中,典型的程序设计范式有:过程式、对象式、函数式以及逻辑式等。
1.过程式程序设计
过程式程序设计(procedural programming)是一种以功能为中心、基于功能分解和过程抽象的程序设计范式。一个过程式程序由一些完成特定功能的子程序构成,每个子程序包含一系列的操作,它们是操作的封装体,实现了过程抽象(子程序的使用者只需要知道它们的功能而不需要知道这些功能是如何实现的)。过程式程序的执行过程体现为一系列的子程序调用。在过程式程序中,数据处于附属地位,它们独立于子程序,在子程序调用时通过参数或全局变量传给子程序使用。早期的程序设计大都采用了过程式程序设计范式,它与冯·诺依曼计算模型有着直接的对应关系。
2.对象式(面向对象)程序设计
对象式程序设计是一种以数据为中心、基于数据抽象的程序设计范式,它通常被称为面向对象程序设计(object-oriented programming)。一个面向对象程序由一些对象构成,对象是由一些数据及可施于这些数据上的操作所组成的封装体,它们实现了数据抽象(数据的使用者只需要知道对数据能进行什么操作而不需要知道数据是如何表示的)。对象的特征由相应的类来描述,一个类描述的对象特征可以从其他的类获得(继承)。面向对象程序的执行过程体现为各个对象之间相互发送和处理消息。在面向对象程序中,数据表现为对象的属性,对数据的操作是通过向包含数据的对象发送消息(调用对象提供的操作)来实现的。
3.函数式与逻辑式程序设计
函数式程序设计(functional programming)是围绕函数和表达式计算来进行的,其中,函数被作为数据来看待,即函数的参数和返回值也可以是函数。函数式程序的计算过程体现为一系列的函数应用(把函数作用于数据),它基于的理论是递归函数理论和λ演算。逻辑式程序设计(logic programming)是把程序组织成一组事实和一组推理规则(它们都可被看作数据),程序在事实基础上运用推理规则来实施计算,计算过程由系统自动实现,它基于的理论是谓词演算。上述两种程序设计范式有良好的数学理论支持,易于保证程序的正确性,并且设计出的程序比较精练,具有潜在的并行性。
在上述程序设计范式中,过程式和面向对象程序设计强调对“如何做”的描述,即程序要给出明确的操作步骤(先做什么,再做什么),因此它们常被称为命令式程序设计(imperative programming);而函数式和逻辑式程序设计则强调对“做什么”的描述,在程序中只需要描述要达到的目标而不需要给出具体的操作步骤,因此它们常被称为声明式程序设计(declarative programming)。
目前,使用较广泛的是过程式和面向对象这两种程序设计范式,它们已成为现在主流的程序设计范式,适合于解决大部分的实际应用问题,已被广大的程序设计者所熟悉和采用,因此,本教程重点围绕这两种程序设计范式来介绍程序设计的基本思想、概念和技术。