弱类型、强类型、动态类型、静态类型语言的区别是什么?

2019/09/14 Others 共 2306 字,约 7 分钟

静态动态

指变量类型

  • 静态, 编译时检查,变量关联类型和实体. eg. java/c/c++
  • 动态, 运行时检查,变量关联实体。 eg. python

强弱类型

  • 强类型,不允许类型隐式转换, eg. java/python/golang
  • 弱类型, 允许类型隐式转换, 比如c++的int可以变成double

解释1

强类型:偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成double

弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double

静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。

动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。譬如说你不能对一个数字a写a[10]当数组用。

作者:知乎用户 链接:https://www.zhihu.com/question/19918532/answer/21645395 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解释2

弱类型:

> "1"+2
'12'

强类型:

>>> "1"+2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

动态类型:

>>> a = 1
>>> type(a)
<type 'int'>
>>> a = "s"
>>> type(a)
<type 'str'>

静态类型:

Prelude> let a = "123" :: Int

<interactive>:2:9:
    Couldn't match expected type `Int' with actual type `[Char]'
    In the expression: "123" :: Int
    In an equation for `a': a = "123" :: Int

作者:夏雨婷 链接:https://www.zhihu.com/question/19918532/answer/58538334 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解释3

作者:三只熊 链接:https://www.zhihu.com/question/19918532/answer/281501105 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

静态类型

在静态类型语言中,每一个变量名跟下面两部分绑定:

  • 类型(在编译阶段,也就是对数据的声明)
  • 实体(跟变量名具体绑定的实体)

绑定的实体是可选的-如果这个变量名没有绑定实体,则变量是null。

一旦一个变量名绑定了一个类型(声明),它就应该和它所对应的实体的类型一致(通过赋值语句);如果试图给该变量名绑定一个错误的类型,那么这将抛出异常。

动态类型

在动态类型语言中,每个变量名只和下面的部分绑定(除非变量是null):

  • 实体

变量名在执行阶段通过赋值语句和实体绑定,当然,在程序的执行阶段,它也可能和不同类型的其他实体绑定。

关于静态类型语言和动态类型语言举例:

employeeName = 9
employeeName = "David"

在静态类型语言中,上面的语句(先将整形值赋值给变量名,然后又将字符串类型的值赋值给变量名)是不合法的。如果employeeName被声明为整形,则第二条语句是不合法的。如果它被声明为字符串类型,则第一条语句是不合法的。但是在动态类型语言中,上面两条语句能够正确的执行。

python是动态类型语言,golang是静态类型语言。

弱类型

在弱类型语言中,变量能够隐式的转换为无关类型,在强类型语言中不可以隐式转化,必须通过显示转换(注意这里的无关类型。大部分语言能够隐式的转换相关类型,例如整数和浮点数之间的加法。无关类型则像整形和字符串类型。)在典型的弱类型语言中,整数类型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)    // produces "99"
d = add(a, (int)b)             // produces 18

java和python都是强类型语言,Perl和Rexx是弱类型语言。

其他理解

动态类型=>运行时检查。静态类型=>编译期检查。静态类型指的是编译器在compile time执行类型检查,动态类型指的是编译器(虚拟机)在runtime执行类型检查。简单地说,在声明了一个变量之后,不能改变它的类型的语言,是静态语言;能够随时改变它的类型的语言,是动态语言。因为动态语言的特性,一般需要运行时虚拟机支持。

作者:Alan Li 链接:https://www.zhihu.com/question/19918532/answer/13568542 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

例子

无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

Search

    Table of Contents