Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

类型系统

复习

  • 名字解析:确定名字指向哪个定义
  • 集合与映射:以键索引值的抽象
  • 变量与类型:名字代表数据

TL;DR

  • 类型描述“这个值能做什么运算”
  • 类型系统用规则约束哪些操作合法
  • 类型检查能在编译期发现大量错误
  • 类型让程序更安全,也给编译器更多信息

正文

  “类型”这个词我们用了很多次,现在该正面回答:它到底是什么,又有什么用?

类型:值的集合与允许的操作

  一个类型,可以理解成两件事:

  • 一组可能的值(整数类型,就是所有整数)
  • 这些值允许的运算(整数能加减乘除,字符串能拼接)

  所以类型不只是“给数据贴个标签”,它真正规定的是“这样的值,能参与哪些运算”。给一个整数去做“取字符长度”,本身就是没有意义的——类型系统要拦的就是这类错误。

用规则划出合法边界

  类型系统(type system)就是一套规则,规定在什么情况下,哪些运算、赋值、调用是合法的。

  比如“两个整数可以相加,结果是整数”“整数不能直接和字符串相加”“函数调用时实参类型要匹配形参类型”……这些规则组合起来,就构成了这门语言的类型系统。它像一份“操作手册”,约束程序别做出无意义的动作。

为什么要在编译期检查

  类型检查可以在编译期(写代码时)或运行期(程序跑起来后)进行:

  • 静态检查(编译期):在程序运行前就把类型错误找出来
  • 动态检查(运行期):等真正执行到那一步才发现

  静态检查的好处很大:错误暴露得早,改起来便宜。 不用等到上线、不用等某个罕见的输入触发,编译器当场就能指出“这里类型不对”。而且,知道了类型,编译器还能更聪明地生成代码、做优化。

  这也是很多语言强调静态类型的理由:多花一点声明成本,换来回更早、更全面的错误检查,以及更好的性能。

思考题 1

  类型在程序里,到底描述了什么?

思考题 2

  静态类型检查,相比等到运行时才发现错误,有什么好处?

小结

知识点

  • 类型描述一组值及其允许的运算
  • 类型系统规定哪些操作合法
  • 类型检查可分静态(编译期)与动态(运行期)
  • 静态检查能更早发现错误,并利于优化

参考资料

  1. Wikipedia(zh):类型系统:约束程序操作的规则集合
  2. Wikipedia(zh):数据类型:一组值及可对其进行的操作

思考题答案(仅供参考)

思考题 1

  它描述了一组可能的值,以及这些值允许参与的运算。换句话说,类型规定了“这样的数据能做什么、不能做什么”,而不只是给数据贴一个标签。

思考题 2

  好处是错误暴露得更早:在程序运行前就能发现类型不匹配,改起来成本低,也不必依赖某个特定输入才触发。同时,类型信息还能帮助编译器生成更高效的代码。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