静态动态
指变量类型
- 静态, 编译时检查,变量关联类型和实体. 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