【问题标题】:What are the key aspects of a strongly typed language?强类型语言的关键方面是什么?
【发布时间】:2010-09-12 09:24:31
【问题描述】:

是什么让语言成为强类型的?我正在寻找强类型语言最重要的方面。

昨天我问PowerShell是否是强类型的,但没有人同意“强类型”的定义,所以我想澄清一下这个定义。

请随意链接到维基百科或其他来源,但不要只是剪切和粘贴以获得您的答案。

【问题讨论】:

标签: strong-typing


【解决方案1】:

“强类型”一词没有公认的定义。

它在激烈的争吵中提出了一个“伟大”的论点,因为每当有人被证明是错误的,他们可以重新定义它以表示他们想要的任何意思。除此之外,该术语没有任何实际用途。

最好不要使用该术语,或者,如果您使用它,请先严格定义它。如果您看到其他人使用它,请让他定义该术语。

每个人都有自己的定义。我见过的一些是:

  • 强类型 = 静态类型
  • 强类型 = 显式类型
  • 强类型 = 名义上的类型
  • 强类型 = 类型
  • 强类型化 = 没有隐式类型转换,只有显式类型转换
  • 强类型 = 根本没有类型转换
  • 强类型 = 我能理解 / 弱类型 = 我不明白
  • 强类型 = C++ / 弱类型 = 其他所有内容
  • 强类型 = Java / 弱类型 = 其他所有内容
  • 强类型 = .NET / 弱类型 = 其他所有内容
  • 强类型=我的编程语言/弱类型=你的编程语言

在类型理论中,存在一种类型系统比另一种类型系统更强的概念。特别是,如果存在表达式e1,它被类型系统T1 接受,但被类型系统T2 拒绝,那么T2 被称为更强T1。这里有两点需要注意:

  1. 这是比较的,不是绝对的:没有strongweak,只有strongerweaker
  2. 该术语没有暗示任何价值; 更强并不意味着更好

【讨论】:

  • 我绝对不是拖钓,只是想澄清一下这个词。
  • 对不起,我不是故意的。我的意思是“你”在“一些未定义的群体”中。我将编辑我的答案的那部分。再次,请原谅我的误解,英语不是我的第一语言。
  • 另一种方法应该是;强类型 = 女性 / 弱类型 = 男性,反之亦然 :)
【解决方案2】:

根据 B.C. Pierce,写了《类型和编程语言》和《高级类型和编程语言》的人:

我花了几个星期试图解决 “强类型”的术语 “静态类型”、“安全”等,以及 发现它非常困难...... 这些术语的用法多种多样 使它们几乎无用。

所以难怪你的同事为什么不同意。

我会选择最简单的答案:如果你可以在不强制转换的情况下连接一个字符串和一个 int,那么它就不是强类型的。

编辑:如 cmets 中所述,Java 就是这样做的 :-(

【讨论】:

  • 到目前为止,你是强类型和非强类型的最佳示例。
  • 您的意思是“那么它不是强类型”吗?因为自动变量强制转换不是我在任何强类型语言中看到的功能。
  • 关键是这个词没用,你说得很好。但是然后你继续提供一些定义。不用说,我们可以找到您的示例不正确的 some 定义。这是一个:强类型语言没有未定义的转换。当存在像您描述的隐式转换时,转换 定义良好(至少在 Perl 或 PHP 中,我认为您指的是)。否则你的答案很好,所以我会删除你的“最简单的答案”。一点都不简单。
  • 哈哈。我猜你是对的。在那个领域我无法击败皮尔斯 :-) 但我确信我做的提拉米苏斯比他做得更好。
  • 哎哟。我获得声誉的邪恶计划正在落空。
【解决方案3】:

关键是要记住静态类型和强类型之间是有区别的。强类型语言只是意味着一旦分配,给定变量将始终表现为某种类型,直到重新分配。根据定义,Java 和 C# 等静态类型语言是强类型的,但 Ruby 和 Python 等许多流行的动态语言也是如此。

所以在强类型语言中

x = "5"

x 永远是一个字符串,永远不会是一个整数。

在某些弱类型语言中,您可以执行类似的操作

x = "5"
y = x + 3
// y is now 8

【讨论】:

  • C 可以说是静态的弱类型。这很奇怪,但有可能。
【解决方案4】:

人们将静态类型与强类型混淆。静态类型意味着“字符串是字符串是字符串”。强类型意味着“一旦你把它变成一个字符串,它将被视为一个字符串,直到它被重新分配为不同的东西。”

编辑:毕竟我看到其他人确实指出了这一点:)

【讨论】:

    【解决方案5】:

    我在一次采访中听到有人说(我认为是 C# 的 Anders Hejlsberg 和 turbo pascal 的名声)强类型不是打开或关闭的东西,有些语言比其他语言具有更强大的类型系统。

    在强类型、弱类型、静态类型和动态类型之间也存在很多混淆,其中静态类型语言为变量分配类型,而动态语言为存储在变量中的对象分配类型。

    尝试 wikipedia 了解更多信息,但不要指望一个结论性的答案: http://en.wikipedia.org/wiki/Strongly_typed_language

    【讨论】:

      【解决方案6】:

      强类型意味着您声明了某种类型的变量,如果您尝试将该变量转换为另一种类型而不强制转换它,您的编译器将抛出一个乱码。

      示例(Java 记住你):

      int i = 4;
      char s = i; // Type mismatch: cannot convert from int to char
      

      【讨论】:

      • 只有在静态类型的情况下我们才是“编译器”。在强动态类型的情况下,运行时将抛出异常/错误/无论如何。另见artima.com/weblogs/viewpost.jsp?thread=7590
      • 这是错误的。是否声明类型与强类型无关,这是显式与隐式类型的问题。此外,编译器或运行时是否捕获类型错误是静态与动态类型的问题,并且再次与强类型无关。
      【解决方案7】:

      “强类型”一词完全没有意义。它没有任何意义,而且从来没有。即使一些声称的定义是准确的,我认为区分的原因没有任何意义;为什么了解、讨论或辩论一种语言是否是强类型(无论这意味着什么)很重要?

      这与术语“Web 2.0”或“OEM”非常相似,它们也没有实际意义。

      有趣的是,这些短语是如何开始的,并在日常交流中扎根。

      【讨论】:

      • 如果你真的说“静态类型”,我会同意你的看法,除了最弱的脚本语言之外的所有代码都是强类型的。
      • 讨论静态与动态类型、类型安全与不安全、显式与隐式类型(类型推断)等等是有意义的。只是“强类型”是不明确的。
      【解决方案8】:

      静态类型语言是一种需要先声明变量才能使用的语言。而动态类型语言是一种可以随时使用变量的语言,即使它们没有被声明。唯一的条件是必须先初始化它们才能使用。

      现在,让我们来看看强类型语言。在这样的语言中,变量具有类型,并且它们将始终是该类型。它们不能分配给其他类型的值。而弱类型语言是一种变量没有类型的语言。可以为它们分配任何类型的值。

      示例: Java 是一种静态类型 以及强类型语言。它是静态类型的,因为必须先声明变量才能使用它们。它是强类型的,因为特定类型的变量int 将始终保存整数值。您不能将boolean 分配给他们。

      Powershell 是一种动态类型以及弱类型语言。它是动态类型的,因为变量在使用之前不需要声明。它是弱类型的,因为变量可能在某个时间点保持一种类型的值,而在不同的时间点保持另一种类型的值。

      【讨论】:

        猜你喜欢
        • 2015-08-15
        • 2011-02-11
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 2021-02-19
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多