- 编程与类型系统
- (美)弗拉德·里斯库迪亚
- 788字
- 2025-03-31 19:45:05
1.2.1 正确性
正确的代码指的是行为符合规范,能够产生期望的结果,并且不会导致运行时错误或崩溃的代码。类型帮助我们更加严格地限制代码,以确保代码具有正确的行为。
例如,假设我们想要找出字符串"Script"在另外一个字符串中的索引。如果没有提供足够的类型信息,我们可能允许传入任意类型的值作为函数实参。如果实参不是一个字符串,就会发生运行时错误,如程序清单1.2所示。
程序清单1.2 类型信息不足

这个程序不正确,因为42不是scriptAt函数的有效实参。但是,由于我们没有提供足够的类型信息,因此编译器不会拒绝该行代码。在程序清单1.3中,我们将修改代码,把实参限制为一个string类型的值。
程序清单1.3 明确类型信息

现在,编译器将拒绝编译错误的程序,并给出下面的错误消息:

通过利用类型系统,我们把可能在生产中出现,从而影响客户的一个运行时错误转换成一个无害的编译时错误。只有修复了这个错误,才能部署代码。类型检查器确保我们不会传递错误类型的值,因此代码变得更加健壮。
当程序进入坏状态时,就会发生错误。坏状态是指无论何种原因,程序当前的所有活跃变量的组合变得无效。消除坏状态的一种方法是限制变量能够取到的值的数量,从而减小状态空间,如图1.4所示。

图1.4 正确声明类型时,我们能够禁止无效的值。第一个类型太松散,允许我们不想使用的值。第二个类型的限制更严格,如果代码试图赋值给变量一个不想要使用的值,就无法通过编译
我们可将运行中程序的状态空间定义为其全部活跃变量的所有可能值的组合,即每个变量的类型的笛卡儿积。记住,类型可被视为一个变量可取的值的集合。两个集合的笛卡儿积是由这两个集合的所有有序对构成的一个集合。
安全性
禁止潜在坏状态有一个重要的衍生作用:让代码变得更加安全。许多攻击依赖于执行用户提供的数据、缓冲区溢出和其他类似技术,而通过足够强健的类型系统和合理的类型定义可以减轻这个问题。
代码正确性不只是消除代码中的轻微bug,也包括阻止恶意攻击。