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

静态/动态与强/弱

静态/动态与强/弱

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

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

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


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



查看完整回答
反对 回复 2019-10-12
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

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

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

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

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


查看完整回答
反对 回复 2019-10-12
?
动漫人物

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.

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


查看完整回答
反对 回复 2019-10-12
  • 3 回答
  • 0 关注
  • 396 浏览

添加回答

举报

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