3 回答
TA贡献1848条经验 获得超2个赞
您已经发现业余爱好者用来谈论编程语言的术语上的薄弱之处。 请勿使用“强”和“弱”类型的术语,因为它们在技术含义上尚未达成共识。相比之下,静态类型化意味着在执行程序之前先检查程序,然后在启动程序之前将其拒绝。 动态类型化意味着在执行过程中会检查值的类型,而类型错误的操作可能会导致程序停止运行或在运行时发出错误信号。静态类型化的主要原因是要排除可能具有此类“动态类型错误”的程序。
强类型通常意味着类型系统中没有漏洞,而弱类型意味着类型系统可以被颠覆(使任何保证无效)。这些术语经常被错误地使用来表示静态和动态类型。要了解它们之间的区别,请考虑一下C:在编译时对语言进行类型检查(静态类型化),但是仍然存在很多漏洞。您几乎可以将任何类型的值转换为相同大小的另一类型-特别是,您可以自由地转换指针类型。帕斯卡(Pascal)是一种旨在强力打字的语言,但著名的是无法预料的漏洞:没有标签的变体记录。
强类型语言的实现通常会随着时间的流逝而产生漏洞,因此,可以使用高级语言来实现部分运行时系统。例如,Objective Caml有一个称为的函数Obj.magic
,具有仅返回其参数的运行时效果,但是在编译时,它将任何类型的值转换为任何其他类型的值。我最喜欢的示例是Modula-3,其设计师将其称为类型转换构造LOOPHOLE
。
话虽如此,您不能指望任何两个人以完全相同的方式使用“强”和“弱”两个词。所以避免他们。
TA贡献1815条经验 获得超10个赞
简单地说就是这样:在静态类型语言中,类型是static,这意味着一旦将变量设置为类型,就无法更改它。那是因为类型是与变量关联的,而不是变量所引用的值。
例如在Java中:
String str = "Hello"; //statically typed as string
str = 5; //would throw an error since java is statically typed
而在动态类型语言中,类型是dynamic,这意味着在将变量设置为类型之后,可以对其进行更改。这是因为键入与值而不是变量相关联。
例如在Python中:
str = "Hello" # it is a string
str = 5 # now it is an integer; perfectly OK
另一方面,某种语言中的强/弱键入与隐式类型转换有关(部分取自@Dario的答案):
例如在Python中:
str = 5 + "hello"
# would throw an error since it does not want to cast one type to the other implicitly.
而在PHP中:
$str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0
// PHP is weakly typed, thus is a very forgiving language.
静态类型允许在编译时检查类型正确性。通常编译静态类型的语言,并解释动态类型的语言。因此,动态类型的语言可以在运行时检查类型。
添加回答
举报