关于语言类型概念有些乱,想弄清楚这些定义需要先知道一些概念。
1、概念介绍
Program Errors
trapped errors:程序异常,终止执行,如除0,Java中数组越界访问
untrapped errors:出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址
Forbidden Behavious
语言设计是,可以定义一组forbidden behaviors,它必须包括所有untrapped errors,但可能包含trapped errors。
Well behaved 、 ill behaved
well behaved: 如果程序执行不可能出现forbidden behaviors,则为well behaved
ill behaved: 否则为 ill behaved
2、根据概念讨论,强弱类型,静动态类型
强、弱类型
强类型strongly typed:一种语言的所有程序都是well behaved (不出现forbidden behavious)。
弱类型weakly typed: 否则为 weakly typed。如C语言的缓冲区溢出,属于untrapped errors,属于forbidden behavious
静、动态类型
静态类型 statically: 在编译时拒绝ill behaved;
动态乐行 danamiclly: 在运行时拒绝 ill behaved;
3、误区
C语言要写int a,Php 不用写(直接 $a),所以C 是静态,PHP是动态。这么理解太片面。譬如Ocaml是静态类型的,但是可以不用明确写出类型修饰符(属于静态隐式类型)。
静态类型分为:
显示类型explicitly typed,类型是语言语法的一部分。
隐式类型implicity typed,类型通过编译时推导
4、例子
无类型:汇编
弱类型、静态类型:C/C++
弱类型、动态类型检查:PHP/Perl
强类型、静态类型检查:JAVA/C#
强类型、动态类型检查:Python, Scheme
静态显式类型:Java/C
静态隐式类型:Ocaml/Haskell
配个图:
红色区域外:well behaved (type soundness)
红色区域内:ill behaved
如果所有程序都是灰的,strongly typed
否则如果存在红色的程序,weakly typed
编译时排除红色程序,statically typed
运行时排除红色程序,dynamically typed
所有程序都在黄框以外,type safe
最后对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。
参考:zhihu.com/question/19918532