编程语言的品类系统

每学一门新的编程语言时,在观察介绍该门编程语言的特性时,日常会遇上
静态动态隐式显式
类型等字样,似懂非懂,那里结合网上的材料统计一下它们的含义以及界别,描述不肯定标准、准确,但求能更为理解那些词的概念即可。

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

相关文章