gpt4 book ai didi

type-safety - 强类型语言和静态类型语言有什么区别?

转载 作者:行者123 更新时间:2023-12-03 03:56:37 28 4
gpt4 key购买 nike

另外,一个是否意味着另一个?

最佳答案

What is the difference between a strongly typed language and a statically typed language?



静态类型语言具有在编译时由实现(编译器或解释器)检查的类型系统。类型检查会拒绝一些程序,通过检查的程序通常带有一些保证;例如,编译器保证不对浮点数使用整数算术指令。

关于“强类型”的含义并没有真正达成一致,尽管专业文献中最广泛使用的定义是在“强类型”语言中,程序员不可能解决类型系统强加的限制.这个术语几乎总是用来描述静态类型语言。

静态 vs 动态

与静态类型相反的是“动态类型”,这意味着
  • 运行时使用的值按类型分类。
  • 如何使用这些值是有限制的。
  • 当违反这些限制时,违规将报告为(动态)类型错误。

  • 例如, Lua是一种动态类型语言,有字符串类型、数字类型和 bool 类型等。在 Lua 中,每个值都只属于一种类型,但这并不是所有动态类型语言的要求。在 Lua 中,允许连接两个字符串,但不允许连接一个字符串和一个 bool 值。

    强对弱

    “强类型”的反面是“弱类型”,这意味着您可以绕过类型系统。 C 是众所周知的弱类型,因为任何指针类型都可以通过强制转换转换为任何其他指针类型。 Pascal 旨在强类型,但设计中的疏忽(未标记的变体记录)在类型系统中引入了漏洞,因此从技术上讲,它是弱类型的。
    真正强类型语言的示例包括 CLU、标准 ML 和 Haskell。标准机器学习实际上已经进行了多次修订,以消除在该语言广泛部署后发现的类型系统中的漏洞。

    这里到底发生了什么?

    总的来说,谈论“强”和“弱”并没有那么有用。一个类型系统是否有漏洞并不重要,重要的是漏洞的确切数量和性质,它们在实践中出现的可能性有多大,以及利用漏洞的后果是什么。在实践中, 最好完全避免使用“强”和“弱”这两个词 , 因为
  • 业余爱好者经常将它们与“静态”和“动态”混为一谈。
  • 显然,有些人使用“弱类型”来谈论隐式转换的相对流行或不存在。
  • 专业人士无法就这些术语的确切含义达成一致。
  • 总体而言,您不太可能通知或启发您的听众。

  • 可悲的事实是,当谈到类型系统时, “强”和“弱”在技术上没有普遍认同的含义。 如果您想讨论类型系统的相对强度,最好准确讨论提供和不提供哪些保证。
    例如,要问的一个好问题是:“是否保证给定类型(或类)的每个值都是通过调用该类型的构造函数之一创建的?”在 C 中,答案是否定的。在 CLU、F# 和 Haskell 中是肯定的。对于 C++,我不确定——我想知道。

    相比之下,静态类型意味着在执行之前检查程序,并且程序可能在启动之前被拒绝。动态类型意味着在执行期间检查值的类型,错误类型的操作可能会导致程序在运行时停止或以其他方式发出错误信号。静态类型的一个主要原因是排除可能具有此类“动态类型错误”的程序。

    Does one imply the other?



    在迂腐的层面上,不,因为“强”这个词并不真正意味着什么。但在实践中,人们几乎总是做以下两件事之一:
  • 他们(错误地)使用“强”和“弱”来表示“静态”和“动态”,在这种情况下,他们(错误地)交替使用“强类型”和“静态类型”。
  • 他们使用“强”和“弱”来比较静态类型系统的属性。很少听到有人谈论“强”或“弱”动态类型系统。除了 FORTH,它实际上没有任何类型的类型系统,我想不出一种可以颠覆类型系统的动态类型语言。根据定义,这些检查被构建到执行引擎中,并且每个操作在执行之前都会进行完整性检查。

  • 无论哪种方式,如果一个人称一种语言为“强类型”,那么这个人很可能在谈论一种静态类型的语言。

    关于type-safety - 强类型语言和静态类型语言有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690544/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com