2012-07-12 118 views
2

这两个定义中的哪一个是正确的?静态类型和动态类型的定义

  • 静态类型 - 类型匹配在编译时检查(因此只能适用于汇编语言)
  • 动态类型 - 类型匹配是在运行时检查,或者根本没有。 (这一项可以应用于编译或解释语言)

  • 静态类型 - 类型分配给变量,这样我会说“x是int类型的”
  • 动态类型 - 类型分配给值(如果有的话),所以我会说“x是持有一个int”

根据这个定义,静态或动态类型是不依赖编译或解释语言。

哪一个是正确的,或者两者都不正确?

回答

1

第二个是我眼中更好的定义,假设你没有寻找关于为什么或如何工作的解释。再次

更好的方式是说,

  • 静态类型赋予变量的显式类型不能改变
  • 动态类型赋予变量的隐式类型,它可以改变
+2

我不确定“显示”。通过类型推断,程序员不会明确地给变量赋予一个类型。 – 2013-01-31 13:12:06

+0

我还没有使用过类型推断的语言,也不知道对不起。 – Cramer 2013-03-18 01:35:36

0

我喜欢后者定义。考虑使用面向对象语言(如Java或C++)从基类转换为派生类时进行的类型检查,该语言适合第二个定义,而不是第一个定义。它是一种带有(可选)动态类型检查的编译语言。

+0

这是如何动态检查?而且这两个定义都允许编译语言动态输入。 – baruch 2012-07-12 08:28:26

+0

@baruch从基类转换为派生类引发运行时类型检查。也就是说,按照定义,动态类型。 – 2013-01-31 13:17:07

4

哪一个是正确的,或者哪一个都不正确?

第一对定义比较接近但不完全正确。

静态类型 - 类型匹配在编译时被检查(并且因此只能应用于编译语言)

这是棘手。我认为如果一个语言被解释,但在执行开始之前进行了类型检查,那么它仍然是静态类型的。 OCaml REPL几乎就是一个例子,除了它在技术上将源代码编译(并键入检查)到自己的字节码中,然后解释字节码。

动态输入 - 在运行时检查类型匹配,或根本不检查类型匹配。

相反:

动态类型 - 类型检查是在运行时完成。

无类型 - 类型检查没有完成。

静态类型 - 类型分配给变量,这样,我会说“x是int类型”。

动态类型 - 类型分配给值(如果有的话),所以我会说“×拿着一个int”

变量是不相关的。虽然在变量和函数定义中,您只能在许多静态类型语言的源代码中明确地看到类型,但所有子表达式都具有静态类型。例如,"foo" + 3通常是一个静态类型错误,因为您不能将一个字符串添加到一个int,但没有涉及变量。

2

一个有用的方法来看看这个词静态是这样的:静态属性是那些适用于所有可能的程序执行所有可能的输入。然后,你可以看看在任何给定的语言或类型系统,并考虑其静态属性可以在验证,例如:

  • 的JavaScript:没有段错误/内存错误

  • 的Java/C#/ F#:如果程序编译和一个变量有一个类型T,那么变量只保存这种类型的值 - 在所有执行中。但是,可悲的是,参考类型也承认null作为一个值 - billion dollar mistake

  • ML没有null,使得上述担保更强

  • 哈斯克尔可以验证有关副作用的语句,例如一个属性,如“这个程序不能在标准输出上打印出任何东西”

  • 勒柯克也验证终端 - “结束本程序的所有输入”

多少钱你要验证,这取决于口味和手头的问题。所有的魔法(验证)都是以价格为准。

如果你以前从未见过ML,那就试一试。至少给予亚伦明斯基的talk 5分钟的关注。它可以改变你作为程序员的生活。