0%

2024 春季开源操作系统训练营第一阶段总结-lls101

引言

​ 作为一名具有 C 语言和 Java 语言基础的学生,通过参加操作系统训练营,在第一阶段通过Rustlings 实践。在这份总结报告中,我将分享我的体会。

与其他语言对比

Rust 与 C 语言的对比

内存安全

  • C 语言:虽然极其灵活,但 C 语言经常因其内存管理自由而导致缓冲区溢出、野指针等问题。
  • Rust:通过所有权(ownership)、借用(borrowing)和生命周期(lifetimes)的概念,保证了内存安全而无需垃圾回收机制。这些特性在编译时进行检查,几乎消除了运行时错误。

并发编程

  • C 语言:提供了原始的并发机制,依赖于操作系统的线程和锁。
  • Rust:提供了更现代、更安全的并发编程模型。通过所有权和类型系统,Rust 能够在编译时阻止数据竞争等并发问题。

Rust 与 Java 的对比

性能

  • Java:作为一种高级语言,拥有自动内存管理(垃圾回收)。虽然方便但通常牺牲了一些性能。
  • Rust:性能接近于 C/C++,因为它没有运行时和垃圾收集,是系统编程的理想选择。

内存管理

  • Java:自动内存管理减少了开发者的负担,但增加了运行时开销。
  • Rust:通过编译时的内存安全保证减少了运行时开销,但要求开发者理解更多的内存管理概念。

语言特色

末尾逗号写法

​ 在 Rust 中,末尾的逗号在很多语法结构中是可选的,包括类型约束列表、函数参数列表、枚举定义等。下面的两种写法都是正确的,编译器都会接受,本人更偏向于无逗号写法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Cacher<T>
where
T: Fn(u32) -> u32
{
query: T,
value: Option<u32>,
}
struct Cacher<T>
where
T: Fn(u32) -> u32,
{
query: T,
value: Option<u32>,
}

类型转换

From 特征允许一种类型定义如何从另一种类型显式地转换,提供了一种类型到另一种类型的单向转换。与 From 特征相对应,Into 特征通常用于相同的转换,实际上当类型实现了 From,Rust 自动为类型提供 Into 实现。两个特征让类型转换变得简单而且类型安全,无需手动处理转换逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Number {
value: i32,
}
// 为 `Number` 实现 `From<i32>`
impl From<i32> for Number {
fn from(item: i32) -> Self {
Number { value: item }
}
}
let num = Number::from(30);
println!("The number is: {}", num.value);
let int = 5;
let num: Number = int.into();

自动化测试

​ 在使用Rustlings的过程中深刻体会到了Rust内置测试支持的强大之处,无需额外的库就可以编写和运行测试。使用 #[test] 属性标记测试函数,然后使用 cargo test 命令运行所有测试。在 Java 中,即使是未使用的测试代码也可能因为类加载等原因对应用性能有轻微影响,但是Rust 的测试构建只在需要时添加测试代码,不影响生产代码的性能。

零成本抽象

​ Rust 的设计哲学是指通过零成本抽象,让使用者不会因为选择了更高级的编程方式而付出额外的运行时性能成本。在Java中,内存管理通过垃圾回收器自动进行,垃圾回收器周期性地运行带来了性能的不可预测性。但是代价却是牺牲了编译时间。

心得

​ 学习 Rust 对我来说既是挑战也是收获。作为一种注重安全性和性能的系统编程语言,Rust 的学习曲线比较陡峭,特别是对于我这样有 C 和 Java 背景的开发者。在 Rust 的世界里,内存管理、所有权、生命周期和并发处理等概念都是我需要新适应的。随着对 Rust 的深入,我发现虽然编写和调试 Rust 程序可能需要更多的时间,但这种时间投资最终转化为了更稳定和安全的软件。Rust 的包管理器和构建工具 Cargo 极大地简化了项目构建、依赖管理和测试,提高了我的开发效率。总的来说,学习 Rust 是一段值得的旅程。它不仅提升了我的编程技能,也改变了我对内存管理和系统编程的看法。