0%

感想与规划

自己想学Rust很久了,但一直没有行动起来。然后自己最近也在为1年之后找工作有点焦虑,想着找一些开源项目做一做,自己也对os比较感兴趣,然后搜了一下os开源训练,接着就了解到了这个开源操作系统训练营。

大概花了5 6天的时间把《rust权威指南》看完了,把rustlings刷完了,总体来说难度不高,主要涉及的是rust的语法,没有很深入的地方。最后10个rust写算法的练习算是对所学语法的巩固,这里面还是踩了不少所有权、生命周期的坑。题目本身不难,但要一次通过还是比较考验对rust的掌握程度的。我个人总结的rust比较核心、困难的知识点如下:

  • 所有权
  • 生命周期
  • 借用,共享借用与可变借用
  • 智能指针:Box, Rc, Arc, RefCell
  • trait与泛型
  • unsafe rust

接下来希望能继续巩固rust,用rust写一些项目。

  • 读《Programming Rust》这本书,加深对Rust的理解
  • 读《Effective Rust》,学会Rust的最佳实践
  • 看rust死灵书的课
  • 用Rust完成本次开源操作系统训练营,争取能达到项目实习的水平
  • 用Rust写一个toy编译器
  • 用Rust写一个toy数据库

2024开源操作系统训练营第一阶段总结-高泽文

本文是对OS训练营第一阶段的总结

1.
rust非常的严谨(通俗来说就是要求特别多)
对变量的限制更多了相比于cpp等语言 对于我写习惯cpp之后,太不适应了一开始 ,但是也一定会有好处,
代码的安全性是它最重要的一点,而且rust编译器的提示也非常的方便 减少运行的错误。
2.安全性完全吸引我了,独有的所有权系统和生命周期规则解决了cpp的空指针 null 内存泄漏等 其次还有多线程的安全保证 (鉴于自身水平所以对于多线程安全摘自文心一言的一段:Rust通过其强大的并发原语,如Arc、Mutex和Atomic类型等,为多线程编程提供了安全的支持。这些原语使得开发者能够在不使用垃圾回收的情况下,安全地共享和管理内存。同时,Rust的所有权系统也确保了同一时间只有一个线程能够访问某个数据,从而避免了竞态条件和其他并发问题。)
3.还有rust的社区是真的友好 我第一次了解到还可以在社区学习语言,圣经就是非常好的一个教程

###rust一阶段学习总结
rust和之前学过的java,python,c有很多的不同。尤其是rust的所有权的方面,让人又爱又恨。
写完了rustlings的110道题目让我对rust有了初步的认识,还需在后面的阶段中深入学习以及巩固。
一阶段存在的问题是效率还可以提升,花费了出乎意料的较长时间,后阶段要更加高效解决问题。
较好的方面是持之以恒,在繁忙的学业中抽出时间,是很困难也是很需要毅力的,希望自己后面可以保持。

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

学习过C,C++,Java,Python,再来学习Rust,可以明显感受到它的不同,本次总结我想聊一下Rust的一些特性

  • 所有权

这应该是Rust最特别的地方了,一般我们给函数传递参数,如果是值传递,只会把实参拷贝一份传入函数,而在Rust中不显式说明的情况下都是传递变量的所有权,相当于是把变量的值和原来的名称解绑,再和形参的名称绑定在一起,并且改变了生命周期。这种做法无疑会减少很多安全隐患,但是开发者使用时就需要多加考虑了。

  • 枚举类型

在很多语言中,枚举类型就是有类型规范的宏定义,但在Rust语言中,许多函数的设计都是围绕着枚举类型展开的,最重要的是Option和Result,它们在模式匹配和作函数的返回值中都十分有用,通过None和Err枚举就消除了exception和null的问题。除此之外,还可以让元组和结构体作为枚举,扩展了应用。

  • 智能指针

Rust的智能指针和C++的有很大的区别,原因在于Rust中的变量只能有一个可变引用或多个不可变引用,这使得许多在C++中很容易实现的操作在Rust中需要通过智能指针,Box就像是malloc出一片空间,rc,cell则是多个引用和可变性的工具,但实际操作中这样的限制非常多,运用起来感觉挺麻烦的。

