Python|python到底是强类型语言,还是弱类型语言?( 二 )



前面几位编程语言之父应该就是持有类似的观念 。
不过 , 大佬们也意识到了当时的“强弱类型”概念并不充分准确 , 所以 Dennis Ritchie 才会说成“强类型但是弱检查” , 而且在访谈中 , Guido 也特别强调了 Python 不应该被称为弱类型 , 而应该说是运行时类型(runtime typing) 。
但是在那个早期年代 , 基本上强弱类型就等同于动静类型 , 而这样的想法至今仍在影响着很多人 。
3、现在的强弱类型概念
早期对于编程语言的分类其实是混杂了动静与强弱两个维度 , 但是 , 它们并不是一一对应重合的关系 , 并不足以表达编程语言间的区别 , 因此就需要有更为明确/丰富的定义 。
有人提出了“type safety”、“memory safety”等区分维度 , 也出现了静态检查类型和动态检查类型 , 与强弱类型存在一定的交集 。
直到出现 2004 年的一篇集大成的学术论文《Type Systems》(出自微软研究院 , 作者 Luca Cardelli) , 专门研究编程语言的不同类型系统:
论文中对于强弱检查(也即强弱类型)有一个简短的归纳如下:
Strongly checked language: A language where no forbidden errors can occur at run time (depending on the definition of forbidden error).Weakly checked language: A language that is statically checked but provides no clear guarantee of absence of execution errors.其关键则是程序对于 untrapped errors 的检查强度 , 在某些实际已出错的地方 , 弱类型程序并不作捕获处理 , 例如 C 语言的一些指针计算和转换 , 而《C 程序员十诫》的前几个都是弱类型导致的问题 。
论文对于这些概念的定义还是比较抽象的 , 由于未捕获的错误(untrapped errors)大多是由于隐式类型转换所致 , 所以又演化出了第一节中的定义 , 以隐式类型转换作为判断标准 。
如今将“对隐式类型转换的容忍度”作为强弱类型的分类标准 , 已经是很多人的共识(虽然不够全面 , 而且有一些不同的声音) 。
例如 , 维基百科就把隐式类型转换作为弱类型的主要特点之一:
A weakly typed language has looser typing rules and may produce unpredictable results or may perform implicit type conversion at runtime.
例如 , 以 Python 为例 , 社区的主流看法认为它是强类型语言 , 而判断的标准也是看隐式类型转换 。
例子有很多 , 比如 Python 官方的 wiki , 它专门回答了Why is Python a dynamic language and also a strongly typed language, 给出了 4 个答案 , 为 Python 的“动态强类型”定性:
再比如 , 在《流畅的Python》第11章的杂谈中 , 也专门提到了强弱类型的分类 。 (它的用语是“很少隐式类型转换” , 算是比较严谨的 , 但是也错误地把 C++ 归为了强类型 。 )
4、Python 是不是强类型语言?
关于“Python 是否属于强类型”话题 , 在主流观点之外 , 还存在着不少误解的看法 。
一方面的原因有些人混用了强弱类型与动静类型 , 这有历史的原因 , 前面已经分析了 。
另外还有一个同样重要的原因 , 即有人把弱类型等同于“完全没有隐式类型转换”了 , 这种想法并不对 。
事实上 , 强弱类型的概念中包含着部分相对主义的含义 , 强类型语言中也可能有隐式类型转换 。
比如 , Rust 语言为了实现“内存安全”的设计哲学 , 设计了很强大的类型系统 , 但是它里面也有隐式类型转换(自动解引用) 。
问题在于:怎么样的隐式类型转换是在合理范围内的?以及 , 某些表面的隐式类型转换 , 是否真的是隐式类型转换?
回到 Python 的例子 , 我们可以分析几种典型的用法 。
比如 , \"test\"*3这种字符串“乘法”运算 , 虽然是两种类型的操作 , 但是并不涉及隐式类型转换转化 。