强类型和弱类型语言之间的区别?

时间:2013-06-12 17:59:33

标签: theory

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

根据我的理解,在弱类型语言中,不必显式调用数据类型。这将是一种类似Matlab的语言,您可以在不需要进行类型转换的情况下添加4和2.3。强类型语言要求程序员为每个变量和/或值声明数据类型。例如在C中,你需要做类似4 +(int)2.3或(float)4 + 2.3的事情(不记得那是否是有效的C类型转换)。

非常感谢任何扩展或纠正我对这些概念的理解的信息。

3 个答案:

答案 0 :(得分:23)

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

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

请注意,可以使用强类型语言,而无需在任何地方使用类型声明。实际上,没有强类型的语言。考虑一下Java:

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

编译器如何确定.length在那里合法?它是合法的,因为它被用在byte[]上。但是这里没有任何声明是byte[]。相反,编译器知道sString,而当您在getBytes()上调用String时,您会得到byte[]。它推断出s.getBytes()类型为byte[]的事实,因此要求length是合法的。

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

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

编译器将推断出sl以及中间表达式的类型。

具有强类型但对需要冗余类型声明(如Java)的类型推断的人为限制的语言被描述为具有清单类型,因为类型必须是明显的,这是一种奇特的方式明确表达存在的说法,这是一种写下来的写作方式。

答案 1 :(得分:10)

检查Eric Lippert的博客。有关于您正在寻找here的内容的条目。

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

答案 2 :(得分:2)

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

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

这是正确的......

在所谓的“强”类型语言(如c#)中也存在一种范式,如果需要或程序员想要的话,可以声明类型......例如C#具有“var”类型,但也有强类型(Int32,String,Boolean等),许多程序员使用这种语言更喜欢。

通过这种方式,语言可以“强烈”和“弱”地输入。

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