除此之外,还有特征、宏定义、属性、生命周期、多线程、闭包、迭代器、泛型等可圈可点的特性,在此就不多说了。

感受

最后就说一下做题感受,一开始没有rust-analyzer的时候做的有点难受,因为不知道许多内置函数的参数列表和返回值类型,而所有权的转交又会导致报错,后来知道类型了稍微好一些,不过关于可变性的问题一直都不是太清楚。

开源rCore项目初识

  • time:about 2023/8~10

    最初接触操作系统的经历十分巧合,因为是刚从土木老哥转到cau的cs大类,刚入行的紧迫感鞭策我不断搜集信息。恰好本系某位大佬前辈(人称炸药哥)钟爱操作系统,已经不只一次向我们强烈安利此项目,但去年由于考研以及学(da)业(bai)繁(te)忙(bai),虽然报了名,但完全没做…..

    今年又到了开营的时间,同时经过半年多的摸爬滚打,对于自己今后发展方向也有了大致的轮廓,也算是借着rust的强大能力,帮我去理解RISC-V的原理,为今后科研打下基础!

    配置rust编译环境

  • time:2024/4/11-2024/4/12

    心累的一晚上,由于第一次接触github,第一次安装wsl2,没有实际上手过跑在Linux环境下的项目,rustling的配置遇到了超级多的问题。习惯root权限进行Linux操作,这个坏习惯给我带来了巨大的困难,例如vscode无法访问wsl内文件,以及git无法提交代码至仓库……
    多次修改权限无果后,最后决定全盘重新装(前前后后弄了3-4个小时),还好最后终于配置好了环境,终于可以开始和rust斗智斗勇了。

    基本变量和if类型(包括综合quiz练习)

  • time:2024/4/13

    心得体会

    初见rust,接触前几道题并没有太大难度,经历基本的rust环境编译后,最初的几道题做起来真的舒心不少。quiz1练习提供了一个基本的语法综合训练。目前感觉rust并没有传说中那么大的难度qwq。

    收获

    了解了if的使用方法,和c语言最大的不同就是变量不可修改(修改必须要mut),所有权以及的命名使用规则,理解起来还是比较容易的。

    基本数据类型和vec

  • time:2024/4/16

    心得体会

    最近课太多了,鸽了几天。不知道是,手生了还是变难了,总感觉难度陡增,尤其是vecs2,网上搜了一下都没太搞懂(后买翻答疑发现是后面的课程,我:“????”)

    收获

    发现基本数据类型和c还是有相似之处的,只是代码表达方式上要别扭很多,往往是,逻辑清楚,不知道怎么改。在vec的一系列题中,这种问题尤为明显。所有权类的题仔细思考后还是有思路的。

    所有权

  • time:2024/4/20

    心得体会+收获

    所有权类的题仔细思考后还是有思路的。最大的问题还是读代码的能力欠缺,面对“一大坨”代码无从下手,经历这一系列的作答,还是收获满满

    struct类型

  • time:2024/4/20

    心得体会

    难度骤增,这种类c的结构体真的很容易出现小毛病,对于我这种基础不牢的人来说真的是拉到了新的难度等级,每道题要花一些时间去想emmm,又到了快凌晨一点,睡!!

    收获

    基本了解了struct的命名使用规则,深一脚浅一脚往下走叭

    枚举类型,包,模块

  • time:2024/4/25

    心得体会

    好吧,这周课程依旧很多,又拖了好久,新知识吸收速度好慢,今天的枚举总体来说类似struct,学习应用起来并不难。模块主要在封装层面用途很大,就是改变量名字很捉急……

    收获

    了解枚举定义,以及如何创建成员,熟悉如何在不同模块中修改名称以及引入不同的库.

    哈希表创建,option枚举,error系列练习

  • time:2024/4/26

    心得体会

    哈希表提供了一个可以快速管理数据的方法,但是读代码好痛苦,太不熟悉了。option同昨天的枚举相似,做起来熟练很多。error的习题考察的好综合,经常改着改着就把整个代码弄乱了……遂ctrl^z重新来过(捂脸)

    收获

    了解哈希表以及option枚举类型如何使用,加深了对如何处理不同错误的理解,并了解如何修改(或许)

    泛型扩展,trait,生命周期,test练习,迭代器

  • time:2024/4/27

    心得体会

    重新见到泛型,做的也得心应手起来了。越来越感觉在严谨的rust中,泛型真算一个万金油,又能保证封装,还能调用方便,赞。trait反而更像一个接口(就是我做的什么别人也可以借用的感觉)。
    生命周期emmm,某个元素需不需要活,活多久,怎么活……都是其他语言没有的”独特”含义。虽然理解起来费劲,但是题目比较简单。test练习又是两眼一抹黑的翻资料去做,练习需要的广度比课程上要求的多得多。
    迭代器给了一个遍历元素的方法,但是迭代器是惰性的,使用前需要先调用。

    收获

    扩充了在方法中使用泛型的实例,了解trait如何在不同函数或结构体中实现,浅显的理解生命周期含义,知道test函数基本语法,迭代器如何声明与调用

    余下内容,Rc< T >,box等

  • time:2024/4/28

    心得体会

    后面的语法更趋向于数据某种数据结构,理解起来很容易,但运用很难。好在题目并不难,有的题哪怕不了解此类语法也能通过联系上下文做出来(虽然对于提升并没有什么帮助),不过鉴于此项目本质为写os,rust的深度学习就留在需要的时候了(手动狗头)

    收获

    了解box,Rc,Arc,等结构体的使用环境,了解多线程如何创建,了解宏的创建和使用,接触代码分析工具Clippy。以及如何实现数据结构

