Skip to content

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


title: 2024春夏季开源操作系统训练营第一阶段总结-DDreame date: 2024-04-25 22:27:00 categories: - 2024春夏季开源操作系统训练营 tags: - author:DDreame - repo:https://github.com/LearningOS/rust-rustlings-2024-spring-DDreame - 总结


目录

前言

本着学习 Rust 和 OS 底层相关的想法加入了这一届的训练营。

  • 关于 Rust: 对 Rust 这个语言之前仅仅是略有耳闻, 听说学习曲线陡峭, 也一直没真的了解一下, 所以借此机会学习并了解一下。
  • 关于 OS: 一个方面是虽然写了几年代码, 但是其实对 OS 了解不多, 浅浅的知道一些模糊概念, 另外是对 thu 的 ucore 早有耳闻, 而这个 rcore 同出一源, 因此决定借此机会来学习一下。

由于第一阶段并不涉及 OS 的部分, 因此主要是从 Rust 的学习角度来总结一下第一阶段的内容。

第一阶段使用 rustlings 为评价标准, 提供提示、参考教程、直播讲解、线上答疑等方式组合推进。 我本人没有参与太多直播讲解和线上答疑,主要使用 hint 提示和相关文档、LLM 完成了第一阶段的回答。 因此主要从三个角度来分析所学:

  1. 所有权与类型系统: 这是我觉得 Rust 与其他语言最为迥异的地方, 所以在这里简单阐述一下我的理解。
  2. 做题感受: 对 Rustlings 和 训练营一阶段的一些感受。
  3. 个人反思: 对自己参与一阶段训练营和学习 Rust 的一些反思。

所有权与类型系统

Rust 不进行自动的 GC(内存回收), 也不需要开发者手动释放内存, 而是通过所有权来管理内存, 这是一个非常有趣的特点。 其次, RUst 有着与 Java、 C++、 Python等不同的类型系统, 这一点不仅仅体现在一个字符串就会有 String, str, &String 等多个类型上, 也体现在 sturctimplwhere 上。

所有权

所有权是指当前变量值所占据的内存, 归哪个变量所管理(这一句是个人总结)。 这也就意味着, 当一个变量丧失了对值的拥有, 它就不再能使用这个值。

与 Java 和 Swift 使用的引用计数不同, 引用计数需要管理复杂的引用关系, 同一个值可能被非常多的变量所引用, 这导致内存在很多时候难以回收, 甚至在某些时候无法判断 OOM(堆内存溢出) 的具体位置。 --这个是本人亲身经历的一次问题。

虽然由于同一时刻一个值只能有一个所有者这一个概念及编程环境的实际需要带来了很多的额外的复杂内容, 比如借用引用, 可变借用不可变借用等等。 但是不可否认的是, 这让开发者更深刻的了解了堆、栈等程序等基础概念, 也有利于开发者从思维上管理自己程序的运行时。

类型系统

类型系统第一次感觉奇特是在于 structimpl 的分离。 与常见语言中每个 class 与他的 method 耦合在一起不同, Rust 中方法是对 struct 使用 impl 构建的。

其次是对于 Stringstr 的类型, 让人区分堆与栈, 又或者说, 当明白了一个结构体会被分布在堆还是栈上的时候, 也就不会再纠结于到底是 String 还是 str 了。

做题感受

由于 Rustlings 主要是通过做题来驱动, 因此通过第一阶段训练营意味着完成所有的 Rustlings 练习题。 这样操作的好处是, 可以了解 Rust 的基本语法和编译器, 学会阅读 Rust 的文档和教程等内容。 因此夏令营的学习还是依赖于自我的驱动(当然, 学习编程可能没有那么多的技术热情, 但是确实应该学会自我驱动来跟上新的技术, 跟上时代的脚步)。

但是 Rustlings 存在一个很大的弊端, 似乎是通过对应名称的文件能否顺利执行来判断是否通过的, 也就是可以通过修改不应该修改的代码来使得练习通过。 在练习一开始的时候, 我按照编程习惯和编译器提示懵懵懂懂的过了十来道题, 中间可能修改了 assetequals 等内容。 同理, 如果只是想速通、进入第二阶段等, 完全有很多稀奇古怪的方法可以在不完成解题的情况下进行。

而要解题, 其实也并不需要一定看教学视频(当然这里的含义并非视频或直播不好), 而是 Rust 的编译器可以完成一些基础的提示, 其次是通过 hintReadme 和 代码中的注释可以获取到很多关于对应知识点的信息, 能完成接近于 90% 的问题, 因此靠自己也同样能完成很好的 Rust 学习, 并不需要等待直播开启。

当然, 依然有约 10% 的问题可能难以解决, 这时候利用诸如 ChatGPT、 ChatGLM、 BaichuanAI 等 LLM 可以解决剩下的9% 的问题。 通过提示词优化可以解决几乎 Rustlings 中 100% 的问题。

因此总结下来, 第一阶段使用 Rustlings 来作为评价标准, 是因为 Rustlings 更多的是一个强自驱的学习过程, 需要对自己的学习质量和学习内容有着一定的自我要求。

个人反思

尽管在几天内完成了全部的 Rustlings, 比不过训练营当天秒通的那些人, 但是鉴于我本人并没有 Rust 基础, 所以倒也没什么气馁或难受。

在学习过程中还是对 Rust 有了一点点浅薄的了解, 对 Rust 的代码不再是一知半解或者完全看不懂的情况, 这是一阶段学习后最欣慰的事情。

但是 Rustlings 并不能算是一个全面的 Rust 学习指南, 更多的是一个学习入门的指引, 对于很多的概念比如智能指针过程宏都是浅尝辄止, 需要自行补充更多的学习内容来进行增强。

其次是对于 AI 的使用也会导致个人思维的怠惰, 对于部分题只要求解出来而忽视了解题的思路(比如算法题链表和堆)。 这种只能适用于一时的情况, 不利于长期的学习。

总结

整体总结下来, 训练营选择 Rustlings 还是一个非常不错的决定, 不像是传统课程一般强制直播那样干涸, 也不会是纯练习那样放飞。 而且也成功的体会到了 Rust 的好玩之处, 和他的陡峭艰难, 期待二阶段可以顺利的使用 Rust 写出 Rcore, 对自己交出一份满意的答卷。