静态类型语言和动态类型语言有什么区别?

我听到很多新的编程语言是动态类型的,但当我们说一种语言是动态类型还是静态类型时,它实际上意味着什么?


静态类型语言

如果在编译时已知变量的类型,则语言是静态类型的。 对于某些语言来说,这意味着你作为程序员必须指定每个变量的类型(例如:Java,C,C ++); 其他语言提供某种形式的类型推断,类型系统能够推导变量的类型(例如:OCaml,Haskell,Scala,Kotlin)

这里的主要优点是可以通过编译器进行各种检查,因此在很早的阶段就会发现很多微不足道的错误。

动态类型的语言

如果类型与运行时间值相关联,而不是命名变量/字段/等,则语言是动态类型的。 这意味着你作为一个程序员可以写得更快一些,因为你不必每次都指定类型(除非使用带有类型推断的静态类型语言)。 例如:Perl,Ruby,Python

大多数脚本语言都具有此功能,因为无论如何都没有编译器来进行静态类型检查,但是您可能会发现自己正在寻找由于解释器错误地解释变量类型而导致的错误。 幸运的是,脚本通常很小,所以错误没有太多地方可以隐藏。

大多数动态类型语言允许您提供类型信息,但不需要它。 目前正在开发的一种语言Rascal采用了一种混合方法,允许在函数内动态键入,但对函数签名实施静态类型化。


静态类型编程语言在编译时进行类型检查(验证和强制实现类型约束的过程),而不是运行时。

动态类型编程语言在运行时进行类型检查,而不是编译时。


下面是一个对比Python(动态类型)和Go(静态类型)如何处理类型错误的例子:

def silly(a):
    if a > 0:
        print 'Hi'
    else:
        print 5 + '3'

Python在运行时会进行类型检查,因此:

silly(2)

运行完美,并产生预期的输出Hi 。 错误仅在遇到有问题的行时触发:

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)
链接地址: http://www.djcxy.com/p/12537.html

上一篇: What is the difference between statically typed and dynamically typed languages?

下一篇: Language Books/Tutorials for popular languages