CH 6 Type Safety[类型安全]
大多数语言都是安全的(或者说是类型安全/强类型的)。非形式化地说,这意味着某些mismatch在执行时不会出现。例如,对E来说,类型安全是指将不会出现一个数字与一个字符串想加,或者两个数字做连接,这两种情况都没有意义。
通常来说,类型安全表达了statics和dynamics的内在一致性。Statics可以理解为预测一个表达式的值将具有特定形式,以至于dynamics是良定义的。因此,求值不会陷入“stuck”的状态,对应到实现部分即在执行时不会出现非法指令的错误。safety可以,通过证明transition的每一步都维持typability以及typable states是良定义的,进行证明。
对于E来说,它的类型安全可以被精确地如下表示:
第一部分,称为“preservation”,求值的每一步维持typing;第二部分,称为“progress”,确保well-typed的表达式要么是值,要么能进一步求值。safety是这两个性质一同维护的。
我们说表达式e
是stuck的,当且仅当 它不是一个值,但不能进一步求值。
6.1 Preservation
我们需要注意这一性质一般是对transition[dynamics]部分进行归纳
6.2 Progress
对statics进行归纳
6.3 Run-time Errors
即使这个表达式是well-typed,但是仍会stuck!
有两种选择来解决这个问题:
- 加强类型系统,以至于不会出现这种➗0的程序
- 添加动态检查,以至于除0会发出错误作为求值的结果。
两种选择原则上都可行,但最常用的方法是第二种。第一种方法要求type checker证明表达式是非0的,我们不能静态地预测一个表达式在求值后是否是非零的,所以第二种方法更常用。
整体的思想是区分checked以及unchecked错误。unchecked错误是指由类型系统排除的错误。并不会在运行时检查来确保这种错误不会出现,因为这种错误的可能性已经被类型系统排除。
一种建模checked errors的方法是给judgement e err一个归纳定义,表示表达式e可能会引起运行时错误。
我们可以引入error作为表达式,下面为对应的static and dynamic semantics: