当前位置:嗨网首页>书籍在线阅读

02-类型系统及其重要性

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.1 类型系统及其重要性

“对发送的内容保守一点,对收到的内容宽容一点。”

——John Postel

我们为什么需要在语言中使用类型?这是一个很好的问题,可以作为理解编程语言类型系统的契机。作为程序员,我们知道为计算机编写的程序在最底层是以0和1组成的二进制数据格式表示的。实际上,最早的计算机必须使用机器代码手动编程。最终,程序员意识到这样做非常容易出错,并且乏味、耗时。对大部分人来说,在二进制层面操作和推断这些实体是不切实际的。到了20世纪50年代,编程社区提出了机器代码助记符的概念,这些助记符变成了今天我们熟知的汇编语言。

然后,编程语言应运而生,它们被编译成汇编代码,并允许编程人员编写人类可理解的代码,以方便计算机将其编译成机器代码。然而,大家平时所说的语言表达某些语义比较模糊,因此需要制定一套规则和条件,来表述用类似人类语言编写的计算机程序中可能或不可能存在的内容,即程序语义。这使得我们提出了类型和类型系统的理念。

类型是一组具名的可能值。例如,u8是一种可能包含0~255的正数值类型。类型提供了一种方法来弥合我们创建的这些实体的底层表示与心理模型之间的差距。除此之外,类型还为我们提供了表示实体的意图、行为和约束的方法。它们定义了用户通过类型能够(不能够)做什么。例如,它没有定义将字符串类型的值和数值类型的值相加的结果是什么。从类型来看,语言设计者构建了类型系统,这些系统是一组规则,用于管理不同类型在编程语言中的交互。它们可以用作推断程序的工具,并有助于确保程序能够正常运行并符合规范。类型系统根据其表达力进行限定,这仅表示你可以使用类型表达逻辑的程度,以及程序中的不变量。例如Haskell是一种高级语言,它具有非常丰富的表现力的类型系统,而C语言是一种低级语言,它只为我们提供了很少的基于类型的抽象。Rust试图在这两个极端之间找到一种平衡。

Rust的类型系统大量地借鉴了Ocaml和Haskell等函数式语言的特点,例如它的抽象数据类型的结构体、特征(类似于Haskell的类型类)及错误处理类型(Option和Result)。类型系统是作为强类型系统而存在的,这意味着它在编译时会执行更多的类型检查,而不是在运行时抛出类型。此外,类型系统是静态的,这意味着绑定到整数值的变量不可能又指向字符串变量。这些特性可以构造在运行时极少破坏不变量的健壮程序,不过其代价是要求程序员在编写程序时需要更多的规划和思考。Rust尝试在设计程序时给予程序员更多的发挥空间,这可能会让一些希望快速构造原型的程序员望而却步。但是,从维护软件系统的长远角度来看,这是一件好事。

让我们先来看看Rust的类型系统如何实现代码复用。