【问题标题】:Difference between strongly and weakly typed languages?强类型语言和弱类型语言的区别?
【发布时间】:2023-03-11 22:46:01
【问题描述】:

我已经阅读了好几页,包括处理强类型语言和弱类型语言的 wiki 页面 http://en.wikipedia.org/wiki/Strong_and_weak_typing。在大多数情况下,我想我理解其中的区别。但是,我想要一个直截了当的答案来区分两者。

据我了解,在弱类型语言中,不必显式调用数据类型。这将是一种类似于 Matlab 的语言,您可以在其中添加 4 和 2.3 而无需进行类型转换。强类型语言要求程序员为每个变量和/或值声明数据类型。例如,在 C 中,您需要执行类似 4 + (int) 2.3 或 (float)4 + 2.3 的操作(不记得这是否是有效的 C 类型转换)。

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

【问题讨论】:

标签: theory


【解决方案1】:

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

在无类型(评论家认为是“弱类型”,粉丝认为是“动态类型”)语言中,情况并非如此。该语言允许对任何类型执行任何操作,但相当重要的条件是操作可能会失败。也就是说,虽然 语言 可能允许操作,但 运行时 可能不允许。

请注意,可以使用强类型语言而不需要在任何地方进行类型声明。事实上,没有强类型语言可以。考虑一下 Java:

String s = "hellO";
int l = s.getBytes().length;

编译器如何确定.length 在那里合法?这是合法的,因为它被用于byte[]。但是这里没有任何声明为byte[]。相反,编译器知道sString,并且当您在String 上调用getBytes() 时,您会得到byte[]。它从这些事实中推断出s.getBytes() 的类型是byte[],因此请求它的length 是合法的。

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

val s = "hello"
val l = s.getBytes().length

并且编译器会推断出sl的类型,以及中间表达式的类型。

具有强类型化但需要冗余类型声明(如 Java)的类型推断人为限制的语言被描述为具有 清单类型,因为必须使类型显化,这是一种奇特的方式明确提出的说法,这是一种写下来的奇特说法。

【讨论】:

  • 强/弱类型与静态/动态类型正交。例如,Ruby 类型系统是强大且动态的。
  • '对于评论家来说是“弱类型”,对于粉丝来说是“动态类型”——这些是完全不同的东西。 “佩斯 Eric Lippert,我认为这个词的定义相当明确”——这颇具讽刺意味,因为几乎没有人同意你的定义,这显然是非标准的。
【解决方案2】:

查看 Eric Lippert 的博客。有一条关于您正在寻找的内容的条目here

从他的博客来看,这些术语是主观的,所以“更准确地谈论类型系统功能。”

【讨论】:

    【解决方案3】:

    如你所说... ...在弱类型语言中,不必显式调用数据类型。

    强类型语言要求程序员为每个变量和/或值声明一个数据类型。

    这是正确的......

    在所谓的“强”类型语言(如 c#)中也有一种范式,如果程序员需要或需要,可以在其中声明类型......例如C# 具有“var”类型,但也具有许多使用该语言的程序员喜欢的强类型(Int32、String、Boolean 等)。

    通过这种方式,一种语言既可以是“强”类型,也可以是“弱”类型。

    我希望这有助于您进一步理解这个概念...

    【讨论】:

    • 请注意,C# 中的 var 维护变量的“字符串”类型。类型名称是
    • 你误会了var,它不是类型。 C# 是一种具有类型推断的强类型语言。
    猜你喜欢
    • 2011-02-11
    • 2016-05-10
    • 2013-02-03
    • 2016-09-26
    • 2018-08-05
    • 2011-09-12
    • 2014-02-03
    相关资源
    最近更新 更多