区分方法一:根据对默认类型转换的容忍程度,将编程语言分为强类型与弱类型。
在区分强弱类型之前,需要知晓一个基本概念:
forbidden behaviors: 必须包括所有 untrapped errors(致命的错误,如下标变量的访问越过数组末端的数据), 但可能包含trapped errors(捕获的错误,如非法指令错误、非法内存访问、除数为零)。
根据 forbidden behaviors,可以区分下述概念。
Well behaved | ill behaved |
---|---|
程序执行不可能出现forbidden behaviors | 否则为ill behaved |
再根据 well behaved和ill behaved,可以区分强弱类型。
强类型 | 弱类型 |
---|---|
对默认类型转换的容忍程度低 | 对默认类型转换的容忍程度高 |
语言的所有程序都是well behaved——即不可能出现forbidden behaviors | 否则为weakly typed |
C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors,因此C是弱类型。
弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。
区分方法二:根据类型检查的时间,分为静态类型语言和动态类型语言。
静态类型语言 | 动态类型语言 |
---|---|
如果在编译时拒绝 ill behaved程序,则是statically typed | 如果在运行时拒绝 ill behaviors, 则是dynamiclly typed |
即:编译时进行类型检查的是静态类型语言,运行时进行类型检查的是动态类型语言。
类型 | 例 |
---|---|
无类型 | 汇编 |
弱类型、静态类型 | C/C++ |
弱类型、动态类型检查 | Perl/PHP |
强类型、静态类型检查 | Java/C# |
强类型、动态类型检查 | Python, Scheme |