这两个定义中的哪一个是正确的?
-
Statically typed - 在编译时检查类型匹配(因此只能应用于编译语言)
-
Dynamically typed - 在运行时检查类型匹配,或者根本不检查 . (该术语可应用于编译或解释语言)
-
Statically typed - 类型被分配给变量,所以我会说'x is of type int' .
-
Dynamically typed - 将类型分配给值(如果有的话),这样我会说'x is holding an int'
根据这个定义,静态或动态类型不依赖于编译或解释语言 .
哪个是正确的,还是一个都不对?
4 回答
我喜欢后者的定义 . 在从基类转换为面向对象语言(如Java或C)的派生类时,请考虑类型检查,它适合第二个定义而不是第一个定义 . 它是一种带有(可选)动态类型检查的编译语言 .
第一对定义更接近但不太正确 .
这很棘手 . 我认为如果一种语言被解释但是在执行开始之前进行了类型检查,那么它仍然是静态类型的 . OCaml REPL几乎就是这样的一个例子,除了它在技术上将源代码编译(和类型检查)到它自己的字节代码然后解释字节代码 .
而是:
Dynamically typed - 类型检查在运行时完成 .
Untyped - 未完成类型检查 .
变量是无关紧要的 . 虽然您只在变量和函数定义的许多静态类型语言的源代码中明确地看到类型,但所有子表达式都具有静态类型 . 例如,
"foo" + 3
通常是静态类型错误,因为您无法将字符串添加到int但不涉及变量 .查看单词static的一种有用方法是:静态属性是指在所有可能的输入上保存程序的所有可能执行的属性 . 然后,您可以查看任何给定的语言或类型系统,并考虑它可以验证哪些静态属性,例如:
JavaScript:没有段错误/内存错误
Java / C#/ F#:如果编译的程序和变量的类型为T,则变量只保存此类型的值 - 在所有执行中 . 但是,遗憾的是,引用类型也承认
null
为一个值 - billion dollar mistake .ML没有
null
,使上述保证更强Haskell可以验证有关副作用的声明,例如“此程序不会在stdout上打印任何内容”之类的属性
Coq还验证终止 - “此程序终止于所有输入”
您要验证多少,这取决于品味和手头的问题 . 所有魔法(验证)都是有代价的 .
如果您以前从未见过ML,请尝试一下 . 至少给Yaron Minsky的talk注意5分钟 . 它可以改变你作为程序员的生活 .
第二个是我眼中更好的定义,假设你没有寻找关于为什么或如何工作的解释 .
再好一点就是说
静态类型为变量提供了一个无法更改的EXPLICIT类型
动态类型为变量提供了可以更改的IMPLICIT类型