类型系统
复习
- 名字解析:确定名字指向哪个定义
- 集合与映射:以键索引值的抽象
- 变量与类型:名字代表数据
TL;DR
- 类型描述“这个值能做什么运算”
- 类型系统用规则约束哪些操作合法
- 类型检查能在编译期发现大量错误
- 类型让程序更安全,也给编译器更多信息
正文
“类型”这个词我们用了很多次,现在该正面回答:它到底是什么,又有什么用?
类型:值的集合与允许的操作
一个类型,可以理解成两件事:
- 一组可能的值(整数类型,就是所有整数)
- 这些值允许的运算(整数能加减乘除,字符串能拼接)
所以类型不只是“给数据贴个标签”,它真正规定的是“这样的值,能参与哪些运算”。给一个整数去做“取字符长度”,本身就是没有意义的——类型系统要拦的就是这类错误。
用规则划出合法边界
类型系统(type system)就是一套规则,规定在什么情况下,哪些运算、赋值、调用是合法的。
比如“两个整数可以相加,结果是整数”“整数不能直接和字符串相加”“函数调用时实参类型要匹配形参类型”……这些规则组合起来,就构成了这门语言的类型系统。它像一份“操作手册”,约束程序别做出无意义的动作。
为什么要在编译期检查
类型检查可以在编译期(写代码时)或运行期(程序跑起来后)进行:
- 静态检查(编译期):在程序运行前就把类型错误找出来
- 动态检查(运行期):等真正执行到那一步才发现
静态检查的好处很大:错误暴露得早,改起来便宜。 不用等到上线、不用等某个罕见的输入触发,编译器当场就能指出“这里类型不对”。而且,知道了类型,编译器还能更聪明地生成代码、做优化。
这也是很多语言强调静态类型的理由:多花一点声明成本,换来回更早、更全面的错误检查,以及更好的性能。
思考题 1
类型在程序里,到底描述了什么?
思考题 2
静态类型检查,相比等到运行时才发现错误,有什么好处?
小结
知识点
- 类型描述一组值及其允许的运算
- 类型系统规定哪些操作合法
- 类型检查可分静态(编译期)与动态(运行期)
- 静态检查能更早发现错误,并利于优化
参考资料
- Wikipedia(zh):类型系统:约束程序操作的规则集合
- Wikipedia(zh):数据类型:一组值及可对其进行的操作
思考题答案(仅供参考)
思考题 1
它描述了一组可能的值,以及这些值允许参与的运算。换句话说,类型规定了“这样的数据能做什么、不能做什么”,而不只是给数据贴一个标签。
思考题 2
好处是错误暴露得更早:在程序运行前就能发现类型不匹配,改起来成本低,也不必依赖某个特定输入才触发。同时,类型信息还能帮助编译器生成更高效的代码。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