想必很多人都搞不清楚强类型、弱类型、静态类型、动态类型这些概念,网上很多博客的说法都不太准确。 下面的图表清楚地划分了这些概念,从图上看,静态类型、动态类型大家应该明白其实是指的type sound check发生的时机。而强类型、弱类型到底是什么意思呢?其实这些词语本身概念就是模糊不清的,反正我是能避免使用就尽量避免使用。 《Programming Language:Application and Interpretation》
So what is “strong typing”? This appears to be a meaningless phrase, and people often use it in a non- sensical fashion. To some it seems to mean “The language has a type checker”. To others it means “The language is sound” (that is, the type checker and run-time system are related). To most, it seems to just mean, “A language like Pascal, C or Java, related in a way I can’t quite make precise”. If someone uses this phrase, be sure to ask them to define it for you. (For amusement, watch them squirm.)
@alsotang 我觉得他的区分还是不够简明易懂,而且我看到这种定义已经让评论里的一些人产生了误解,比如:
- 如果在编译时拒绝ill behaved程序,则是statically typed;
- 如果一种语言的所有程序都是well behaved,则该语言为strongly typed。
有人推理认为,所有statically typed都一定是strongly typed,或者weakly typed不可能是statically typed,因为它可能出现forbidden behaviors。
这里的问题在于:在编译时拒绝(不是全部)ill behaved是编译器的行为,并不是说:ill behaved程序 不属于 该程序语言子集,不是概念上的定义。所以这种定义还是不易理解,事实上可以这么说,并不存在statically typed
,只有statically checked
,因为它不是语言固有属性,而是编译期的行为,搞清这点就不会产生误解了。
可能仍然还是有人会产生一些误解,比如说statically typed
不是语言固有属性,那C\C++、Java的类型声明又怎么解释呢?那叫“Explicitly Typed”,类型是语言语法的一部分,但是静态检查还是运行期检查还是根本不检查,那就是编译器的行为了,比如PHP有Type Hint,看上去就像Explicitly Typed,但它是运行到那行代码才检查,仍然不是statically checked
。
PS: CNodeJS 提交时太卡了,我提交一次要等近一分钟才返回