2024-04-25 22:26:42 发布
网友
如果在编译时变量的类型是已知的,则语言是静态类型的。对于某些语言,这意味着程序员必须指定每个变量是什么类型(例如:java、C++、C++);其他语言提供某种形式的类型推断,类型系统推断变量类型的能力(例如:OcAML、Haskell、斯卡拉、Kotlin)
这里的主要优点是编译器可以完成所有类型的检查,因此在很早的阶段就捕获了很多小错误。
如果类型与运行时值关联,而不是命名变量/字段等,则语言是动态类型的。这意味着您作为程序员可以更快地编写,因为您不必每次都指定类型(除非使用带有类型推断的静态类型语言)。
示例:Perl、Ruby、Python、PHP、JavaScript
大多数脚本语言都有这个特性,因为没有编译器来执行静态类型检查,但是您可能会发现自己在搜索一个错误,这个错误是由于解释器错误地解释了变量的类型。幸运的是,脚本往往很小,所以bug没有那么多地方可以隐藏。
大多数动态类型语言允许您提供类型信息,但不需要它。目前正在开发的一种语言Rascal采用了一种混合方法,允许在函数内动态键入,但强制为函数签名执行静态键入。
下面是一个对比Python(动态类型)和Go(静态类型)如何处理类型错误的示例:
def silly(a): if a > 0: print 'Hi' else: print 5 + '3'
Python在运行时进行类型检查,因此:
silly(2)
运行良好,并生成预期的输出Hi。仅当遇到问题行时才会引发错误:
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)
静态类型编程语言在编译时进行类型检查(即验证和强制类型约束的过程),而不是在运行时进行类型检查。
动态类型编程语言在运行时进行类型检查,而不是在编译时进行类型检查。
静态类型语言的示例如下:- java,C,C+++p/>
动态类型语言的示例如下:- Perl、Ruby、Python、PHP、JavaScript
静态类型语言
如果在编译时变量的类型是已知的,则语言是静态类型的。对于某些语言,这意味着程序员必须指定每个变量是什么类型(例如:java、C++、C++);其他语言提供某种形式的类型推断,类型系统推断变量类型的能力(例如:OcAML、Haskell、斯卡拉、Kotlin)
这里的主要优点是编译器可以完成所有类型的检查,因此在很早的阶段就捕获了很多小错误。
例:C、C++、java、RISE、GO、斯卡拉动态类型语言
如果类型与运行时值关联,而不是命名变量/字段等,则语言是动态类型的。这意味着您作为程序员可以更快地编写,因为您不必每次都指定类型(除非使用带有类型推断的静态类型语言)。
示例:Perl、Ruby、Python、PHP、JavaScript
大多数脚本语言都有这个特性,因为没有编译器来执行静态类型检查,但是您可能会发现自己在搜索一个错误,这个错误是由于解释器错误地解释了变量的类型。幸运的是,脚本往往很小,所以bug没有那么多地方可以隐藏。
大多数动态类型语言允许您提供类型信息,但不需要它。目前正在开发的一种语言Rascal采用了一种混合方法,允许在函数内动态键入,但强制为函数签名执行静态键入。
下面是一个对比Python(动态类型)和Go(静态类型)如何处理类型错误的示例:
Python在运行时进行类型检查,因此:
运行良好,并生成预期的输出
Hi
。仅当遇到问题行时才会引发错误:产生
因为相关的那条线实际上已经被执行了。
另一方面,在编译时进行类型检查:
以上将无法编译,错误如下:
静态类型编程语言在编译时进行类型检查(即验证和强制类型约束的过程),而不是在运行时进行类型检查。
动态类型编程语言在运行时进行类型检查,而不是在编译时进行类型检查。
静态类型语言的示例如下:- java,C,C+++p/>
动态类型语言的示例如下:- Perl、Ruby、Python、PHP、JavaScript
相关问题 更多 >
编程相关推荐