对类型系统的理解

2021-06-10  本文已影响0人  lixiaoshuai
WechatIMG155.png

说明

在学术上,以上的概念有更加细致的定义。我是为了便于自己理解才把这些概念简化成这样。
动态,静态
强类型,弱类型
这些都不是绝对的定义,是有程度的。
比如绝对的强类型是100分,绝对的弱类型是0分。一般语言是介于这两者之间的。
比如 c 语言,是一门静态语言,具有动态特性。
在编译时,需要确定变量类型(静态语言的表现)
但是其具有 void* 类型。这个指针的类型是在运行时才能确定的(动态特性的表现)
弱类型语言也可能具有动态特性

对强弱类型的一些理解

这个概念我一直理解不好
现在主要通过是否存在编程语言层面的隐式类型转换来进行区分

a = 5
b = '5'
sumA = a + b
sumB = a - b

以上内容在 c 语言中
a + b, a - b 的表达式,c 语言都会在环境中将 b(字符类型) 转换为 (整型) 然后进行运算
而这个转化过程是自动的,不受控制的,语言完成的
可以视为隐式转换
可以说 c 语言是弱类型的
c语言在表达式的计算过程中,具有将一个变量的值的类型进行改变的能力,可以说他是弱类型的

以上内容在 Python 中
会直接报错的,提示无法直接运算
在 Python 中,可以 overload 操作符, + 的本质是调用 实例的
add 函数,是可以对 + 进行处理的。可以自定义 + 的运算规则
重写 add 函数,就可以对不同的类型做处理,语言并没有对数据类型做隐式转换
Python 语言并没有将变量自动改变类型的特性(不具有隐式转换),说他是强类型的

强弱类型的优缺点

泛型特性与强类型特性的不同

从动态、静态的角度看:
Python 是动态语言
c, Objective-C 具有动态特性 (void* , id)
这属于动态这个概念的内容
也是这些语言的共性

从泛型的角度看
这些也都是泛型的特性
泛型是一种对类型系统分类副作用的解决方案
(比如在 c 中,你要交换两个变量的值,写了一个交换的方法。由于c 是显式声明类型的,所以针对不同类型,要写多个方法。用了泛型之后就只需要写一个方法就可以了。可以直接交换 两个 void* 的值。可以写一份代码,给多种类型使用)

从强弱类型来看
Python 中的变量可以随意的改变其引用指向的类型

a = 5
a = '你好'

(这是有程序显式改变的)python 本身并没有对变量 a 的类型做任何的改变,即Python 不具有隐式改变变量的能力,所以说他是强类型的
这种显式改变不能说明 Python 是弱类型的

c, Objective-C 中使用void* , id 也可以改变指针的指向类型
这种改变也是程序控制的,不是语言自动做的。这都是属于显式的改变变量的类型
这种显式改变也不是弱类型的特点

上一篇下一篇

猜你喜欢

热点阅读