静态类型和动态类型

静态和动态的区别在于对类型的检查上:

  • 静态类型:在静态语言中,一旦声明一个变量是int类型,之后就只能将int类型的数据赋值给它,否则就会引发错误;
  • 动态类型:将什么类型的数据赋值给变量,这个变量就是什么类型;

以下语言,皆属于动态类型:

  1. PHP
  2. Ruby
  3. Python

常见的静态类型语言则有:

  1. C
  2. C++
  3. JAVA
  4. C#
  5. Go

    强类型和弱类型?

    强弱之分,体现在对类型的检查严格程度上,弱类型语言对于变量类型的检查比较宽松,容忍隐式类型转换这种事情的发生。何为隐式类型转换,一般有两种形式:

  6. 相关类型之间隐式转换

  7. 不相关类型之隐式间转换(该点用于区分强弱类型)

举例子来说,一个int类型的数据与一个float类型的数据相加,最终的结果是一个float类型的数据,这个过程就发生了隐式类型转换,int类型数据首先被转成float类型,然后与另一个float进行操作,这便是相相关类型之间隐式转换。

一个int类型数据与一个字符串类型数据相加,竟然没有发生错误,得到的结果是一个字符串,int类型数据隐式转换为字符串,可他们原本是两个不相干的数据类型,这种就是第二种隐式转换。

在弱类型语言中,变量可以隐式强制转换为不相关类型,而在强类型语言中则不可以。按照这种概念定义来划分,PHP,Perl都属于弱类型语言,其他编程语言,你所常见的,比如java, C, C++, Python,Go皆属于强类型语言。

类型安全

类型安全不应与静态/动态类型或强/弱类型混淆。类型安全的语言是一种只能对数据执行的操作是数据类型所允许的操作。也就是说,如果您的数据属于类型X并且X不支持操作y,那么该语言将不允许您执行y(X)。这个定义并不设置规则时,这个被选中。它可以在编译时(静态类型)或在运行时(动态类型),通常通过异常。两者可能有点:某些静态类型化语言允许您将数据从一种类型转换为另一种类型,并且必须在运行时检查转换的有效性(假设您尝试Object将a转换Consumer为a-编译器没有知道是否可以接受的方式)。

类型安全性也不一定意味着强类型化-众所周知,某些语言的弱类型性很强,但仍然可以说是类型安全的。以Javascript为例:它的类型系统虽然很弱,但仍然严格定义。它允许在正确定义的规则内自动转换数据(例如,将字符串转换为整数)。据我所知,没有一种情况会导致Javascript程序以未定义的方式运行,并且如果您足够聪明(我不是),您应该能够预测阅读Javascript代码时会发生什么。

类型不安全的编程语言的一个示例是C:根据规范,在数组范围之外读取/写入数组值具有未定义的行为。无法预测会发生什么。C是具有类型系统但不是类型安全的语言。

参考资料

  1. https://zhuanlan.zhihu.com/p/109803872
  2. https://m.imooc.com/wenda/detail/593852