公 2.2.1高级语言的分类 从不同的角度看,对高级程序设计语言有不同的分类方法。如果我们从语言范型分 类,当今的大多数程序设计语言可划分为四类。 一,强制式语言 强制式语言(mperative Languge)也称过程式语言。其特点是命令驱动,面向语句。一 个强制式语言程序由一系列的语句组成,每个语句的执行引起若干存储单元中的值的改 变。这种语言的语法形式通常具有如下形式: 语句1; 语句2: 语句n; 许多广为使用的语言,如FORTRAN,C、Pascal,Ada等等,属于这类语言。 二、应用式语言 与强制式语言不同的是,应用式语言(Applicative Langnge)更注重程序所表示的功 能,而不是一个语句接一个语句地执行。程序的开发过程是从前面已有的函数出发构造 出更复杂的函数,对初始数据集进行操作直至最终的函数可以用于从初始数据计算出最 终的结果。这种语言通常的语法形式是 函数n(.函数2(函数1(数据)).) 因此,这种语言也称函数式语言。SP和ML属于这种语言。 三、基于规则的语言 基于规别的语言(Bule-based Language)程序的执行过程是:检查一定的条件,当它满 足值,则执行适当的动作。最有代表性的基于规则语言是Pmg,它也称逻辑程序设计语 言,因为它的基本允许条件是谓词逻辑表达式。这类语言的语法形式通常为: 条件1→动作1 条件2→动作2 条件→动作3 四、面向对象语言 面向对语言(Object -0 rienang)如今已成为最流行、,最重要的语言。它主要 的特征是支持封装性、继承性和多态性等。把复杂的数据和用于这些数据的操作封装在 一起,构成对象;对简单对象进行扩充缕承简单对象的特性,从而设计出复杂的对象。通 过对象的构造可以使面向对象程序获得强制式语言的有效性,通过作用于规定数据的函 数的构造可以获得应用式语言的灵活性和可靠性。 2.2.2程序结构 一个高级语言程序通常由若干子程序段(过程、函数等)构造,许多语盲还引人了类、 程序包等更高级的结构。下面我们从FORTRAN,Pascal、Ada,Java为例,说明程序结构
16 -、FORTRAN 一个FORTRAN程序由一个主程序段和若千个(可以是0个)辅程序段组成。 PROGRAM MAIN END SUBROUTINE SUBI END SUBROUTINE SUBr END 辅程序段可以是子程序、函数段或数据块。每个程序段由一系列说明句和执行句组 成。各段可以独立编译,这对于模块设计甚为方便。 一个FORTRAN程序的各个程序段所定义(说明)的各种名字通常是彼此独立的。同 个标识符在不同的程序段中一般都是代表不同的名字,也就是说,代表不同的存储单 元,各程序段对它们的引用或赋值是彼此无关的。但是,不同程序段里的同名公用块 (Common Block)却代表同-一个存储区域(称为公用区,Common Area)。因此,出现在CM. MON语句中的名字所代表的单元在其它程序段中也可以引用(通过该段中定义在同一个 COMMON块里的相应单元的名字)。所以说,公用区具有全局性。不出现在COMMON中 的名字所代表的单元具有局部性。 、sca Pas©l是一个允许子程序怅套定义的语言。一个Pacl程序可以看作是操作系统调 用的一个子程序,而子程序中又可以定义别的千程序。 program main procedure P11; begin end; begin end; procedure P2; begin
end Pscl这种嵌套结构中允许同-一标识符在不同的子程序中表示不同的名字。关于名 字的作用域的规定是: ()一个在子程序B1中说明的名字X只在B1中有效(局部于B1)。 (2)如果2是B1的一个内层子程序且2中对标识符X没有新的说明,则原来的名 字X在B2中仍然有效。如果2对X重新作了说明,那么,B2中对X的任何引用都是指 重新说明过的这个X。 换言之,标识符X的任一出现(除出现在说明句的名表中外)都意味着引用某一说明 句所说明的那个X,此说明句同所出现的X共处在一个最小子程序中。这个原则称为“最 近按套原则”。 三、Adh 在Ada中引入了程序包(Packag),它可以把数据和操作代码封装在一起,支持数据抽 象。一个程序包分为两部分: ()可见的规范说明部分,它定义了程序包外面可以访问的对象。 (2)程序包体,它实际定义程序包的实现细节。 package STACKS is type ELEM is privale; type STACK is limited private; procedure push (S:in out STACK:E:in ELEM) procedure pop (S:in ou STACK;E:out ELEM): end STACk package body STACK is procedure push(S:in out STACK;E:in ELEM); hegin .实现细节 end push; procedure pop (S:in out STACK;E:ou EIEM) begin .实现细节 end; 在Ada程序包规范说明中,如果一个类型被定义为私有(Pive)类型,则它既不允许 用户在该程序包外访问此类型,又对用户隐蔽此类型数据结构的具体细节。如果一个类 型被定义为受限私有(Limited Private)类型,则对该类型对象的操作仅限于相应程序包规
18 范说明部分说明的那些,连一般私有类型所允许的预定义赋值和测试相等的操作也不允 许,以严格限制对该类型对象的访问。 四.ag Jva是-一种面向对象的高级语言,它很重要的方面是类(Cias)及继承(Inheriunce)的 概念,同时支持多态性(Polymorphism)和动态绑定(Dynamic binding)等特性。 class Car int color.number; int door number; intspd push_break Add_oil ( class TrashCar extends car double amount: 1 一个类把有关数据及其操作(方法)封装在一起构成一个抽象数据类型。一个子类继 承其父类的所有数据与方法,并且可以加人自己新的定义。 在ava中,变量和方法的定义之前可以加人public、prtected、等饰字,以限制 其它类的对象对于这些变量数据的存取以及类中方法的使用。如果一个类定义中的变量 或方法前面加上pu山c,那么就表示只要其它类、对象等可以看到这个类的话,它们就可 以存取这个变量的数据,或者使用这个方法;如果 -个类的变量或方法前面加上protect ,那么只有这个类的子孙类可以直接存取这个变量数据或调用这个方法;如果在变量或 方法恤面加上e.那么任何其它的类都不能直接房引用放个数据.或调用这个方法。 2.2.3数据类型与操作 对大多数程序设十语言而言,“数据”这个概念是最基本的。强制式程序设计语言使 用一系列的语句修改存储在计算机存储器中的数据值。在这里,变量的概念可以认为是 计算机存储地址的抽象。程序设计语言所提供的数据及其操作设施对语言的适用性有很 大影响。个数据类型通常包括以下三种要素: (1)用于区别这种类型的数据对象的属性;
19 (2)这种类型的数据对象可以具有的值 (3)可以作用于这种类型的数据对象的操作。 一、初等数据类型 一个程序语言必须提供一定的初等类型数据成分,并定义对于这些数据成分的运算 有些语言还提供了由初等数据构造复杂数据的手段。不同的语言含有不同的初等数据成 分。常见的初等数据类型有: (1)数值数据如整数、实数、复数以及这些类型的双长(或多倍长)精度数。对它们 可施行算术运算(+,一,/等)。 (2)逻辑数据多数语言有逻辑型(布尔型)数据,有些甚至有位串型数据。对它们 可施行逻辑运算(amd,or,not等) (3)宇符数据有些语言容许有字符型理或字符串型的数据,这对于符号处理是必须 的。 (4)指针类型指针是这样一种类型的数据,它们的值指向另 一些数据。尽管语法 上可能不尽相同,但一般的意义是,假定P是一个指针,P:=ad灿(X)意味着P将指向X, 或者说,P的值将是变量X的地址。有些语言中用P个表示指针P的内容。在P:=灿 (X)的情况下,如令P个:=0.3,则意味着X的值为0.3。 程序语言所涉及的对象不外是数据、函数和过程等等。对于每个这种对象,程序员通 常都用一个能反映它的本质的、有助于记忆的名字来表示和称呼它。例如,常常可以看到 人们用WEIGHT来表示 一个代表重量的实型数据,用NNERPRODUCT表示 个求内积的 过程。在程序语言中各种名字都是用标识符表示的。所谓标识符系指由字母或数字组成 的以字母为开头的 一个字符电】 虽然名字和标识符在形式上往往难于区分,但这两个概念是有本质区别的。例如,对 于‘P',我们有时说它是一个名字,有时又说它是一个标识符。标识符是一个没有意义的 字符序列,但名字却有明确的意义和属性。作为标识符的,无非是两个字母的并置,但 作为名字的,常常被用来代表圆周率。在高级语言中常用“局部名”、“全局名”之称,但 少有“局部标识符”、“全局标识符”之分。 用计算机术语来说,每个名字可看成是代表 一个抽象的存储单元,个单元可含 一字节、一字或相继的许多个字。而这个单元的内容则认为是此名字(在某 一时刻)的 值。名字的值就是它所表示的一个具体对象。仅把名字看成代表一定的存储单元还是不 够的,我们还必须同时指出它的属性。如果不指出名字的属性,它的值就无法理解。例 如,设一 个名字代表一个32位的存储单元,如果不指明属性,那么我们就不知道此单元的 内容代表什么,不知道是代表一个整数、一个实数还是一个布尔值。名字的属性通常是由 说明语句给出的 有些名字似乎没有通常意义的值,例如过程名就是如此。但我们可以设想过程名具 有某种代表输人-输出关系的“值”。 注意,在许多程序语言中,同一标识符在过程中的不同地点(如不同分程序)可用来代 表不同的名字。在程序运行时,同一个名字在不同的时间也可能代表不同的存储单元(在 递归的情形下)。反之,同一个存储单元也可能有好几个不同的名字(如FORTRAN中出 现在EQUTVALENCE和COMMON语句里的名字)