编程语言的类别系统

每学一宗新的编程语言时,在顾介绍该门编程语言的性状时,经常会赶上
静态动态隐式显式
类型等字样,似懂非懂,这里成网上的资料总结一下它的义和界别,描述不必然标准、准确,但要能越来越了解这些词的概念即可。

列系统(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
相关词条,特致谢!