类型系统的目标
概述
程序设计语言的设计者引入类型的目的是,与上下文无关文法相比,利用类型系统可以在更精确的层次上规定程序的行为
类型系统建立了另一种词汇表来描述有效程序的形式和行为
确保运行时的安全性
设置完善的类型系统有助于编译器检测运行时错误
编译器首先必须为每个表达式推断出类型。这些推断出的类型可以揭示未能正确解释某个值的场合,如利用浮点数代替布尔值的情形。
其次,编译器必须依照语言定义的规则,来检查每个运算符的操作类型
有时候,这些规则可能要求编译器将值从一种表示转换为另一种。在其他情况下,规则可能禁止这样的转换,只是声称程序是病态,因而不可执行
类型推断
为代码中每个名字和每个表达式确定一种类型的过程
给定表达式a + b,以及a和b的类型,该表规定。对于整数a和双精度浮点数b,a + b生成一个双精度浮点值结果
反之,如果a是复数,a + b就是非法
隐式转换
许多语言规定了规则,允许运算符使用不同类型的值,并要求编译器按需插入类型转换操作
语言类型
安全性是使用强类型语言的一个重要原因。如果语言的实现能够保证在程序执行之前捕获大多数类型相关的错误,这将简化程序本身的设计和实现
如果一种语言中每个表达式都能够分配一个无歧义的类型,这种语言称为强类型语言
如果每个表达式都可以在编译时确定类型,我们称为静态类型(statically typed)
如果某些表达式只能在运行时确定类型,称这种语言为动态类型(dynamically typed)
无类型语言,如汇编代码或BCPL语言
弱类型语言,即类型系统较为贫乏的语言
提高表达力
与上下文无关规则相比,具有良好结果的类型系统允许语言设计者更加精确地规定程序的行为。这种能力使得语言设计者可以加入一些上下文无关语法不可能表示的特性
一个出色的例子就是运算符号重载(operator overloading), 即赋予运算符上下文相关的语义
运算符重载
如果运算符的语义是根据其参数类型定的,那么该运算符是被“重载”的
生成更好的代码
设计完善的类型系统为编译器提供了程序中每个表达式的详细信息,通常利用这一信息进行转换,可以生成更高效的代码
如果在某种语言中,类型在编译时不能完全确定,一部分检查可以推迟至运行时进行
编译时检查的一个目标是,在不增加运行时代价的情况下提供相应的安全性
运行时的类型检查向简单的算术运算和其他操控数据的操作强加了很大的开销。将单个加法操作或数据转换和加法操作替换为嵌套if-then-else代码,对性能有严重的影响
类型检查
为避免运行时类型检查的开销,编译器必须分析程序,为每个名字和表达式分配一种类型。它必须检查这些类型,以确保类型在相应上下文中的使用是合法的
浙公网安备 33010602011771号