强类型、若类型语言 & 动态类型、静态类型语言
动态、静态语言
类型检查 时验证类型数据以及赋值是否合乎类型要求的一个过程,自然的方式认为类型检查就是查看 “变量” 和它们的类型,然后判断表达式是否合理。当编译器或解释器在编译阶段做类型检查还是在运行阶段做类型检查来定义编程语言是动态类型或静态类型。
如果编程语言的类型检查发生在 “编译阶段”(Compile Time),则被定义为 “静态类型语言” (Statically Typed Languages)。
常见的静态类型语言包括:
- Java
- C
- C++
- C#
- Go
- Swift
静态语言可以分为两种:
- 显示类型:类型是语言语法中定义
- 隐式类型:类型通过编译时推导
如果编程语言的类型检查发生在 “运行阶段”(Run Time),则被定义为 “动态类型语言” (Dynamically Typed Languages)。
常见的动态类型语言包括:
- Python
- JavaScript
- PHP
- Objective-C
强类型、弱类型语言
强类型和弱类型主要是站在变量类型处理的角度进行分类的。这些概念未经过严格定义,它们并不是属于语言本身固有的属性,而是编译器或解释器的行为。主要用以描述编程语言对于混入不同数据类型的值进行运算时的处理方式。
强类型语言是指无论在编译阶段还是运行阶段,一旦变量绑定某种类型后,此变量会持有该类型,并且不能与其他类型表达式进行混合运算。弱类型则相反。
强类型不允许变量类型转换,弱类型则允许类型转换。无论是显式类型转换还是隐式类型转换。
常见强类型语言包括:
- Java
- Python
- C#
- Go
- Swift
常见弱类型语言包括:
- C
- C++
- PHP
- JavaScript
“强类型” 的一些要素:(引用自 强弱类型)
静态类型不同于动态类型。在静态类型系统中,类型是与变量相连系的名称(通常是在声明时),而不是值(通常是在初始化时)。类型也可借由编译器来推断。
通过语言定义,对类型约束违规的编译时间检查的托管要求。就是说,编译器确保操作只发生在对这个运算有效的操作数上。
类型安全;就是说,拒绝(在要么编译时间要么运行时间)尝试忽视数据类型的操作或函数调用。在更严格的设置下,通过证明进行性和藏存性来证明关于形式语言的类型安全。
禁止类型转换。某个类型的值,不论是不是以显式或隐式的方式,都不可转换为另一个类型。
但是某些作者,把“强类型语言”称呼保留给省略隐式类型转换(就是说编译器为了利益编程者而插入的转换)的语言。对于这些作者,编程语言是强类型的,如果类型必须通过通常叫做“强制”的显式符号来转换。
无法规避类型系统。某些语言允许程序员获取值的表示法之下的东西(即位模式),这有可能规避类型系统。
有复合类型的复杂而细致的类型系统。
数据对象中固定且不变的类型。给定数据对象的类型在这个对象的生命期内不改变。例如,类实例不可以改变它们的类。
在运行程序之前,强类型就保证了运行时期的程序行为,其以静态分析或其它的机制提供。