Static Typing, Dynamic Typing, Strong Typing, Weak Typing的异同
本文主要讲在各编程语言下Static Typing, Dynamic Typing, Strong Typing, Weak Typing等语法的异同。
Static Typing
如果一个程序语言中的每个变量类型在编译时期就完全决定好,我们称这个程序语言属于static type。这类的程序语言在使用变量时通常都需要先声明变量,编译器会在编译时期去做type checking。比如说Java, C, C++, C#。以下是一段C的范例:
- int num, sum; // explicit declaration
- num = 5; // now use the variables
- sum = 10;
- sum = sum + num;
变量使用前需要声明是static type的特征之一
Dynamic Typing
Dynamic type和static type相反,一个属于dynamic type的程序语言不需要声明变量,因此编译器无法对类型做检查在编译时找出类型上的错误。在执行期间存取变量时,会通过适当的机制来判断此变量可能的类型。Dynamic type不需要事先声明变量就能直接使用,比如说Python, PHP, Ruby, Perl。以下是一段Python的范例程序:
- sum = 1 // directly using the variable
- sum += 2
上面的范例我们直接使用变量sum而没有事先声明,这是dynamic type的其中一个特征。 简单来说,Static typing会在编译时去做type checking。而dynamic type会在run-time时做check。
Strong Typing
Strong typing很常会和static typing以及dynamic typing搞混。Strong typing是指变量会被绑定到某个类型,除非经过明显的类型转换,不然类型不会任意改变。比如说Python就是strong typing,以下是个范例:
- >>> x = 3
- >>> y = '4'
- >>> print(x+y)
- Traceback (most recent call last):
- File "", line 1, in
- TypeError: unsupported operand type(s) for +: 'int' and 'str'
Python不允许int和string相加,除非我们主动去做类型转换,不然x和y变量不会经过隐藏的类型转换加在一起。这就是Strong typing的主要特征。Python是dynamic typing同时也是strong typing
Weak Typing
Weak typing是指类型的概念比较弱,变量的类型可能随时会经过隐性的转换。比如说JavaScript,以下是JavaScript的范例:
- var x = 3
- var y = '4'
- alert(x + y) //Produces "34"
不同于Python,JavaScript允许这种语法并且会自动帮你做类型转换。这就是weak typing的特征之一。
Strong Typing v.s. Weak Typing
其实这两者并没有一个约定成俗的定义,很多程序语言都同时有两种的特性。只能说偏向某一边比较多。比如说C,大部分人认为C偏向Weak Typing,因为C有pointer可以做任意转型,同时也有void *这种变量可存取任意类型。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
