设计哲学
1 简述
任何一门语言的兴起,都是为了解决一个问题。
自操作系统诞生以来,系统级主流变成语言,从汇编语言到C++, 已经发展了近50年。但仍然存在两个难题:
- 很难编写内存安全的代码
- 很难编写线程安全的代码
这两大本质的原因是C/C++属于类型不安全的语言。因此需要一个可以提供高的开发效率、代码容易维护、性能还能与C/C++媲美,同时还得保证安全性的语言。
2 设计哲学
Rust语言遵循三条设计哲学:
- 内存安全
- 零成本抽象
- 实用性
2.1 内存安全(编译器yyds)
类型系统提供的好处:
- 允许编译器侦测无意义甚至无效的代码,暴露程序中隐含的错误
- 可以为编译器提供有意义的信息类型,帮助优化代码
- 可以增强代码的可读性,更直白的阐述开发者的意图
- 提供了一定程度的高级抽象,提升开发效率
一般来说,一门语言只要保证类型安全,就可以说他是一门安全的语言。简单来说,类型安全是指类型系统可以保证程序的行为是意义明确、不出错的。
Rust想保证内存安全,首先要做的是保证类型安全。
什么是内存安全,简单说就是不会出现内存访问错误。只有当程序访问未定义内存的时候才会产生内存错误,一般来说,一下几种情况就会产生内存错误:
- 引用空指针
- 使用未初始化内存
- 释放后使用
- 缓冲区溢出
- 重复释放
为了保证内存安全,Rust语言建立了严格的安全内存管理模型:
- 所有权系统。 每个被分配的内存都有一个独占其所有权的指针。只有当该指针被销毁时,其对应的内存才能随之被释放
- 借用和生命周期。每个变量都有生命周期,一旦超出生命周期,变量就会被自动释放。如果是借用,则可以通过标记生命周期参数供编译器检查的方式,防止出现指针释放后再使用的情况
Rust的所有权系统还包括从C++那里借鉴的RAII机制,这是无GC但是可以安全管理内存的基石。
建立安全内存管理模型之后,再用系统类型表达出来即可。 Rust从Haskell的系统类型那里借鉴了以下特性:
- 没有空指针
- 默认不可变
- 表达式
- 高阶函数
- 代数数据模型
- 模式匹配
- 泛型
- trait和关联类型
- 本地类型推导
Rust还具备其他独有的特征:
- 仿射类型
- 借用、生命周期
Rust编译器可以在编译器对类型就行检查,看其是否满足安全内存模型,在编译期就能发现内存不安全问题,同时会检测出多线程并发代码中所有的数据竞争问题
2.2 零成本抽象
变成语言做到高效开发,就必须拥有一定的抽象表达能力。对于Ruby这种语言,抽象表达能力是靠性能换来的,Rust不会存在运行时开销,因为这一切都是在编译期完成的。
Rust零成本抽象的基石是泛型和trait。
2.3 实用性
如何评价一门编程语言的实用性,可以从三个方面进行评价:
- 实践性 首先必须能够应用于开发工业级产品,其次要易于学习和使用
- 有益性 能够对业界产生积极的效果活影响
- 稳定性 语言自身稳定。
(注: 本文参考张汉东老师《Rust编程之道》)