编程语言的类型系统为何如此重要?

程序是类型的证明。

计算机程序是建立在计算机硬件和一系列规则、协议、规范、算法基础之上的;

程序是建立在逻辑和严格证明基础之上的;

逻辑学的基本要素是:概念、判断、推理;

类型系统相当于逻辑和科学中的概念,在此基础上才能进行运算和推理;

编程语言不过是建立了类型系统和在类型系统基础上的一些列运算法则而已。

类型+运算法则+运算推演=程序;

作者:匿名用户

链接:https://www.zhihu.com/question/23434097/answer/42374622

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

先匿了,我不确定我说的好不好。
发现和《Types and Programming》说的一模一样,不匿了
安全,有了类型系统以后就可以实现类型安全,这时候程序就变成了一个严格的数学证明过程,编译器可以机械地验证程序某种程度的正确性,从而杜绝很多错误的发生。
正面例子:Haskell、Rust
反面例子:C,动态语言

抽象能力,在安全的前提下,一个强大的类型系统的标准是抽象能力,能将程序中的很多东西纳入安全的类型系统中进行抽象,这在安全性的前提下又不损耗灵活性,甚至性能也能很优化。动态语言的抽象能力可以很强,但安全性和性能就不行了。
泛型、高阶函数(闭包)、类型类、Monad、Lifetime(Rust) 属于这一块。

工程能力,一个强类型的编程语言比动态类型的语言更适合大规模软件的构建,哪怕不存在性能问题,但是同样取决于前两点。
对于编译器来说能清楚程序的意图,对于人来说也是如此 。一个函数或者类似的东西,说白了就是一个映射关系,Python 中这些映射关系都是没有很明显的约束,要靠约定和默契才能维持,对大型软件来说这是不行的。一个优秀的强类型的程序,很多函数都不需要文档,光看函数申明就可以了。而在安全的前提下的抽象,也是不容易引发灾难的。

---

不过,同时类型检查和标注增加了学习成本和编码时间成本(类型推倒不是万能的),编译不过也会挫伤初学者信心,不像动态语言上马就能干,边干边学。不过个人觉得值。

https://www.zhihu.com/question/23434097

原文地址:https://www.cnblogs.com/feng9exe/p/10740346.html

时间: 2024-10-19 09:51:18

编程语言的类型系统为何如此重要?的相关文章

编程语言的类型系统

每学一门新的编程语言时,在看到介绍该门编程语言的特点时,经常会遇到 静态.动态.强.弱 .隐式.显式 类型等字样,似懂非懂,这里结合网上的资料总结一下它们的含义以及区别,描述不一定专业.准确,但求能进一步理解这些词的概念即可. 类型系统(Type System)用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,如何操作这些类型,这些类型如何互相作用.根据这些种种不同,可以将编程语言分为以下类别: 静态类型编程语言 vs 动态类型编程语言 在静态类型语言,每个变量名字都绑定到: 一个类型

【2018.08.19 C与C++基础】编程语言类型系统简介(草稿)

还是先占坑,等理顺了思路再写,学过的东西总是无法系统化,感觉什么都知道一点,但一深入却是一脸懵逼. 这真的是个问题,看似很努力,却无法成为一个master. 参考链接: 1. 编程语言的类型系统为何如此重要? https://www.zhihu.com/question/23434097 2. 程序语言中的类型系统怎么理解,它有哪些要素?如何由它演化出一门编程语言的? https://www.zhihu.com/question/22416404 3. 关于类型系统和类型推导的一些科普 http

《语义网基础教程》学习笔记(二)

二.RDF概述(参考http://zh.transwiki.org/cn/rdfprimer.htm) 1.本体: 一个本体是一个概念体系(conceptualization)的显式的形式化规范. 一般来说,一个本体形式地刻画一个论域.一个典型的本体由有限个术语及它们之间的关系组成. ★在万维网这个环境中,本体提供了对给定领域的一种共识.这种共识对于消除术语差别是必要的. 通过把各自的术语差异映射到一个公共的本体之间的直接映射,可以消除这些术语差异. 不管采用哪种方案,本体都支持语义可共用性(s

PHP内核探索:变量存储与类型

先回答前面一节的那个问题吧. 01 <?php 02 $foo = 10; 03 $bar = 20; 04    05 function change() { 06     global $foo; 07     //echo '函数内部$foo = '.$foo.'<br />'; 08     //如果不把$bar定义为global变量,函数体内是不能访问$bar的 09     $bar = 0; 10     $foo++; 11 } 12    13 change(); 14

Java注解编程指南

Java注解编程指南 Java Annotation Tutorial +1概念 注解是JDK1.5开始引入的一个Java语言新特性.注解是与接口很相似,它与类.接口.枚举是在同一个层次,它 们都称作为java 的一个类型(TYPE). +1.1Java语言指南解释 注解(也被称做元数据),为我们提供了程序代码的描述信息,而这些描述信息并不属于程序本身.注解并不直接 影响其注释的代码的工作. +1.2Java编程思想解释 注解(也被称做元数据),为我们在代码中添加信息提供了一种形式化的方法,使我

Platform SDK、Windows SDK简介

Platform SDK及Windows SDK是由微软公司出品的一个软件开发包,向在微软的Windows操作系统和.NET框架上开发软件和网站的程序员提供头文件.库文件.示例代码.开发文档和开发工具. 微软每次发布一个主要版本的Windows,都会发布对应的开发工具以使得开发人员能够调用新的操作系统的应用程序开发接口(API). 在Windows 98之后,这个开发工具包被命名为为Platform SDK.在Windows Vista的SDK推出时,这个产品改名为Windows SDK. Pl

关于编程语言类型系统

动态 变量类型在运行期间确定下来 静态  在编译期确定下来 强类型  类型不会发生自动变换, 弱类型 类型会自动变,比如double+int -> double 类型安全 类型对数据访问有严格控制 类型不安全 ... Well-typed programs cannot "go wrong" ------------------Robin Milner

javascript中15种原生对象类型系统综述

前面的话 在编程语言中,能够表示并操作的值的类型称做数据类型,编程语言最基本的特性就是能够支持多种数据类型.javascript拥有强大的类型系统,主要包括原生对象.宿主对象和浏览器拓展对象,本文主要介绍15种原生对象类型系统 原生对象(15种) 原生对象分为两类:原始类型(primitive type)和对象类型(object type).原始类型又分为两类,一类是空值,一类是包装对象:对象类型也可以分为两类:一类是构造器对象,一类是单体内置对象 空值(2种) 与其他语言不同,javascri

Facebook为什么使用PHP编程语言?

当日本计算机科学家松本行弘决定创造一种名叫 Ruby (这种技术支撑了 Twitter.Hulu以及其他许多现代 Web 流行网站) 的程序语言时,他是从 1966 年一部名为 Babel-17 的科幻电影中获得了灵感.这本书主要讲的是一种新发明的语言能够让那些使用它的人升级自己的头脑思维.“Babel-17 是一种极精确的分析语言,几乎可以确保任何情况下的技术优势.”影片中的主人公有这样一句台词.通过发明 Ruby,松本行弘希望实现同样的效果:重编并改进程序员思考的方式. 这目标听起来很宏大,