第一阶段总结

rust和之前学过的语言有很多的不同。
5.2终于写完了rustlings的110道题目,学习了Rust 的基本语法、所有权系统、生命周期、 borrowing、traits、结构体、枚举、错误处理等多种核心概念。让我对rust有了初步的认识。在接下来的学习中从不断的使用Rust来精进对rust的理解。
第一阶段的训练营不仅是一次知识的洗礼,更是对自我挑战和成长的见证。期待在接下来的训练中取得更大的进步。

总结

这是我(plus7wist)在 Os-Camp 2024 的第一阶段的总结。

构建系统

我有一定的 Rust 基础,大概几年前也做过一次 rustlings 的练习。但这次练习里有包含 build script 的部分,我印象里从前那次是没有做过的。

Rust 的 build script 从它的环境变量获取包的信息,将要写出的设置写到标准输出。这很好地完成了一种插件设计。

进程之间通信的基本方式有如下一些:

  1. 命令行参数。
  2. 环境变量。
  3. 共享内存。
  4. 文件:
    1. 标准输入和输出。
    2. 命名管道或者其他设备文件。
    3. 网络。

这其中使用环境变量是最直接简单的。如果传递给插件系统的数据并不复杂,那么这种做法就是最好的。它不需要插件程序要做出很多的解析。

可以从几个方面来评判这些方式。

  1. 数据的复杂性。传递给进程的数据越复杂,就越需要某些协议,因此接收放需要解析这种协议。基于文件的方案需要的解析往往最复杂,命令行参数次之,环境变量最简单。

  2. 可靠性。基于文件的消息传递都要处理 IO 错误,这往往都是很复杂的。而获取命令行参数和环境变量则少有错误。

  3. 一次和多次。如果要向插件随着时序多次传递数据,命令行参数和环境变量都不合适了。这种情况选择文件,特别是标准输入文件是最常见的。

  4. 通信效率。仅在效率真的非常重要的场景,人们才会考虑共享内存。

插件系统,特别是 Rust 的构建系统需要的插件,并不需要多次通信,输入数据也不复杂,和插件通信也并不是效率瓶颈,因此环境变量输入确实非常合适。

而 Language Server 这样的软件设计上则采取标准输入和输出来通信,从上面的分析来看,这也是很合适的。

最后通过共享内存通信的软件体系,一般会使用某种数据分发服务(DDS)来隐藏解析过程。

算法

