首先要明确这些名词都是针对数据类型展开的各自定义,同样针对数据类型在编译时和运行时会有一些限定或者规则存在。动态类型语言不能等同于弱类型语言,静态类型语言也不能等同于强类型语言。
静态类型语言和动态类型语言放到一个维度来进行评价类型系统,而强类型语言和弱类型语言是在另一个维度来评价类型系统。
1、静态类型语言和动态类型语言
静态类型语言和动态类型语言评价类型系统的维度可以理解为类型的定义。
1.1 静态类型语言
静态类型语言在创建变量时需要显式的定义当前变量的类型,并且通常该变量一旦定义了类型,则在其整个生存周期内都是不可改变的。所以在编码阶段就需要定义好变量类型,在工程编译阶段会进行变量类型的检验,不定义、不同类型之间进行的组合操作会判定为不合法,工程编译直接报错且停止工程的编译。
例如如下的C++代码:
int a = 1; //显式定义类型合法,可以通过编译器检验
std::string str("demo"); //显式定义类型合法,可以通过编译器检验
c = 0.123; // 定义不合法,没有显式的定义变量类型,不能通过编译器检验
1.2 动态类型语言
动态类型语言在创建变量时不需要显式的定义当前变量的类型,并且该变量在运行时可能会随着程序逻辑的运行需要改变当前的数据类型。所以动态类型语言在编码阶段能一定程度上减少开发者的开发工作量,不用为类型定义、操作组合中不同类型转换的合法做过多设计。
例如如下的python代码
a = 1 #根据类型推导当前命名为a的变量为整型int,合法可运行
b = “test” #根据类型推导当前命名为a的变量为字符串类型str,合法可运行
又如PHP代码
<?php
$a=1; //定义变量a,赋值为1,类型推导为int
$str='test'; //定义变量str,赋值'test',类型推导为string
// add() 包含两个参数和一个返回值,不校验输入类型的合法性
function add($a, $b) {
return $a + $b;
}
?>
1.3 总结
所以需要程序更加健壮,完全严格按照预期要求进行运行,则使用静态类型语言,需要灵活高效的进行编码,则使用动态类型语言,但是要承担程序不按照预期要求的规则运行的后果,且出现问题不易于排查。
2、强类型语言和弱类型语言
强类型和弱类型是指编程语言在处理运算操作时,对不符合规则的值的处理策略,要么进行类型转换继续进行程序执行,要么判为非法停止运行。
2.1 强类型语言
对于类型不匹配的操作,编译器检测为不符合规则,则会直接报错。
例如如下的C++代码(现在也存在部分弱化规则,不做展开在,只讨论当前概念)
int a = 1;
int b =2;
std::string str("demo");
cout << a+b << endl; // 组合操作合法,可以通过编译器检验
cout << a+str << endl; //组合操作非法,不能通过编译器检验
又有如下python代码:
a=1
b="2.3"
c=a+b
运行报错:
{'result__': "[Error] TypeError: unsupported operand type(s) for +: 'int' and 'str'"}
所以python是一种动态类型语言且是一种强类型语言
2.2 弱类型语言
对于类型不同的操作,不做类型匹配合法性,运行时会进行类型转换,程序继续运行下去。
例如如下的PHP代码
<?php
$a=1;
$str='test';
$a=$str; //将变量str赋值给变量a,运行无误,此时a已经变成string类型变量,且值为test
echo($a); //输出变量a此时为test,运行无误
?>
2.3 总结
与静态/动态之间存在一条明确的界限不同,语言的强/弱是一个范围,语言可以表现出不同程序的强/弱。有些文章说 C++ 是强类型,也有文章说 C++ 是弱类型,这就是原因所在。
3、类型象限图
下图使用象限示意图汇总了常用编程语言的不同分类: