有程序设计经验的读者应该对类型并不陌生,类型已经成为高级语言的基本组成元素之一。即便如此,学界关于类型的定义却是存在一定分歧的,笔者在此只能给出一个比较普遍的观点。在大多数程序设计语言中,每一个数据值通常都关联一系列的性质,而这样的一系列性质就是这个值的类型。类型描述的就是基于该类型的数据值所共有的一组性质。例如,integer类型的数据必定在[_231,231]范围内取值,而char类型的数据必定在[0,255]内取值。而程序设计语言中的类型可以分为两类,即基本类型和复杂类型。基本类型指的就是程序设计语言预定义的、不可再分割的类型,如integer、char、real等,有时也称为“原子类型”。而复杂类型通常指的是由程序员基于基本类型复合构造而成的类型,如记录类型、数组类型等,有时也称为“复合类型”或“构造类型”。
通俗地讲,程序设计语言中的类型系统指的就是语言的类型集合及其描述程序行为的规则。从程序设计语言的观点而言,引入类型系统的目的就是便于在语义层次上更精准地描述程序的动作行为。从编译器的观点而言,引入类型系统的主要目的就是尽可能保证程序运行的安全。
在程序设计语言中,不同运算符对于其运算对象的类型是有一定要求的。当然,这个标准并不统一,有些语言可能比较宽松,而有些语言就比较严格。对于不满足要求的表达式,通常应该报告出错或警告信息,否则是不安全的。通常,在这种情况下,很难预测将会发生什么样的情况,甚至可能威胁到操作系统的稳定性。在编译器设计中,严格的类型检查是必不可少的。实际上,所谓类型检查就是基于类型系统进行的一个处理过程,其目的就是保证每个操作或运算都是针对一组数目正确、类型合适的元素进行的,从而保证了目标程序安全、有效地执行。类型检查是编译器的一个重要组成部分。
根据检查的时刻不同,类型检查一般分为两类:静态类型检查、动态类型检查。
静态类型检查指的是由编译器在编译过程中完成的类型检查。(www.daowen.com)
动态类型检查指的是在目标代码中插入相应的类型检查子程序,以便在目标程序运行时进行各种类型检查。
从理论上来说,在不考虑效率及资源的情况下,只要目标代码中存在足够的类型信息,动态类型检查可以实现一切类型检查,而静态类型检查则不然。例如,通用的数组越界检查、子界类型赋值合法性等问题是无法实现静态检查的。不过,程序设计语言的绝大多数类型相关错误都可以由静态检查发现。
最后,笔者需要说明一点:本章仅讨论了类型系统中最基础的部分。事实上,程序设计语言的类型系统是一个非常深奥的话题,包括许多复杂的理论。目前,国内类型系统领域的研究还处于基础阶段,对于有志于研究程序设计语言的读者而言,类型系统理论的重要性不言而喻。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。