大多数程序设计语言都有数据类型的概念,数据类型指定义一组数据值以及在这些数据值上相关的一组操作。
我们知道计算机通过操作数据来产生结果,决定计算机程序执行认为难易程度的一个重要原因是可提供的数据类型与真实世界问题空间的匹配程度。因此,一种语言能支持多样化的类型与结构就成为关键。
数据类型的概念是从过去50年间发展过来的
最早的语言仅支持少量的数据结构,如Fortran 90之前通常用数组来模拟链表及二叉树。
COBOL允许程序员指定小数的精度,并通过记录提供一种结构化的数据类型,跨出了Fortran I模式的第一步。
PL/I更是将精度说明的功能扩展到整数及浮点类型,该功能从此也被引进到了Ada和Fortran。
ALGOL则开创式的引入了用户自定义类型的概念,它仅提供少数的基本类型以及少量灵活的结构定义操作符,却允许程序员为需求设计一种数据结构。显然,这是数据类型发展过程中最重要的进步。
1967年首次提出“类型”概念的Simula 67,把数据和被允许施与数据上的操作结合为一个统一体,从而成为现代“抽象数据类型”的开端及第一个“面向对象语言”。
1971年出现的Pascal也是在ALGOL之上扩充的。
从“用户自定义类型”这个概念往前一步,就到了“抽象数据类型”的阶段,抽象数据类型的基本思想是,类型的接口(对用户可见)与类型的表示及类型的值的操作相分离(对用户不可见)。高级程序设计语言提供的所有类型都是抽象数据类型。
少数语言如BLISS根本没有类型的概念,其它则是在编译时(ML、Haskel,C)或是运行时(Lisp、Scheme、JavaScript、Smalltalk等动态语言)自动维护类型信息。
类型起着两种主要作用
1. 利用类型信息的操作
为操作提供了隐含的上下文环境,如Java中如果a, b都是int类型,表达式a+b就会使用整数相加操作。
2. 通过类型信息捕捉错误
类型限制了语义上合法的程序里可以执行的操作集合。如类型不允许编程人员去做一个和字符串进行算术相加的操作。
类型的分类
不同的语言里有关类型的术语也不同,大部分语言所提供的内部类型(built-in)差不多就是大部分处理器硬件所支持的类型:整数、实数(浮点数)、布尔和字符。
布尔类型(也称逻辑类型)通常实现为一种一个字节的量,其中1表示true,0表示false。但C语言不同,它没有布尔类型,C的整数0表示false,非0都是true。
部分语言字符也实现为一个字节的量,通常采用ASCII编码,更新的语言则采用Unicode,如Java、JavaScript,这是国际化的标准。
只有为数不多的几种语言(C、Fortran)区别了不同长度的整数和实数,大多数语言把精度的问题留给了实现。也有少数语言(C、C++、C#、Modula-2)同事提供带符号和无符号的整数。还有几种语言(Fortran、C99、Common Lisp和Scheme)提供了内部的复数类型,一般实现为浮点数。
某些语言(Pascal、Java)还内置枚举类型,该类型由1984年图灵奖获得者Wirth首创,诞生于Pascal。这种类型有利于构造可读性更好的程序,也使编译器能扑捉一些种类的编程错误。
一个枚举类型由一组命名元素组成,Pascal中如下
type weekday = {sun, mon, tue, wed, thu, fri, sat};
Java中如下
public enum ColorSelect { red, green, yellow, blue; }
相关:
http://en.wikipedia.org/wiki/Data_types
http://en.wikipedia.org/wiki/Primitive_types