编程语言的类型系统为何如此重要?
程序是类型的证明。
计算机程序是建立在计算机硬件和一系列规则、协议、规范、算法基础之上的;
程序是建立在逻辑和严格证明基础之上的;
逻辑学的基本要素是:概念、判断、推理;
类型系统相当于逻辑和科学中的概念,在此基础上才能进行运算和推理;
编程语言不过是建立了类型系统和在类型系统基础上的一些列运算法则而已。
类型+运算法则+运算推演=程序;
作者:匿名用户
链接:https://www.zhihu.com/question/23434097/answer/42374622
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
先匿了,我不确定我说的好不好。
发现和《Types and Programming》说的一模一样,不匿了
安全,有了类型系统以后就可以实现类型安全,这时候程序就变成了一个严格的数学证明过程,编译器可以机械地验证程序某种程度的正确性,从而杜绝很多错误的发生。
正面例子:Haskell、Rust
反面例子:C,动态语言
抽象能力,在安全的前提下,一个强大的类型系统的标准是抽象能力,能将程序中的很多东西纳入安全的类型系统中进行抽象,这在安全性的前提下又不损耗灵活性,甚至性能也能很优化。动态语言的抽象能力可以很强,但安全性和性能就不行了。
泛型、高阶函数(闭包)、类型类、Monad、Lifetime(Rust) 属于这一块。
工程能力,一个强类型的编程语言比动态类型的语言更适合大规模软件的构建,哪怕不存在性能问题,但是同样取决于前两点。
对于编译器来说能清楚程序的意图,对于人来说也是如此 。一个函数或者类似的东西,说白了就是一个映射关系,Python 中这些映射关系都是没有很明显的约束,要靠约定和默契才能维持,对大型软件来说这是不行的。一个优秀的强类型的程序,很多函数都不需要文档,光看函数申明就可以了。而在安全的前提下的抽象,也是不容易引发灾难的。
---
不过,同时类型检查和标注增加了学习成本和编码时间成本(类型推倒不是万能的),编译不过也会挫伤初学者信心,不像动态语言上马就能干,边干边学。不过个人觉得值。
https://www.zhihu.com/question/23434097