我已经阅读了几个页面,包括处理强类型和弱类型语言的wiki页面http://en.wikipedia.org/wiki/Strong_and_weak_typing。在大多数情况下,我认为我理解差异。但是,我想直截了当地回答两者的区别。
根据我的理解,在弱类型语言中,不必显式调用数据类型。这将是一种类似Matlab的语言,您可以在不需要进行类型转换的情况下添加4和2.3。强类型语言要求程序员为每个变量和/或值声明数据类型。例如在C中,你需要做类似4 +(int)2.3或(float)4 + 2.3的事情(不记得那是否是有效的C类型转换)。
非常感谢任何扩展或纠正我对这些概念的理解的信息。
答案 0 :(得分:23)
差异不在于声明变量的类型。它比那更微妙(和 pace Eric Lippert,我认为这个术语相当明确)。区别在于,在强类型语言中,每个表达式都有一个可以在编译时确定的类型,而只允许适合该类型的操作。
在一个无类型的(“弱类型”批评者,“动态键入”粉丝)语言中,情况并非如此。该语言允许对任何类型执行任何操作,但相当重要的条件是操作可能会失败。也就是说,虽然语言可能允许操作,但运行时可能不允许。
请注意,可以使用强类型语言,而无需在任何地方使用类型声明。实际上,没有强类型的语言。考虑一下Java:
String s = "hellO";
int l = s.getBytes().length;
编译器如何确定.length
在那里合法?它是合法的,因为它被用在byte[]
上。但是这里没有任何声明是byte[]
。相反,编译器知道s
是String
,而当您在getBytes()
上调用String
时,您会得到byte[]
。它推断出s.getBytes()
类型为byte[]
的事实,因此要求length
是合法的。
某些类型系统比Java更复杂的语言允许编译器推断出更多。例如,在Scala中,您可以说:
val s = "hello"
val l = s.getBytes().length
编译器将推断出s
和l
以及中间表达式的类型。
具有强类型但对需要冗余类型声明(如Java)的类型推断的人为限制的语言被描述为具有清单类型,因为类型必须是明显的,这是一种奇特的方式明确表达存在的说法,这是一种写下来的写作方式。
答案 1 :(得分:10)
检查Eric Lippert的博客。有关于您正在寻找here的内容的条目。
从他博客的外观来看,这些术语是主观的,所以“更准确地说出类型系统的特征。”
答案 2 :(得分:2)
正如你所说...... ...在弱类型语言中,不必显式调用数据类型。
强类型语言要求程序员为每个变量和/或值声明数据类型。
这是正确的......
在所谓的“强”类型语言(如c#)中也存在一种范式,如果需要或程序员想要的话,可以声明类型......例如C#具有“var”类型,但也有强类型(Int32,String,Boolean等),许多程序员使用这种语言更喜欢。
通过这种方式,语言可以“强烈”和“弱”地输入。
我希望这有助于进一步理解这个概念...