静态类型和动态类型的定义

这两个定义中的哪一个是正确的?

  • 静态类型 - 在编译时检查类型匹配(因此只能应用于编译语言)
  • 动态类型 - 在运行时检查类型匹配,或根本不检查。 (这个术语可以应用于编译或解释语言)

  • 静态类型 - 类型被分配给变量,所以我会说'x是int类型的。
  • 动态类型被分配给值(如果有的话),所以我会说'x持有一个int'
  • 通过这个定义,静态或动态类型与编译或解释语言无关。

    哪一个是正确的,或者哪一个都不正确?


    哪一个是正确的,或者哪一个都不正确?

    第一对定义更接近但不完全正确。

    静态类型 - 在编译时检查类型匹配(因此只能应用于编译语言)

    这很棘手。 我认为如果一个语言被解释,但在执行开始之前进行了类型检查,那么它仍然是静态类型的。 OCaml REPL几乎就是一个例子,除了它在技术上将源代码编译(并键入检查)到自己的字节码中,然后解释字节码。

    动态类型 - 在运行时检查类型匹配,或根本不检查。

    而是:

    动态类型 - 类型检查在运行时完成。

    非类型化 - 类型检查没有完成。

    静态类型 - 类型被分配给变量,所以我会说'x是int类型的。

    动态类型被分配给值(如果有的话),所以我会说'x持有一个int'

    变量无关紧要。 虽然在变量和函数定义中,您只能在许多静态类型语言的源代码中明确地看到类型,但所有子表达式都具有静态类型。 例如, "foo" + 3通常是一个静态类型错误,因为您不能将一个字符串添加到一个int中,但没有涉及变量。


    查看static这个词的一个有用的方法是:静态属性是那些适用于所有可能的输入执行程序的静态属性。 然后,您可以查看任何给定的语言或类型系统,并考虑可以验证哪些静态属性,例如:

  • JavaScript:没有segfaults /内存错误

  • Java / C#/ F#:如果编译的程序和变量的类型为T,那么变量只保存此类型的值 - 在所有执行中。 但是,可悲的是,参考类型也承认null值 - 十亿美元的错误。

  • ML没有null ,使上述保证更强

  • Haskell可以验证关于副作用的语句,例如“此程序不会在stdout上打印任何内容”

  • Coq还验证终止 - “此程序终止于所有输入”

  • 你想验证多少,这取决于品味和手头的问题。 所有的魔法(验证)都是以价格为准。

    如果你以前从未见过ML,那就试一试。 至少给雅伦明斯基的讲话5分钟的注意。 它可以改变你作为程序员的生活。


    第二个是我眼中更好的定义,假设你不是在寻找关于为什么或如何工作的解释。

    再好的就是这么说

  • 静态类型为变量提供了一个无法更改的EXPLICIT类型
  • 动态类型给变量一个可以改变的IMPLICIT类型
  • 链接地址: http://www.djcxy.com/p/72311.html

    上一篇: Definition of statically typed and dynamically types

    下一篇: Is there a compiled* programming language with dynamic, maybe even weak typing?