美文网首页
对类型系统的理解

对类型系统的理解

作者: lixiaoshuai | 来源:发表于2021-06-10 10:49 被阅读0次
    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 也可以改变指针的指向类型
    这种改变也是程序控制的,不是语言自动做的。这都是属于显式的改变变量的类型
    这种显式改变也不是弱类型的特点

    相关文章

      网友评论

          本文标题:对类型系统的理解

          本文链接:https://www.haomeiwen.com/subject/ttweeltx.html