2.1 引言
读者大都学习过程序设计。所谓程序,实质上就是在数据的某些特定的表示方式和结构的基础上对抽象算法的具体描述。Pascal语言的发明者,瑞士计算机科学家沃斯(Niklaus Wirth)于1976年发表的《算法+数据结构=程序》一书,精辟地以书名来刻画程序,程序设计语言必须以描述算法和数据结构作为它自身的主要结构。纵观现有的高级程序设计语言,通常都以数据类型来描述数据结构,以控制结构来描述算法。设计一个高级程序设计语言,主要工作就是设计数据类型结构和控制结构。本章将讨论语言的数据类型,第3章将讨论语言的控制结构。
在传统的高级语言中,通常都有数据类型的概念。数据类型实质上是对存储器中所存储的数据的抽象。在机器语言中,存储器的一个存储单元的内容是一个二进制位串(序列)。这些位串实际可能是一条机器指令、一个地址、一个整数、一个实数或一个字符(串),它们在存储器中的意义直接受程序员的控制,程序员可用移位、逻辑运算和算术运算等操作对它们进行处理。在机器语言中,数据具有最原始的形式,没有任何的抽象。
早期的汇编语言的抽象只有符号名,程序员使用助记符命名操作码,也可用符号命名存储位置(单元)。即使这样简单的抽象,也使程序员受益匪浅,至少可以从机器的具体特征,特别是表示存储地址和操作的二进制位串中解脱出来,同时也提高了程序的可写性、可读性和可修改性(Modifiability)。
早期的高级语言FORTRAN,COBOL和ALGOL 60在引入数据抽象方面迈出了第一步。在这些语言中,存放在存储器中的数据不再被看成原始的无名位串,而是看成一个整数值、一个实数值、一个布尔值或其他值,即具有一定的数据类型。每种数据类型定义一组值的集合,以及对这组值进行的操作(运算)的集合。
数据类型的引入实现了数据抽象,这是一个重要的起点。在这些语言中,程序员不再为存储单元中的二进制位串的某一位是什么意义而操心,程序员也可以不了解机器的细节,这样就扩大了用户,提高了编制程序的效率,消除了程序中许多人为的错误。
语言的某种特定的数据抽象受到两个因素的影响:一是语言所面向的机器(只提供定点运算或同时提供浮点运算);二是语言所面向的应用领域,例如,FORTRAN不适合串处理的问题,COBOL不适合解微分方程的计算,两者都对需要高度动态数据结构的矩阵运算不合适。语言根据所面向的机器和应用定义了不同的数据类型,这些类型称为内部类型(Built-in Type)。自Pascal语言开始,语言提供了由用户定义类型的方法。采用这类方法由用户自己定义的数据类型称为用户定义类型(User-defined Type),或简称自定义类型。