我听到很多新的编程语言是动态类型的,但是当我们说一种语言是动态类型还是静态类型时,这实际上意味着什么呢?
如果在编译时知道变量的类型,则将使用静态类型的语言。对于某些语言,这意味着你作为程序员必须指定每个变量的类型(例如:Java,C,C ++);其他语言提供某种形式的类型推断,即类型系统推断变量类型的能力(例如:OCaml,Haskell,Scala,Kotlin)
这里的主要优点是编译器可以完成所有类型的检查,因此在很早的阶段就捕获了许多琐碎的错误。
示例:C,C ++,Java,Rust,Go,Scala
如果一种语言与运行时值关联,而不是命名为变量/字段/等,则该语言是动态类型的。这意味着作为程序员,你可以更快地编写代码,因为你不必每次都指定类型(除非使用带有类型推断的静态类型语言)。
示例:Perl,Ruby,Python,PHP,JavaScript
大多数脚本语言都具有此功能,因为仍然没有编译器执行静态类型检查,但是你可能会发现自己正在寻找由于解释器错误解释变量类型而导致的错误。幸运的是,脚本通常很小,因此错误没有太多隐藏的地方。
大多数动态类型化语言的确允许你提供类型信息,但并不要求提供此类信息。目前正在开发的一种语言Rascal采用了一种混合方法,该方法允许在函数内进行动态键入,但对函数签名强制执行静态键入。
@NomeN您能命名任何实现HM类型推断的动态类型语言吗?
“如果在运行时解释了变量的类型,则动态地输入一种语言”:否。如果该类型与运行时值(而不是变量/字段/等)相关联,则可以动态地输入一种语言。
不正确的静态类型化意味着“参考值明显受到(它在编译时并不相同)对其可以表示的值的类型的限制,并且语言实现(无论是编译器还是解释器)都受到限制,两者都尽可能实施和使用这些约束。” 引用自c2.com/cgi/wiki?StaticTyping,据我所知,这是正确的。
关于Java,C,C ++,Pascal和许多其他广泛使用的“行业”语言的类型系统,最明显的地方不是它们是静态类型的,而是它们是显式类型的。换句话说,它们需要大量的类型声明。(在使用较少显式类型的语言的世界中,这些声明是可选的,它们通常称为“类型注释”。)这与静态类型无关。继续..
第一种静态类型化的语言是根据需要显式地进行类型化的。但是,类型推断算法已经存在很多年了,这些技术用于查看根本没有类型声明的源代码,并确定其变量的类型。使用它的ML语言。经过改进的Haskell现在已有15年的历史了。甚至C#现在都采用了这种想法,这会引起很多人的注意,并且无疑会引起人们对其“弱类型”的说法。继续...