OS-Camp 的 rustlings 修改版本上增加了一些算法题目。显然它们的质量不高,只是作为一种实现算法的示例而已。

第一阶段总结

我了解到开源操作系统的训练营已经是4月底,我对操作系统非常感兴趣,但是苦于没有可以练手的项目,于是毫不犹豫地报名了这次训练营。我主要通过阅读rust语言圣经,看训练营的rust视频教学了解rust的基本语法,然后完成rustlings来查漏补缺。rustlings的前100题是rust基本语法的检测,但有时也会涉及参考书籍中没有出现的内容。在遇到难以解决的问题时,我会通过hint指令查找是否有有用的提示,或者去看详细的英文文档,基本都能解决问题。最后10题需要用rust实现一些基本数据结构和算法,在自己的实现过程中能体会到rust和其他语言差距很大,有更多的限制,想要习惯rust的写法还需要多写代码。

未来计划

虽然完成了rustlings的110道题,但是只是rust语言最基础的内容。想要设计一个标准的rust项目,实现一个成熟的rust项目还有很大的提升空间。我计划抓紧时间继续学习rust和操作系统,及时赶上后续的milestone。

初次认真学习rust每一个点

通过某些渠道,第一次了解到操作系统训练营,以前我也有用rust写过一些内容,但严格来说这是我的第一次正式学习rust。学习了很多的内容,了解到了闭包,函数式编程,拓展了我的知识面,我第一次见到结构如此清晰的语言。

所有权的理解

众所周知,rust很贪。所有权是其中的灵魂。我认为,其本质就是“作茧自缚”,减少了许多东西,又为方便开发与调试添加了许多东西。这些设计减少了许多的错误。所以简单的把所有权当作单线程的脑子就行,不要给它过多的行为。

错误处理中的Option Result

  • Option 用于表达可能存在或者不存在的值,它有两种可能的状态:Some(值) 和 None。当你不确定一个值是否存在时,可以使用 Option 来处理这种情况。

  • Result 则用于表达可能的操作成功或失败的结果,它有两种可能的状态:Ok(值) 和 Err(错误)。当你需要处理可能出现错误的情况时,可以使用 Result 来处理这种情况。

令人耳目一新的枚举类型 match

在 Rust 中,枚举类型是一种非常强大的数据结构,它可以用来表达一组相关的值。而使用 match 关键字可以让我们更加灵活地处理枚举类型的值,使得代码更加清晰易懂。

match 表达式可以用来匹配枚举类型的不同变体,并根据不同的情况执行相应的代码逻辑。这种模式匹配的方式让代码的逻辑结构清晰明了,同时也增强了代码的可读性和可维护性。

我的收获

通过学习 Rust,我收获了很多。不仅仅是语言本身的特性和语法,更重要的是 Rust 给我带来的编程思维方式的转变。在学习 Rust 的过程中,我更加注重代码的安全性和可靠性,学会了如何利用 Rust 的各种特性来编写更加健壮的程序。

另外,通过与社区的交流和分享,我还了解到了很多其他开发者的经验和见解,这也让我受益匪浅。总的来说,学习 Rust 是一次非常有意义的经历,我相信在将来的工作和项目中,我会继续运用 Rust 的知识和思想,为我的编程生涯注入新的活力和动力。

第一阶段学习总结

作为一名Cpper,学习Rust的过程属实有点难受,在使用习惯上存在很大的差别,往常习惯的写法在Rust中都不能满足语言规范。

通过学习之后我也体会到Rust的优秀之处:抛弃手动管理和GC,用更“高效”的所有权机制来处理引用。

不过这也天生的给Rust带来了一些劣势:所有权机制本质上是谁管理谁的问题,但是一个链表中的所有节点都是 peers 是平等的,前一个节点牺牲了不会影响后面的节点;所有权机制必然导致数据存在“从属”关系,这让链表的表示比较困难,必须使用一些unsafe代码

另外也算是认识了一下函数式编程的魅力,Rust提供了大量操作的抽象,熟练的运用后能很好的节省代码量(当然随之而来的是对我心智负担的增加)

后续我会继续学习,整理一下常用函数,让使用更加流畅