什么是类型安全?
在计算机科学中,⼀部分编程语⾔具备类型安全的性质。这个术语在不同的社群中有不同的定义,特别是正规的类型理论上的定义远远强过⼤多数的程序员的理解,但对于使⽤类型系统的认知,皆旨在避免必然的错误形式,和不良的程序⾏为(称为类型错误)。
类型安全可以静态⽅式实施,及早在编译时期就捕捉到潜藏的错误;或者以动态⽅式,在运⾏时期观察类型的信息,并在必要时检测即将发⽣的错误。类型安全是编程语⾔的性质,而不是程序所⾃有的。
某个⾏为之所以会被编程语⾔归类为类型错误,通常是因为试图对不适当类型的值进⾏运算。其分类的基本原则是:部分语⾔设计者和程序员的看法认为,如果所有运算不引起程序⽡解、安全上的瑕疵、或其它明显故障,即为合理的,而不视之为⼀个错误;其他⼈则认为所有违背程序员意图的,就是错误的,而且应该标上“不安全”。
依据类型安全划分语言
1 先定义一些概念
Program Errors
- trapped errors:导致程序终止执行,如除0,Java中数组越界访问
- untrapped errors:出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址
Forbidden Behaviours
- 语言设计时,可以定义一组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 behaviors,则该语言为strongly typed。
弱类型weakly typed:
- 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors…故C是弱类型
弱类型语言常有特点为类型检查不严格,即容忍隐式的类型转换,如C语法中不同类型的变量可以不经过隐式类型转换即使用,这样容易产生如缓冲区溢出这样的untrapped errors。
3 静态类型、动态类型
静态类型 statically:
- 如果在编译时拒绝ill behaved程序,则是statically typed;
- 静态类型可以分为两种:
如果类型是语言语法的一部分,在是explicitly typed显式类型;
如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskel
动态类型dynamiclly:
- 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。
可视化解释
红色区域外:well behaved (type soundness)
红色区域内:ill behaved
如果所有程序都是灰的,strongly typed
否则如果存在红色的程序,weakly typed
编译时排除红色程序,statically typed
运行时排除红色程序,dynamically typed
所有程序都在黄框以外,type safe
例子
Reference: