为了账号安全,请及时绑定邮箱和手机立即绑定

静态/动态与强/弱

静态/动态与强/弱

我看到这些术语在编程中无处不在,我对它们的含义有一个模糊的概念。搜索显示我实际上已经在整个堆栈溢出中询问了此类问题。据我所知,语言中的静态/动态键入与强/弱键入有细微的区别,但是这种差异是我难以理解的。不同的来源似乎使用不同的含义,甚至可以互换使用这些术语。我找不到某个地方可以同时谈论这两者,并能说明差异。最好的是,如果有人可以在这里为我和世界其他地方清楚地说明这一点。
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

静态/动态打字为约当类型信息被获取(无论是在编译时或在运行时)


强/弱键入是关于如何严格区分类型(例如,语言是否尝试进行从字符串到数字的隐式转换


查看完整回答
反对 回复 2019-11-04
?
千巷猫影

TA贡献1829条经验 获得超7个赞

您已经发现业余爱好者用来谈论编程语言的术语上的薄弱之处。 请勿使用“强”和“弱”类型的术语,因为它们在技术含义上尚未达成共识。相比之下,静态类型化意味着在执行程序之前先检查程序,然后在启动程序之前将其拒绝。 动态类型化意味着执行过程中会检查的类型,而类型错误的操作可能会导致程序停止运行或在运行时发出错误信号。静态类型化的主要原因是要排除可能具有此类“动态类型错误”的程序。

强类型通常意味着类型系统中没有漏洞,而弱类型意味着类型系统可以被颠覆(使任何保证无效)。这些术语经常被错误地使用来表示静态和动态类型。要了解它们之间的区别,请考虑一下C:在编译时对语言进行类型检查(静态类型化),但是仍然存在很多漏洞。您几乎可以将任何类型的值转换为相同大小的另一类型-特别是,您可以自由地转换指针类型。帕斯卡(Pascal)是一种旨在强力打字的语言,但著名的是无法预料的漏洞:没有标签的变体记录。

强类型语言的实现通常会随着时间的流逝而产生漏洞,因此,可以使用高级语言来实现部分运行时系统。例如,Objective Caml有一个称为的函数Obj.magic,具有仅返回其参数的运行时效果,但是在编译时,它将任何类型的值转换为任何其他类型的值。我最喜欢的示例是Modula-3,其设计师将其称为类型转换构造LOOPHOLE

话虽如此,您不能指望任何两个人以完全相同的方式使用“强”和“弱”两个词。所以避免他们。



查看完整回答
反对 回复 2019-11-04
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

简单地说就是这样:在静态类型语言中,类型是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.

静态类型允许在编译时检查类型正确性。通常编译静态类型的语言,并解释动态类型的语言。因此,动态类型的语言可以在运行时检查类型。



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 459 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信