值与类型
数据是计算机加工的对象,无论是什么计算机程序不外乎希望经过计算得到我们需要的数据值或者计算机的一组动作(一般都包括数据值的改变)。值是对事物性态的表征或度量。没有值就没有计算。
下面我们讨论程序世界中的值和类型。
1 .值
1.1 值
值是对事物性态的表征和度量,而表征和度量总是在某个论域的某个抽象层次上,讨论问题的抽象层次不同取值也不同。
例如,与一个人的"年岁"相关的值:
医疗档案中的取值:{成人,儿童,婴儿}
接班人会议记录中:{老年,中年,青年}
户口登记簿:{1..100}
所以说值总是存在于约定的表述之中。
1.2 值与类型
程序世界的值一方面根据映射客观事物的需要,一方面根据计算机实现的可能有不同的类别。分类的准则是表示结构的一致,同样的语义内涵,以及容许有同样的运算,这就是类型。每一个值都属于一个类型。一般来说,同类型的值相互运算结果仍为该类型的值。
计算机中最基本的类型有:整形,实型,字符型,布尔型,枚举型,元素,数组,记录/结构型,表,串等。
计算机中值分类包括:指针值,变量饮用(左值,右值),函数或过程抽象。
1.3 其他维度的分类
值除了类型分类外,另一维分类是字面量、常量和变量。
字面量也称为直接量,约定它的表示就是它的值,且从它的值就可以得出它的类型。如"123"、"cobing"等。
变量是代表任何值的标识符。一旦声明该标识符是什么类型,它在程序中只可取得该类型的某个值。变量只是一个数据的名字,它的值随时可变,所以有初始值、当前值、赋值等概念。它所遵循的运算规则与所在类型的值相同。
常量也可以是标识符。一旦某标识符声明为某类型的常量,则必须给它赋初值,且在程序总不得改变,它就成了某个值的代名词。如C和C++中的 const int num = 310。
字面值也是常量,但是不能再给它取名。
程序变量在程序中出现可以:
① 没有值(声明后没有赋初值);
② 可以有右值,即变量名出现在命令式语言赋值号的右边,此时是对它存储内容的引用,常规的值;③ 也可以有左值,即变量名出现在赋值号的左边,此时是对它存储单元地址或者对对象的首地址的引用。所以,变量不是具体的值,变量引用才是值。如下面的代码:y = x ++ ;先用x的右值赋值,再为x的左值增值。1.4 程序世界中的求值方式程序世界中的求值方式是利用表达式和函数引用。表达式本质上是嵌套符合的函数引用。一个运算符就是一个函数。
2 头等程序对象
在程序语言学中把相当于数学对象的程序对象叫做头等程序对象,因为它们作为运算对象的权利未收到任何限制。
程序对象的权限具体来说有以下几种:
① 可作为操作数出现在表达式中求值;
② 可作为单独的存储实体;
③ 可作为参数传递到过程或函数;
④ 可作为函数的返回值;
⑤ 可构成复杂的数据结构。
类型完整性规则要求所有涉及值的对象都是头等对象。但是事实上不是所有程序设计语言均具有以上权利。
3 类型
类型是值的集合,以及在这个集合上容许的操作集合。
一个程序设计语言必须为用户提供完整的类型系统,类型系统包括以下三方面:
① 一组直接可用的类型,以及一组用户自定义类型的机制;
② 一组类型规则,知名类型的性态以及相互关系。
③ 一种类型检查机制,保证类型定义和类型规则成立。
3.1 类型
基本类型
复合类型
递归类型:表、串、用户自定义的递归类型等
3.2 类型系统初步
3.2.1 静态类型和动态类型
尽管在操作之前类型检查必须进行,但是在类型检查的时间上还是有相当大的自由度,可以在编译时刻进行也可以在运行时刻进行。这可以把程序设计语言分为静态类型语言和动态类型语言。
静态类型语言是在编译时进行类型检查;变量和参数都有程序员指定的类型;它语义清晰但是比较死板。
动态类型语言是在运行时进行类型检查;变量和参数一般不指定类型,不同的时刻可以取不同的值;动态类型语言简洁灵活。
3.2.2 弱类型和强类型
按照对类型约束的不同可以将程序设计语言分为以下五种:
无类型语言:只有值有类型,变量无类型,变量的类型在程序执行期间用到什么值就是什么类型,它只能是动态类型系统。
弱类型语言:变量有类型,但是只要数据格式相同,类型即可兼容。
强制类型语言:变量有类型,并做类型检查,但是类型兼容灵活。如C中可以将double类型的值赋给int类型的变量,赋值过程中自动截尾。
伪强类型语言:也叫静态强类型,它的类型检查都是放在编译时,但是由于类型定义不严密,容易导致类型的等价准则等错误。
强类型语言:它的特点一是类型多,只要客观世界的值有区分,就可以定义出某种类型,而且不允许类型之间转换;二是检查严,每个运算对象都要做类型检查。
3.2.3 类型等价
类型等价有两种:
一是结构等价。它可以定义为:类型T = T' 当且仅当T和T'可存储相同的值的集合。
如typedef man { string name; int age;}cobing;
Typedef dog{string name; int age;}beibei;
他们结构相同,若按结构等价,则可以有: cobing.age = beibei.age。
结构等价按强类型是不可以的,编译时会检查出错误。
二是按名等价。它可以定义为:程序对象O1,O2。若O1 type = O2 type当且仅当两类型有相同的名字。
如type A is array of int;
type B is array of int;
A O1,O2;
B O3,O4;
则O1与O2等价,O3与O4等价,但是O1与O2不等价。
3.2.4 类型完整性规则
类型的完整性规则要求有共性的操作不能对不同类型的值有所区别。
本节我们简要介绍了程序世界中的主--值,以及值及操作所组成的集合--类型。下一节我们将介绍程序中的值在机器中的实现--存储。