另外,一个是否意味着另一个?
动态类型语言和静态类型语言有什么区别?
静态类型语言具有在编译时由实现(编译器或解释器)检查的类型系统。类型检查拒绝某些程序,通过检查的程序通常带有一些保证;例如,编译器保证不对浮点数使用整数算术指令。
关于“强类型”的含义并没有真正的一致,尽管专业文献中使用最广泛的定义是,在“强类型”语言中,程序员不可能绕过类型系统施加的限制. 这个术语几乎总是用来描述静态类型语言。
与静态类型相反的是“动态类型”,这意味着
例如,动态类型语言Lua具有字符串类型、数字类型和布尔类型等。 在 Lua 中,每个值都只 属于一种类型,但这并不是所有动态类型语言的要求。在 Lua 中,允许连接两个字符串,但不允许连接一个字符串和一个布尔值。
“强类型”的反义词是“弱类型”,这意味着您可以绕过类型系统。C 是出了名的弱类型,因为任何指针类型都可以简单地通过强制转换转换为任何其他指针类型。Pascal 本来打算是强类型的,但设计中的疏忽(未标记的变体记录)在类型系统中引入了一个漏洞,因此从技术上讲它是弱类型的。真正强类型语言的示例包括 CLU、标准 ML 和 Haskell。事实上,标准 ML 经历了多次修订,以消除在语言广泛部署后发现的类型系统中的漏洞。
总的来说,谈论“强”和“弱”并没有多大用处。类型系统是否存在漏洞并不重要,而是漏洞的确切数量和性质、它们在实践中出现的可能性以及利用漏洞的后果是什么。在实践中, 最好完全避免使用“动”和“静”这两个词 ,因为
业余爱好者经常将它们与“静态”和“动态”混为一谈。
显然,有些人使用“弱类型”来谈论隐式转换的相对普遍性或缺失。
专业人士无法就这些术语的确切含义达成一致。
总体而言,您不太可能告知或启发您的听众。
可悲的事实是,当涉及到类型系统时, “动”和“静”在技术含义上并没有普遍认同。 如果您想讨论类型系统的相对强度,最好准确讨论提供和不提供的保证。例如,一个很好的问题是这样的:“是否保证给定类型(或类)的每个值都是通过调用该类型的构造函数之一创建的?” 在 C 中,答案是否定的。在 CLU、F# 和 Haskell 中是肯定的。对于 C++,我不确定——我想知道。
相比之下, 静态类型 意味着程序 在执行之前会被检查 ,并且程序在启动之前可能会被拒绝。 动态类型 意味着 在 执行过程中检查 值 的类型,并且类型不佳的操作可能会导致程序停止或以其他方式在运行时发出错误信号。静态类型的一个主要原因是排除可能有这种“动态类型错误”的程序。 __
一个是否暗示另一个?
在迂腐的层面上,不,因为“强大”这个词实际上并没有任何意义。但在实践中,人们几乎总是做以下两件事之一:
他们(错误地)使用“强”和“弱”来表示“静态”和“动态”,在这种情况下,他们(错误地)交替使用“强类型”和“静态类型”。
他们使用“动”和“静”来比较静态类型系统的属性。很少听到有人谈论“动”或“静”动态类型系统。除了 FORTH,它实际上没有任何类型的系统,我想不出一种可以颠覆类型系统的动态类型语言。根据定义,这些检查被内置到执行引擎中,并且每个操作在执行之前都会被检查是否正常。
无论哪种方式,如果一个人称一种语言为“动态类型”,那么这个人很可能在谈论一种静态类型的语言。