静态类型语言和动态类型语言有什么区别?

1217

当我们说一种语言是动态类型语言还是静态类型语言时,这意味着什么?


1
@EricLeschinski,我认为单元测试现在可以帮助解决这个问题,而像JavaScript这样的动态类型语言可以放心地编码,因此使其有资格用于企业软件开发,你觉得呢? - pixel 67
8
最好的情况是那些单元测试会随着时间的推移而恶化,并被试图增加工作保障的同事关闭;在最坏情况下,它们根本就没有被编写。这就像建议一位专业机修工使用胶带来修理客户的汽车一样。没错,新手,对你来说,在这个变速器维修中使用胶带是个好主意…… - Eric Leschinski
这篇关于编程的文章可能会对你有所帮助:https://android.jlelse.eu/magic-lies-here-statically-typed-vs-dynamically-typed-languages-d151c7f95e2b - Dr Nisha Arora
19个回答

5
甜美而简单的定义,但符合需求: 静态类型语言将类型与变量绑定到其整个作用域(例如:Scala)。 动态类型语言将类型绑定到变量所引用的实际值中。

4

静态类型:编译时执行的类型检查

静态类型语言实际上是什么意思:

  • 必须指定变量的类型
  • 变量只能引用特定类型的对象*
  • 值的类型检查将在编译时执行,并且任何类型检查都将在该时间报告
  • 内存将在编译时分配以存储该特定类型的值

静态类型语言的例子包括C、C ++和Java。

动态类型:运行时执行的类型检查

动态类型语言实际上是什么意思:

  • 不需要指定变量的类型
  • 同一变量可以引用不同类型的对象

Python、Ruby是动态类型语言的示例。


*一些对象可以通过类型转换分配给不同类型的变量(这在像C和C ++这样的语言中很常见)


3

静态类型语言(编译器解析方法调用和编译引用):

  • 通常具有更好的性能
  • 更快的编译错误反馈
  • 更好的IDE支持
  • 不适用于处理未定义的数据格式
  • 在模型未定义时启动开发更加困难
  • 编译时间更长
  • 在许多情况下需要编写更多的代码

动态类型语言(在运行程序中做出决策):

  • 性能较低
  • 更快的开发速度
  • 有些错误只能在运行时检测到
  • 适合处理未定义的数据格式(元编程)

3
在静态类型语言中,变量与编译时已知的类型相关联,并且该类型在程序执行期间保持不变。同样地,变量只能被赋值为已知/指定类型的实例。
在动态类型语言中,变量没有类型,在执行期间其值可以是任何形状和形式的内容。

2
静态类型语言如C++、Java和动态类型语言如Python只在变量类型的执行方面有所不同。静态类型语言对于变量有一个静态数据类型,在编译时检查数据类型,因此调试更加简单。而动态类型语言则不同,数据类型在执行程序时进行检查,因此调试稍微困难一些。
此外,它们有一个非常小的差异,可以与强类型和弱类型语言相关联。强类型语言不允许您将一个类型作为另一个类型使用,例如C和C++,而弱类型语言允许,例如Python。

2

静态类型

在运行之前就进行类型检查,因此可以更早地捕获错误。

例如 = C++

动态类型

在执行过程中进行类型检查。

例如 = Python


2
这并没有添加任何其他答案尚未涵盖的内容,是吗? - Robert
1
是的,但大多数答案并不是很清晰,所以我想要一个易于理解的答案。 - Atticus Denewmont

2
动态类型编程允许程序在运行时更改变量的类型。
动态类型语言包括Perl、Ruby、Python、PHP、JavaScript和Erlang。enter image description here 静态类型意味着如果您尝试将字符串存储在整数变量中,它将不被接受。
静态类型语言包括C、C++、Java、Rust、Go、Scala和Dart。enter image description here

3
请始终将代码嵌入帖子中,而不是作为屏幕截图。此外,这个答案相比之前的答案有什么新的内容吗?它实际上存在一些问题:1. 一种语言可能是静态类型的,但仍然允许像Python示例那样的操作:通过将数字读取为十进制表示形式,可以将数字转换为字符串,更不用说在C中,字符串变量只是一个指针,弱类型系统可能会将其视为int。2. 在函数式编程(狭义上)中,您根本不改变变量,但仍然可以使用动态语言。 - leftaroundabout

0

动态类型语言可以帮助快速原型化算法概念,而无需考虑需要使用哪种变量类型的开销(这在静态类型语言中是必要的)。


-17

静态类型: 像Java和Scala这样的语言是静态类型的。

变量必须在代码中定义和初始化后才能使用。

例如:int x; x = 10;

System.out.println(x);

动态类型: Perl是一种动态类型的语言。

变量在代码中使用之前不需要初始化。

y=10; 在代码的后面部分使用这个变量。


3
好的,这个答案并不完全正确。在两种语言中,变量在使用之前必须进行初始化。但是,在动态类型语言中,您可以选择在使用时省略类型。 - darshan
看起来你误用了“变量”这个术语,你应该使用“类型”代替。 - Emir
我认为Perl是静态类型的:它有三种类型,标量($),数组(@)和哈希(%)。在Perl中,变量的类型在编译时就已知,并且在变量的生命周期内保持不变。 - CoffeeTableEspresso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接