14

我已经阅读了几页,包括处理强类型和弱类型语言的 wiki 页面http://en.wikipedia.org/wiki/Strong_and_weak_typing 。在大多数情况下,我想我理解其中的区别。但是,我想要一个直截了当的答案来区分两者。

据我了解,在弱类型语言中,不必显式调用数据类型。这将是一种类似于 Matlab 的语言,您可以在其中添加 4 和 2.3 而无需进行类型转换。强类型语言要求程序员为每个变量和/或值声明数据类型。例如,在 C 中,您需要执行 4 + (int) 2.3 或 (float)4 + 2.3 之类的操作(不记得这是否是有效的 C 类型转换)。

任何扩展或纠正我对这些概念的理解的信息将不胜感激。

4

3 回答 3

24

区别不在于在变量上声明类型。它比这更微妙(和Eric Lippert 的步伐,我认为这个术语的定义相当明确)。区别在于,在强类型语言中,每个表达式都有一个可以在编译时确定的类型,并且只允许适用于该类型的操作

在无类型(对批评者来说是“弱类型”,对粉丝来说是“动态类型”)语言中,情况并非如此。该语言允许对任何类型执行任何操作,但相当重要的条件是操作可能会失败。也就是说,虽然语言可能允许操作,但运行时可能不允许。

请注意,可以使用强类型语言而不需要到处进行类型声明。事实上,没有强类型语言可以。考虑一下Java:

String s = "hellO";
int l = s.getBytes().length;

编译器如何确定那里.length是合法的?这是合法的,因为它被用于byte[]. 但是没有任何东西是byte[]这里的声明。相反,编译器知道这s是 a String,并且当您调用getBytes()a时String,您会得到 a byte[]。它从这些事实中推断出 of 的类型s.getBytes()是 a byte[],因此请求它是合法的length

一些类型系统比 Java 更复杂的语言允许编译器推断更多。例如,在 Scala 中,您可以说:

val s = "hello"
val l = s.getBytes().length

并且编译器将推断 and 的类型,s以及l中间表达式的类型。

具有强类型化但需要冗余类型声明的类型推断人为限制的语言(如 Java)被描述为具有清单类型,因为必须使类型清单化,这是一种花哨的说法,即显式地存在,这是花哨的说法写下来。

于 2013-06-12T18:13:26.050 回答
10

查看 Eric Lippert 的博客。这里有一个关于您正在寻找的内容的条目。

从他的博客来看,这些术语是主观的,所以“更准确地谈论类型系统特性”。

于 2013-06-12T18:03:19.143 回答
2

正如您所说... ...在弱类型语言中,不必显式调用数据类型。

强类型语言要求程序员为每个变量和/或值声明数据类型。

这是对的...

在所谓的“强”类型语言(如 c#)中也有一种范式,其中类型可以在必要时或程序员想要的情况下声明......例如 C# 具有“var”类型,但也具有强类型(Int32,字符串、布尔值等),许多使用这种语言的程序员更喜欢。

通过这种方式,一种语言既可以是“强”类型,也可以是“弱”类型。

我希望这有助于您进一步理解这个概念......

于 2013-06-12T18:07:48.723 回答