下面将从语言的分类、程序结构、数据类型以及语句形式等4个方面讨论高级程序设计语言最基本的、共有的技术特性。
1.高级语言的分类
从语言的范型角度来看,可以把大多数程序设计语言划分为4种类型。
(1)强制式语言(Imperative Language)
高级语言一般特性
强制式语言也称作过程式语言,具有命令驱动、面向语句的特点。一个强制式语言的程序是由一系列的语句组成的,每个语句的执行将引起若干存储单元的值的改变。许多广为应用的高级语言,如Pascal和C等,就属于这种语言。这种语言的语法通常具有如下的形式:
语句1;
语句2;
︙
语句n;
(2)应用式语言(Applicative Language)
应用式语言也称作函数式语言,它更注重程序所表示的功能,而非一个语句接一个语句地执行。这种语言程序的开发过程是从前面已有的函数出发构造出更为复杂的函数,对初始数据集进行操作直至最终的函数可以用于从初始数据计算出最终的结果为止。这种语言的典型代表是LISP,其语法形式通常是:
函数n(…函数2(函数1(数据))…)
(3)基于规则的语言(Rule-based Language)
基于规则的语言也称作逻辑程序设计语言,缘于它的基本执行条件是谓词逻辑表达式。这种语言程序的执行过程一般是:对语句的条件进行检查,若条件成立,则执行相应的动作。在这种语言中,最具有代表性的是Prolog语言,其语法形式通常为:
条件1→动作1
条件2→动作2
︙
条件n→动作n
(4)面向对象语言(Object-Oriented Language)
迄今为止,面向对象语言已成为最流行、最重要的高级程序设计语言,它主要的特征是封装性、继承性和多态性等。这种语言把复杂的数据和用于这些数据的操作封装在一起,构成对象,并对简单对象进行扩充或者继承简单对象的特性,从而设计出复杂的对象。这样做的好处是可以使面向对象程序获得强制式语言的有效性,通过作用于规定数据的函数的构造可以获得应用式语言的灵活性和可靠性。
2.程序结构
就大多数高级语言来讲,其程序结构大致可以分为两种,一种是以若干子程序(过程或者函数等)为主的结构,另一种是以类或程序包等为主的结构。
在以子程序为主的结构中,高级语言最为常见的做法是允许子程序嵌套定义,如Pascal语言。因此,一个程序可以看作是操作系统调用的一个子程序,而子程序中又可以定义别的子程序。
在以类或程序包等为主的结构中,面向对象的高级语言最为典型。以Java语言为例,类(Class)和继承(Inheritance)是其最为重要的两个概念。使用类可以把有关数据及其操作(方法)封装在—起从而构成一个抽象数据类型,一个子类能够继承它父类的所有数据与方法,并且可以加入自己新的定义。除了类和继承的概念之外,Java语言还支持多态性(Polymorphism)和动态绑定(Dynamic Binding)等特性。
3.数据类型
在程序设计语言中,最基本的概念是“数据”。一种语言所提供的数据及其操作方法对这种语言的适用性将产生很大的影响。通常,一个数据类型包括以下3种要素:
(1)用于区别这种类型的数据对象的属性;
(2)这种类型的数据对象可以具有的值;
(3)可以作用于这种类型的数据对象的操作。
程序语言的数据类型可以分为初等数据类型、复杂数据类型和抽象数据类型,常见的初等数据类型有:
(1)数值数据。如整数、实数、复数以及这些类型的双长(或多倍长)精度数等,对它们可进行+、-、*、/等算术运算。
(2)逻辑数据。多数语言有逻辑型或布尔型数据,对它们可进行and、or、not等逻辑运算。
(3)字符数据。有些语言允许有字符型或字符串型的数据,这对于符号处理来说是必需的。
(4)指针类型。这种类型的数据比较特殊,它们的值往往存放的是指向另外一些数据单元的地址。
一般来说,对于程序语言中的数据、函数和过程等对象都得用一个能反映它的本质的有助于记忆的名字来表示和称呼它。名字都是用标识符来表示的,虽然名字和标识符在形式上往往难于区分,但二者是有本质区别的。标识符是—个没有意义的字符序列,而名字却有明确的意义和属性。例如,对于“PI”,有时说它是一个名字,有时又说它是一个标识符。PI作为标识符时,无非是两个字母的并置,但作为名字时,常常被用来代表圆周率。
名字可被看成是代表一个抽象的存储单元,而此单元的内容则被认为是该名字的值。名字不仅有值,还有属性。一个名字的属性包括类型和作用域。类型决定了它能具有什么样的值,值在计算机内的表示方式以及对它能施加什么运算等;作用域则规定了值的存在范围。例如,一个Pascal名字的作用域是那个包含此名字的说明的过程,只有当这个过程运行时此名字才有对应的存储单元。
复杂数据类型通常是在初等数据类型的基础上定义得到的,下面介绍几种常见的定义方式。
(1)数组
从逻辑上说,—个数组是由同一类型的数据所组成的一种矩形结构。沿着矩形每一维的距离称为一个下标,每维的下标只能在该维的上、下限之内变动。数组的每个元素可看成是矩形结构中的一个点,其位置可通过给出该维的下标来确定。(www.xing528.com)
(2)记录
从逻辑上说,记录结构是由已知类型的数据组合起来的一种结构,通常含有若干个分量,每个分量称为记录的一个域(Field)。每个域都是—个确定类型的数据,不同域的数据类型可以不同。
(3)表格、栈和队列
有些语言(如LISP)特别适用于描述表格处理,因此,表格就成为这些语言十分重要的一种数据类型。一个表格实际上是一组记录结构,它的每一栏可以是初等类型的数据,也可以是一个指向别的记录结构的指示器。线性表其实就是一组顺序化的记录结构。
有些语言提供了简单的手段来使程序员可以方便地定义各式各样的栈和队列,然而有些语言(如Pascal)虽没有明显地提供栈型的数据结构,但栈却是它的程序数据空间的基本组织形式。
为了增加程序的可读性和可理解性,提高可维护性,降低软件设计的复杂性,许多程序设计语言提供了抽象数据类型。一个抽象数据类型包括:
(1)数据对象的一个集合;
(2)作用于这些数据对象的抽象运算的集合;
(3)这种类型对象的封装,即:除了使用类型中所定义的运算外,用户不能对这些对象进行其他操作。
在常用的程序设计语言中,C++和Java等语言通过类的形式对抽象数据类型提供支持。
4.语句形式
高级程序设计语言除了提供数据的表示、构造和运算外,还必须提供可执行的语句。下面就对常见的语句形式做一说明。
(1)表达式
一个表达式是由运算量(也称作操作数,即数据引用或函数调用)和运算符组成的。例如,算术表达式“a+b”是由二元(二目)运算符“+”、运算量“a”和“b”(数值数据)组成的,a和b分别称为算符+的左、右运算量(左、右操作数)。
表达式一般采用如下的定义方式:
①变量和常数是表达式;
②若E1和E2为表达式,θ是一个二元算符,则E1θE2是表达式;
③若E是表达式,θ为一元算符,则θE是表达式;
④若E是表达式,则(E)是表达式。
表达式中算符的运算顺序和结合性的约定大多和通常的数学习惯相一致。例如,算数表达式运算过程一般都遵循“先乘除后加减,乘幂更优先”的规定,而对于同级算符,优先规则视具体情况来定,可采用左结合(先左后右)或右结合(先右后左)的运算顺序。
(2)赋值语句
赋值语句的语法结构在不同的高级语言中可能略有不同,但其语义却基本相同。对于如下所示的一个赋值语句:
a:=b
其中,a、b表示变量名。一般来说,每个名字具有两重含义:一方面它代表的是某个存储单元的地址(称为名字的左值),另一方面它又以该单元的内容为值(称为名字的右值)。针对上述赋值语句,其意义是:把b的值送入a所代表的存储单元中。从中可以看到,赋值号“:=”的左、右两边的变量名分别扮演着两种不同的角色,左边的a表示存储单元的地址,右边的b表示值。
(3)控制语句
控制语句的作用是控制程序的执行顺序,不同语言的控制语句形式有所不同。在高级语言中,控制语句的形式即使完全相同,其语义也可能有所不同,因此,必须清楚地了解这些语句在不同语言中的语义。就大多数语言来说,控制语句一般具有如下的形式:
条件语句
循环语句
过程调用语句
call P(X1,X2,…,Xn)
无条件转移语句
goto L
返回语句
return(E)
(4)说明语句
说明语句的作用在于定义名字的性质。通常,编译程序会把这些性质登记在符号表中,并检查程序中对名字的引用和定义说明是否一致。一般情况下,对于说明语句的翻译只是用来操作符号表,并不生成目标代码;但是,对于过程说明和可变数组说明等语句则将生成相应的目标代码。
所谓简单句,指的是不包含其他语句成分的基本句,如赋值句、goto句等;复合句则是指那些内含其他语句的语句,例如:“while A do S”和“begin S1;S2;…;Sn end”是Pascal中常见的复合句形式。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。