编程语言的类型系统

每学一门新的编程语言时,在看到介绍该门编程语言的特点时,经常会遇到 静态动态 、隐式显式 类型等字样,似懂非懂,这里结合网上的资料总结一下它们的含义以及区别,描述不一定专业、准确,但求能进一步理解这些词的概念即可。

类型系统(Type System)用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,如何操作这些类型,这些类型如何互相作用。根据这些种种不同,可以将编程语言分为以下类别:

静态类型编程语言 vs 动态类型编程语言

在静态类型语言,每个变量名字都绑定到:

  • 一个类型,编译时通过变量的定义来绑定
  • 一个对象,这是可选的,如果变量名没绑定到一个对象,那么名字指向 null

例如下面是 Java 中定义字符串类型变量:

String str1;        //reference to null
String str2 = "Hello world";

定义了两个变量 str1、str2,它们的类型均是 String 类型,而 str1 并没有指向特定的对象,但 str2 指向了一个 "Hello world" 的字符串对象。

注意的是,静态类型的编程语言,一旦变量名绑定到一个类型(通过声明语句),那么它就只能绑定到这种类型的对象上(通过赋值语句)。如果试图该某种类型的变量绑定到不同类型的对象上,将在编译时抛出类型异常的错误。

例如下面的代码将一个整型的对象赋值给 String 类型的变量会报错:

String str1;
str = 10;

而在动态类型语言中,每个变量名只于对象进行绑定。在程序运行时通过赋值操作来将名字绑定到对象上,如果再将名字绑定到另一种不同类型的对象上也是允许的。

例如下面是 Python 中代码:

var = "Hello world"
//...
var = 10

先将 var 变量赋值一个 "Hello world" 字符串对象,运行过程中随时可以将 var 赋值其它类型的对象。这在 Python 中并不会报错。

下图可以反应两者的区别:

由上可以看出 Java、C/C++、C# 等属于静态类型编程语言,而 Python、PHP、Perl 等属于动态类型语言。

强类型编程语言 vs 弱类型编程语言

根据变量能否隐式(implicit)转换为无关(unrelated)的类型,可以将编程语言分成弱类型编程语言和强类型编程语言,前者可以完成转换,后者则需要通过显式(explicit)地转换。注意这里的无关类型转换指的是类似于数值类型与字符串类型的转换,而大多数语言允许相关类型之间的隐式转换,例如 int 类型到 float 类型的转换。

在弱类型编程语言中,数字 9 和字符串 "9" 是可以相互转换的,例如下面的代码是合法的:

a  = 9
b = "9"
c = concatenate(a, b)  // produces "99"
d = add(a, b)          // produces 18

但是在强类型编程语言中,后面两条语句会抛出类型异常,为了避免这些异常,我们往往需要通过一些显式类型转换操作来完成:

a  = 9
b = "9"
c = concatenate(str(a), b)
d = add(a, int(b) )

根据上面的描述,我们可以知道像 Python、Java 等属于强类型编程语言,而 Perl、PHP 等属于弱类型编程语言。

显式类型编程语言 vs 隐式类型编程语言

还有一种区分方法是,根据变量名是否需要显式给出类型的声明,来将语言分为显式类型语言和隐式类型语言。前者需要在定义变量时显式给出变量的类型,而后者可以使用类型推论来决定变量的类型。

大多数静态类型语言,例如 Java、C/C++ 都是显式类型语言,但是有些则不是,如 Haskell、ML 等,可以基于变量的操作来推断其类型;Scala 是一种新型的静态类型编程语言,它运行在 Java 虚拟机上,也是使用的是类型推断;Boo 是一种类 Python 编程语言,运行在 .NET CLI 之上,使用的是类型推断。

总结

这篇文章只是给出了一个非形式化定义,旨在理解各种不同编程在类型系统的设计思想,当然本文只提到类型系统的冰山一角。

本文绝大数内容编译自这篇文章,还参考 知乎问答,wiki 相关词条,特致谢!

时间: 2024-08-08 22:09:06

编程语言的类型系统的相关文章

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

程序是类型的证明. 计算机程序是建立在计算机硬件和一系列规则.协议.规范.算法基础之上的: 程序是建立在逻辑和严格证明基础之上的: 逻辑学的基本要素是:概念.判断.推理: 类型系统相当于逻辑和科学中的概念,在此基础上才能进行运算和推理: 编程语言不过是建立了类型系统和在类型系统基础上的一些列运算法则而已. 类型+运算法则+运算推演=程序: 作者:匿名用户 链接:https://www.zhihu.com/question/23434097/answer/42374622 来源:知乎 著作权归作者

【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,松本行弘希望实现同样的效果:重编并改进程序员思考的方式. 这目标听起来很宏大,