Programming languages 静态类型语言和动态类型语言之间有什么区别?

Programming languages 静态类型语言和动态类型语言之间有什么区别?,programming-languages,computer-science,static-typing,dynamic-typing,Programming Languages,Computer Science,Static Typing,Dynamic Typing,我听说很多新的编程语言都是动态类型的,但是当我们说一种语言是动态类型的,而不是静态类型的时候,这到底意味着什么呢 静态键入 据说是一种编程语言 进行类型检查时的静态类型 在编译时执行,如下所示 与运行时相反。在静态类型中, 类型与变量相关联 不是价值观。静态类型语言 包括艾达、C、C++、C、玉、java、 Fortran、Haskell、ML、Pascal、Perl (关于区分 标量、数组、哈希和 子程序)和Scala。静态类型 是一种有限形式的程序 验证(见类型安全): 相应地,它允许多种类

我听说很多新的编程语言都是动态类型的,但是当我们说一种语言是动态类型的,而不是静态类型的时候,这到底意味着什么呢

静态键入

据说是一种编程语言 进行类型检查时的静态类型 在编译时执行,如下所示 与运行时相反。在静态类型中, 类型与变量相关联 不是价值观。静态类型语言 包括艾达、C、C++、C、玉、java、 Fortran、Haskell、ML、Pascal、Perl (关于区分 标量、数组、哈希和 子程序)和Scala。静态类型 是一种有限形式的程序 验证(见类型安全): 相应地,它允许多种类型 要在测试早期捕获的错误 开发周期。静态类型 checker只评估类型 可在以下位置确定的信息: 编译时,但能够验证 所检查的条件适用于 所有可能的死刑执行 程序,从而无需 每次启动时重复类型检查 程序被执行。程序执行 也可以提高效率(即。 更快或占用更少的内存) 省略运行时类型检查和 启用其他优化

因为它们评估类型信息 在编译过程中,因此缺少 键入仅为 在运行时可用,静态类型 跳棋是保守的。他们将 拒绝某些可能被删除的程序 在运行时表现良好,但是 无法静态确定为 打字很好。例如,即使 表情总是 在运行时计算为true,则 包含代码的程序

if <complex test> then 42 else <type error>
if then 42 else
将被拒绝为输入错误,因为 静态分析无法确定 else分公司不会 采取[1]保守的行为 静态类型检查器的 有利的时候 很少计算为false:A 静态类型检查器可以检测类型 很少使用的代码路径中的错误。 没有静态类型检查,甚至 100%代码覆盖率测试 保险公司可能找不到这样的保险 类型错误。代码覆盖率测试可能会失败 未能检测到此类类型错误 因为所有地方的结合 创建值的位置以及所有 使用特定值的位置 必须考虑到这一点

最广泛使用的静态类型 语言在形式上不是类型安全的。 他们在法律上有“漏洞” 程序设计语言规范 使程序员能够编写代码 这绕过了核查 由静态类型检查器和 因此,解决更广泛的问题。 例如,Java和大多数C风格 语言有类型双关,和 Haskell具有以下特性: 不安全性能:此类操作可能 在运行时是不安全的,因为它们可能 由于以下原因导致不必要的行为: 当 程序运行

动态键入

一种编程语言被称为 动态类型,或只是“动态”, 当它的类型检查的大多数 在运行时执行,而不是 在编译时。在动态类型中, 类型与值不关联 变量。动态类型语言 包括Groovy、JavaScript、Lisp、Lua、, Objective-C,Perl(关于 用户定义的类型,但不是内置类型 类型)、PHP、Prolog、Python、Ruby、, Smalltalk和Tcl。与静态相比 键入,动态键入可以更方便 灵活(例如,允许程序 根据需要生成类型和功能 在运行时数据上),但在 减少先验保证的代价。 这是因为一个动态类型的 语言接受并试图 执行一些程序,这些程序可能是 被静态类型裁定为无效 检查者

动态类型可能导致运行时错误 键入错误,即在运行时 值可能具有意外类型,并且 对那种人来说,手术是荒谬的 应用。此操作可能会发生 很久以前 编程错误就是, 存储错误类型数据的位置 进入了一个不该进入的地方 有。这使得这个bug很难识别 定位

动态类型语言系统, 与它们的静态类型相比 堂兄弟,减少“编译时间” 检查源代码(但将 例如,检查程序 语法正确)。运行时 检查可能会更加复杂 复杂,因为他们可以使用 动态信息以及任何 过程中出现的信息 汇编另一方面 运行时检查仅断言 某一特定领域的条件 程序的执行,以及 每次检查都会重复进行 程序的执行

动态类型数据库的开发 语言通常由 编程实践,例如unit 测试。测试是一项重要的实践 专业软件开发,以及 尤其是在 动态类型语言。在里面 实践中,所做的测试是为了确保 正确的程序操作可以检测到错误 误差范围比静态误差大得多 类型检查,但反过来不能 尽可能全面地搜索 测试和静态都会导致错误 类型检查能够检测到。 可以将测试合并到 软件构建周期,在这种情况下 可以被认为是“编译时” 检查,程序用户将 不必手动运行此类测试

参考资料

  • 皮尔斯,本杰明(2002)。类型和编程语言。麻省理工学院出版社。 ISBN 0-262-16209-1
  • 静态键入

    据说是一种编程语言 进行类型检查时的静态类型 在编译时执行,如下所示 与运行时相反。在静态类型中, 类型与变量相关联 不是价值观。静态类型语言 包括艾达、C、C++、C、玉、java、 Fortran、Haskell、ML、Pascal、Perl (关于区分 标量、数组、哈希和 子程序)和Scala。静态类型 是一种有限形式的程序 验证(见类型安全): 相应地,它允许多种类型 将要发生的错误
    def silly(a):
        if a > 0:
            print 'Hi'
        else:
            print 5 + '3'
    
    silly(2)
    
    silly(-1)
    
    TypeError: unsupported operand type(s) for +: 'int' and 'str'
    
    package main
    
    import ("fmt"
    )
    
    func silly(a int) {
        if (a > 0) {
            fmt.Println("Hi")
        } else {
            fmt.Println("3" + 5)
        }
    }
    
    func main() {
        silly(2)
    }
    
    invalid operation: "3" + 5 (mismatched types string and int)
    
    String str = "Hello";  //variable str statically typed as string
    str = 5;               //would throw an error since str is supposed to be a string only
    
    str = "Hello" # variable str is linked to a string value
    str = 5       # now it is linked to an integer value; perfectly OK
    
    def silly(a):
        if a > 0:
            print 'Hi'
        else:
            print 5 + '3'
    
    silly(2)
    
    package main
    
    import ("fmt"
    )
    
    func silly(a int) {
      if (a > 0) {
          fmt.Println("Hi")
      } else {
          fmt.Println("3" + 5)
      }
    }
    
    func main() {
      silly(2)
    }
    
    num = 2
    num = '3' // ERROR