IT袋

当前位置:主页 > 对比评测 >

强类型语言和弱类型语言哪个好

强类型语言和弱类型语言哪个好 语言表达能力欠缺的改进方法(2)

更新:2023-08-26 15:08:08 来源:IT袋 作者:苏晓敏
导读:强类型语言和弱类型语言哪个好,论文对于这些概念的定义还是比较抽象的,由于未捕获的错误(untrapped errors)大多是由于隐式类型转换所致,所以又演化出了第一节中的定义,以隐式类

强类型语言和弱类型语言哪个好

强类型语言和弱类型语言哪个好

论文对于这些概念的定义还是比较抽象的,由于未捕获的错误(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 这种字符串“乘法”运算,虽然是两种类型的操作,但是并不涉及隐式类型转换转化。

比如,x=10; x=”test” 先后给一个变量不同类型的赋值,表面上看 x 的类型变化了,用 type(x) 可以判断出不同,但是,Python 中的类型是跟值绑定的(右值绑定),并不是跟变量绑定的。

变量 x 准确地说只是变量名,是绑定到实际变量上的一个标签,它没有类型。type(x) 判断出的并不是 x 本身的类型,而是 x 指向的对象的类型,就像内置函数 id(x) 算出的也不是 x 本身的地址,而是实际的对象的地址。

比如,1 + True 这种数字与布尔类型的加法运算,也没有发生隐式类型转换。因为 Python 中的布尔类型其实是整型的子类,是同一种类型!(如果有疑问,可查阅 PEP-285)

再比如,整数/布尔值与浮点数相加,在 Python 中也不需要作显式类型转换。但是,它的实现过程其实是用了数字的__add__() 方法,Python 中一切皆对象,数字对象也有自己的方法。(其它语言可不一定)

也就是说,数字间的算术运算操作,其实是一个函数调用的过程,跟其它语言中的算术运算有着本质的区别。

另外,不同的数字类型虽然在计算机存储层面有很大差异,但在人类眼中,它们是同一种类型(宽泛地分),所以就算发生了隐式类型转换,在逻辑上也是可以接受的。

最后,还有一个例子,即 Python 在 if/while 之后的真值判断,我之前分析过它的实现原理 ,它会把其它类型的对象转化成布尔类型的值。

但是,它实际上也只是函数调用的结果(__bool__() 和 __len__()),是通过计算而得出的合理结果,并不属于隐式的强制类型转换,不在 untrapped errors 的范畴里。

所以,严格来说,前面 5 个例子中都没有发生类型转换。 浮点数和真值判断的例子,直观上看是发生了类型转换,但它们其实是 Python 的特性,是可控的、符合预期的、并没有对原有类型造成破坏。

退一步讲,若放宽“隐式类型转换”的含义,认为后两个例子发生了隐式类型转换,但是,它们是通过严谨的函数调用过程实现的,也不会出现 forbidden errors,所以还是属于强检查类型。

5、其它相关的问题

前文对概念的含义以及 Python 中的表现,作了细致的分析。接下来,为了逻辑与话题的完整性,我们还需要回答几个小问题:

(1)能否以“隐式类型转换”作为强弱类型的分类依据?

明确的分类定义应该以《Type Systems》为准,它有一套针对不同 error 的分类,强弱类型其实是对于 forbidden errors 的处理分类。隐式类型转换是其明显的特征,但并不是全部,也不是唯一的判断依据。

本文为了方便理解,使用这个主要特征来划分强弱类型,但是要强调,强类型不是没有隐式类型转换,而是可能有很少且合理的隐式类型转换。

(2)假如有其它解释器令 Python 支持广泛的隐式类型转换,那 Python 还是强类型语言么?

语言的标准规范就像是法律,而解释器是执法者。如果有错误的执法解释,那法律还是那个法律,应该改掉错误的执法行为;如果是法律本身有问题(造成了解释歧义和矛盾,或者该废弃),那就应该修改法律,保证它的确定性(要么是强类型,要么是弱类型)。

(3)为什么说 Javascript 是弱类型?

因为它的隐式类型转换非常多、非常复杂、非常过分!比如,Javascript 中123 + null 结果为 123,123 + {} 结果为字符串“123[object Object]”。

另外,它的双等号“==”除了有基本的比较操作,还可能发生多重的隐式类型转换,例如true==[‘2’] 判断出的结果为 false,而true==[‘1’] 的结果是 true,还有[]==![] 和[undefined]==false 的结果都为 true……

(4)C++ 是不是弱类型语言?

前文提到《流畅的Python》中将 C++ 归为强类型,但实际上它应该被归为弱类型。C++ 的类型转换是个非常复杂的话题,@樱雨楼 小姐姐曾写过一个系列文章做了系统论述,文章地址:如何攻克 C++ 中复杂的类型转换? 、详解 C++ 的隐式类型转换与函数重载! 、谁说 C++ 的强制类型转换很难懂?

6、小结

强弱类型概念在网上有比较多的争议,不仅在 Python 是如此,在 C/C++ 之类的语言更甚。

其实在学术上,这个概念早已有明确的定义,而且事实上也被很多人所接纳。

那些反对的声音大多是因为概念混用,因为他们忽略了另一种对语言进行分类的维度;同时,还有一部分值得注意的原因,即不能认为强类型等于“完全无隐式类型转换”或“只要没有xxx隐式类型转换”。

本文介绍了社区中对 Python 的主流分类,同时对几类疑似隐式类型转换的用法进行了分析,论证出它是一种强类型语言。

以上IT袋网介绍的强类型语言和弱类型语言哪个好 和 语言表达能力欠缺的改进方法的经验小知识,希望看完本文能给您带来一点帮助!

相关阅读

  • 笔记本英特尔和锐龙处理器哪个好用 笔记本英特尔处理器性能排行

    笔记本英特尔和锐龙处理器哪个好用 笔记本英特尔处理器性能排行

    小编为你讲解笔记本英特尔和锐龙处理器哪个好用和笔记本英特尔处理器性能排行方面的讲解,请看下面详细的介绍。 很多商业用户,尤其是中小型企业、初创公司、培训机构、小型团队以及

  • 爱奇艺电视果6评测 怎么样

    爱奇艺电视果6评测 怎么样

    有没有喜欢追剧的朋友,这款爱奇艺电视果6不容错过,一起来看看这款爱奇艺电视果6怎么样吧~ 包装方面,爱奇艺电视果6以白色打底,正面印有电视果6主机的渲染图,左上角标记有爱奇艺品

  • 小米有品向物暖桌垫评测 小米有品向物暖桌垫怎么样

    小米有品向物暖桌垫评测 小米有品向物暖桌垫怎么样

    随着时间的流逝,寒冷的天气也逐渐到来,很多办公和玩游戏的朋友手冷,本文为大家推荐评测小米有品向物暖桌垫,可以让你告别手冷,一起来看看吧~ 向物这个品牌小伙伴们应该不算陌生了

  • iPhone14和14 Pro拍照对比 拍照差多少

    iPhone14和14 Pro拍照对比 拍照差多少

    iPhone14 Pro系列相比标准版的14系列无论是在屏幕、机身材质、外观、处理器还是影像等多个方面都有着较大的区别,而要说区别最大最被用户所关注的就是影像了,Pro系列首次将1200万像素升级