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

Jos*_*osh 13 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类型转换).

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

Tom*_*son 23

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

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

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

String s = "hellO";
int l = s.getBytes().length;
Run Code Online (Sandbox Code Playgroud)

编译器如何确定.length那里合法?这是合法的,因为它被用于byte[].但是没有任何声明可以作为一个byte[]在这里.相反,编译器知道它s是a String,而当你调用getBytes()a时String,你会得到一个byte[].它从那些类型s.getBytes()为a的事实中推断出来byte[],因此要求它是合法的length.

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

val s = "hello"
val l = s.getBytes().length
Run Code Online (Sandbox Code Playgroud)

编译器会推断类型的sl,以及中间表达式.

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

  • 强/弱类型与静态/动态类型正交.例如,Ruby类型系统强大且动态. (3认同)

mas*_*ann 10

查看Eric Lippert的博客.有一个关于刚才你要找一个条目这里.

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