缘起
现存语言的问题
很多语言都依然难以解决 内存安全 和 线程安全 两个问题。
Rust 出现
06 年 Graydon Hoare 着手开发新的编程语言,名为 Rust。 Rust 名称源自 锈菌(Rust Fungi)也有铁锈的意思,字形上柔和了 Trust 和 Robust 暗示 “信任” 和 “鲁棒性”。
GH 对于语言的期望
- 必须是更加安全,不易崩溃的,尤其是在操作内存时,这一点更为重要。
- 不需要有垃圾回收这样的系统,不能为了内存安全引入性能负担。
- 不是一门仅仅拥有一个主要特性的语言,而应该拥有一系列的广泛特性,这些特性之间不乏一致性。这些特性可以很好的相互协作,从而使爱语言更容易编写、维护和调试,让程序员写出更安全、更高效的代码。
Rust 应该是一个同时追求安全、并发和性能的现代系统级编程语言
设计哲学
- 内存安全
- 零成本抽象
- 实用性
内存安全
Rust 要保证内存安全首先要做的是保证类型安全。 类型安全有以下好处: - 允许编译器侦测无意义甚至无效的代码,暴露程序中隐含的错误。 - 可以为编辑器提供有意义的类型信息,帮助优化代码。 - 可以增强代码的可读性,更直白阐述开发者的意图。 - 提供了一定程度的高级抽象,提升开发效率。
何为内存安全
简单讲就是不会出现内存访问错误。 当程序访问未定义内存才会产生内存错误,一般会出现一下集中情况: - 引用空指针 - 使用未初始化内存 - 释放后使用,也就是使用悬垂指针 - 缓冲区溢出,比如数组越界 - 非法释放已经是放过的指针或未分配的指针,也就是重复释放
Rust 扥内存管理模型
- 所有权系统。每个被分配到的内存都有一个独占期所有权的指针。只有当前指针被销毁时,其对应的内存才能随之被释放。
- 借用和生命周期。每个变量都有其生命周期,一旦超出生命周期,变量就会自动释放。如果有借用,则可以通过标记生命周期参数供编译器检查的方式,防止出现悬垂指针,也就是释放后使用的情况。
Rust 借鉴 Haskell 的特性
- 没有空指针
- 默认不可变
- 表达式
- 高阶函数
- 代数数据类型
- 模式匹配
- 泛型
- trait 和关联类型
- 本地类型推导
为实现内存安全,Rust 提供以下独特特性
- 仿射类型(Affine Type),该类型用来表达 Rust 所有权中的 Move 语义
- 借用、生命周期.
零成本抽象
Rust 中零成本抽象的基石就是泛型和 trait。
实用性
如何评价一门编程语言的实用性
- 实践性,首先必须能够应用于开发工业级产品,其次要易于学习和使用。
- 有益性,是指能够对业界产生积极的效果或影响。
- 稳定性,指语言自身要稳定。在解决同一个问题时,不会因为使用者不同而出现随机的结果。
Rust 表现
-
实践性
- 对于失败的情况,可以使用断言工具。
- 对于错误,Rust 提供了基于返回值的分层错误处理方式,比如 Option 可以用来处理可能存在控制的情况,而 Result 就专门用来处理可以被合理解决并需要传播的错误。
- 对于异常, Rust 将其看做无法被合理解决的问题,提供了线程恐慌机制,在发生异常时,线程可以安全地退出。
-
有益性和稳定性 Rust 语言解决了内的村安全和并发安全的问题,可以极大的提升软件的质量。Rust 提供了 C 和 C++ 之外的更好选择,因为 Rust 是对安全、并发和性能都很看重的语言,可以用于嵌入式系统、操作系统、网络服务等底层系统,也可以用于 web 应用开发、游戏引擎和集齐学习,webassembly 可以用来开发前端组件。同时可以用于区块链技术。