网上关于类型的概念貌似十分得模糊,众说纷纭。也有大神说类型是没有定义的,静态和动态类型的概念本身就是不存在。下面只是整理一些网上主流的概念和些许自己的理解。
首先介绍一些概念
1、Program Errors
trapped errors。 可以被程序捕获的错误,程序捕获会终止运行。如除0操作,Java中数组越界等。
untrapped errors。出错后,程序无法知晓,会继续运行,直到程序运行异常。如指针访问错误内存地址等。
2、Forbidden Behavious
Forbidden Behavious是一个集合,包括所有的untrapped errors和部分的trapped errors。
3、Well behaved, ill behaved
well behaved。 如果程序执行是不会出现forbideend behavious,则为 wall behaved。
否则为ill behaved。
强类型与弱类型
强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。例如java限制了用户对指针的使用,从而限制对内存地址的直接操控。
弱类型weakly typed:如果一个语言的程序会出现forbidden behavious,则该语言为弱类型。例如c/c++的非法指针操作,只有程序去访问该地址时才会发现不对头。
网上还有一种说法是依据是否容忍隐式类型转换来区别强弱类型。其实2者的意思其实差不多。因为隐式类型的转换会带来forbidden behavious的风险。所以像容忍隐式类型转换的c/c++更容易发生untrapped errors,所以他们是弱类型语言。
动态类型和静态类型
动态和静态类型存在许多定义的争议。我更倾向于按照在编译阶段还是运行阶段进行代码检查来对他们进行区分。
静态类型(静态检查 statically checked)在编译期进行代码和数据类型检查。比如c/c++,java。
动态类型(非静态检查 not statically checked)在运行时进行代码和数据类型检查。比如python。
最后,关于语言的类型并没有太明确的定义。大家并没有必要深究把他们分类,而是应该去理解每个语言的自身特性。