rust是一个非常严谨而且优秀的语言,在未来一定会大放异彩,也希望自己能够在这个竞争激烈的时代中能有自己的一个立足之地,更希望自己能够有能力在未来为国产操作系统或者应用软件提供自己的一份力量,也希望自己能够通过rust找到一份自己满意的工作。不过在这之前我得耐得住寂寞,能够坚持得下来。毕竟我已经不是学生了。接下来的时间我要每天告诉自己有一件事情要我去完成,要能够持之以恒得去完成。
2022年7月3日,自己学习rust已经一周了,这天也是我参加2022年开源操作系统训练营[https://github.com/LearningOS/rust-based-os-comp2022?utm_source=gold_browser_extension] 的第一天,今天在哔哩哔哩上学习了Vector、String、HashMap的相关知识,[https://www.bilibili.com/video/BV1hp4y1k7SV] 在8.1-8.6小节,对于rust的向量,字符串,和hashmap有了一定的了解。 也在[https://zh.practice.rs/variables.html] 完成了变量绑定与解构的9道相关练习题。
2022年7月4日,仔细看了一下[https://course.rs/basic/base-type/function.html] 的练习数量还有课程数量,有大约30个小结,以目前的学习速度想要在7月30日之前完成rust的学习是不能完成的,所以我需要制定一个学习计划,每天至少学习一个小结,完成一个小结练习作业。今天的任务就是完成4基本类型、5所有权和借用 这两个小结的内容,并完成课后练习。
-
4.基本类型
-
5.引用与借用
基本类型的练习题中涉及到了Box包装类,然而这一章的教学中并没有教授这一类知识,不过通过百度和网络上知识的查询,我克服了困难,对于Box包装类有了一部分了解,对于rust的基本类型也有了进一步的了解。
在引用与借用章节中介绍了使用&进行引用不可变变量,&mut引用可变变量的用法,还有*对于引用的进行解引用的用法,ref进行解引用的用法,使用引用的这个过程就是借用。
今天是开学第一天,老师们的讲话都很棒,说明了要学习好rust要持之以恒,要厚积薄发,要能耐得下性子。
-
6.符合类型
-
6.1字符串
-
6.2数组
-
6.3切片
-
6.4元组
-
6.5结构体
-
6.6枚举 今天完成了第六节的学习任务,对于我来说我对rust中字符串的保存方式与使用方式有了进一步的认识,在元组与结构体方面有了初步的了解,对于枚举类的使用和元组的使用尚不熟练。
1、今天遇到的问题包括元组在12个之内是可以正常打印的,但是超过12个就不可以正常打印。解决办法尚不明确 2、枚举类的使用场景尚不明确。 3、结构体的引用与借用,结构体和其属性的所有权尚不是很清楚,在代码编写方面也没有灵活掌握
今天重新阅读了训练营的第一阶段规则,实际可供使用的时间确实不够,要在2-14天月内学习完成所有的rust教程,还有rustling的练习,在剩下的14天内要学习操作系统相关的内容。对于rust这个语法相对比较难的语言,想要完成真的不是那么容易,静下心来好好学习就是了,就算不能跟得上进度,但我还是要尽全力完成所有的课程。
-
7.流程控制
-
8.1模式匹配.match, matches! 和 if let
-
8.2模式匹配.模式
今天的练习是比较有价值的,对于数组、元组、结构体等等的解构,对于模式匹配的种种语法有了比较深刻的认识,虽然在模式匹配的相关语法中还是不能达到非常熟练的使用,但是基本的阅读已经是没有什么问题了,在接下来的学习中希望能多应用多练习。
rustling的练习也是非常重要的,由于网络问题我的rustling安装出现了问题,希望明天可以解决吧
今天安装好了rustlings的练习软件,开始做了一部分基础的练习题,感觉rustlings的练习题曲线是非常诡异的,前面是非常简单愉快的,到了字符串以后练习题的难度是陡然上升,很多题型还超纲了,夹杂着其他模块的知识,比如错误处理模块的练习题就涉及到了错误类型包装的题目,然而这一部分的语法还有大概10章左右,而且这一部分对于trait的使用和理解也有一定要求,但是课程还要到4到6章之后才会讲到。总之,今天的收获也是不小的,今天也简单记录一下rustlings练习的进度吧。
Exercise | Book Chapter | Done |
---|---|---|
variables | §3.1 | |
functions | §3.3 | |
if | §3.5 | |
move_semantics | §4.1 | |
primitive_types | §4.3 | |
structs | §5.1 | |
enums | §6 | |
modules | §7 | |
collections | §8.1, §8.3 | |
strings | §8.2 | |
error_handling | §9 | |
generics | §10 | |
option | §10.1 | |
traits | §10.2 | |
tests | §11.1 | |
standard_library_types | §13.2 | |
threads | §16.1 | |
macros | §19.6 | |
clippy | n/a | |
conversions | n/a |
今天工作比较忙,只是学习了https://zh.practice.rs/method.html 中的方法和函数部分,对于rust中方法和函数的声明和使用有了初步的了解 ,对于方法来说还有很多语法会在后面讲到,比如如何实现泛型方法,如何给方法中的参数添加生命周期,如何限制泛型方法的返回类型,等等,对于一门语言来说,泛型和方法都是非常重要的部分,所有的功能都是依靠方法实现的。今天还有一个好消息值得纪念,那就是一个拜鬼的坏蛋死了,真是大快人心。
今天依旧比较忙,学习的并不多,只是学习了https://zh.practice.rs/generics-traits/generics.html 这一小节,对于rust来说,泛型只是对于编译器有用的东西,并不是在运行时才会将类型转换为可使用的类型的,而是在编译时根据上下文生成要使用的类型函数或者方法,这就保证了在执行时程序的性能并不会因为类型转换而受损失,这真是一种巧妙的设计,而且在使用泛型时有很多严格的限制,必须要声明参数将会使用到的方法或函数的trait,否则编译无法成功。
今天依旧进行了trait、泛型相关的练习,完成泛型相关的rustlings的练习,在哔哩哔哩学习了生命周期相关的知识,对于我来说泛型的知识确实非常重要,在之后的开发过程中,泛型的应用是非常广泛的,也为程序的设计提供了很多巧妙的思路,可以让代码更加抽象结构更加简洁,但同时,这里的内容也是非常困难的,经过这几天得学习,我觉得我只能说我能看懂泛型相关的代码,但是让我去写泛型相关的函数或者方法,或者实际的实现,对于我来说还是稍微有些困难,之后的学习过程中还是要多读他人写的代码,或者标准库中使用的代码,这样在日后的开发过程中我才能将泛型和trait相关的知识融会贯通。
Exercise | Book Chapter | Done |
---|---|---|
variables | §3.1 | |
functions | §3.3 | |
if | §3.5 | |
move_semantics | §4.1 | |
primitive_types | §4.3 | |
structs | §5.1 | |
enums | §6 | |
modules | §7 | |
collections | §8.1, §8.3 | |
strings | §8.2 | |
error_handling | §9 | |
generics | §10 | |
option | §10.1 | |
traits | §10.2 | |
tests | §11.1 | |
standard_library_types | §13.2 | |
threads | §16.1 | |
macros | §19.6 | |
clippy | n/a | |
conversions | n/a |
今天学习了关于rust语言的单元测试与集成测试的相关功能,对于rust的测试代码的编写有了一定的了解,由于rust的设计,在集成测试方面也让我对rust的包设计方式有了一定的了解,在日后的开发过程中,使用rust来进行单元测试与集成测试的编码会更加熟练。rust的单元测试有一个非常好的东西就是可以直接测试私有的方法或者函数,而在java或者其他代码里却很难实现。事实上现在已经对于rust的基本语法有了较为全面的了解了,接下来就是要经过实战和项目的练习熟悉语法的使用和rust程序的设计思路了。
今天跟着课程学习了如何读取运行时参数,如何读取环境变量,以及如何从文件中读取内容,如何通过单元测试完成项目开发,如何将main中的函数进行整理,重构代码到lib.rs中,这次编写的程序并不是什么复杂的功能,但是包含的内容都很实用,对于我日后进行工程化的开发有很大的帮助,也理解了为何rust会使用到模式匹配,以及枚举类这些在实际项目中应用的重要性,写出来的代码也是非常有层次,非常有可读性。明天的计划是学习闭包和迭代器相关的内容。
今天跟着课程学习了闭包和迭代器的相关内容。从感官上来说有点像java的lambda表达式,闭包是一种特殊的函数,他可以接收作用域外的参数,可以很好得简化代码,做到一处修改,影响全局。迭代器的使用和java的迭代器以及stream函数式编程非常相似,但是令人惊讶的是rust迭代器并不会对程序的性能有损耗,甚至比for循环的性能还要高,原因是rust使用了一种名为零成本抽象的编译技术,具体的来说就是将一段代码复制若干次顺序执行,这就让程序的执行效率变得高效起来,不过代价就是编译的效率会更低一些。
今天跟着课程学习了Box,Rc,RefCell等智能指针,他们都是实现了Deref tarit和Drop tarit 才完成了智能指针的功能的,不得不说rust设计的智能指针真的非常巧妙得解决了一个数据的所有权问题,这里的内容其实相对来说不是那么好理解,我学习了一遍之后也只是大至理解了一下,在实际应用之后我才能更加深入得理解智能指针的相关内容。其实在这里也体现出了rust编译器并不是能完全解决内存泄漏的问题,循环依赖的情况还是会因为不正确得使用智能指针而产生,所以这就要求个能更加深入得理解智能指针得相关内容,这样才能避免内存泄漏的问题。
今天跟着课程学习了多线程的编程方法,需要使用Thread::spawn创建子线程,和java不同,主线程结束后子线程会被直接结束,所以需要使用JoinHandle.join方法来等待子线程结束。如果子线程想要获取主线程的变量,则需要使用move闭包让子线程获取变量的所有权,但是多个子线程想要获取主线程的变量所有权的话那就需要Arc<Mutex>来包装变量,让变量可以被多个线程获取所有权。mutex是一个也是智能指针,主要作用是创建一个多线程可以访问的共享内存,在获取Mutex内的数据时需要先使用lock获取所有权,使用完成时候作用域结束会自动释放所有权,也可以使用drop方法手动释放所有权。Arc其实是实现了Send Trait和Sync Trait的一个Rc智能指针,他能确保一个变量可以在线程间安全得被转让所有权。最后学习了使用mpsr技术来让消息在多线程间传递的方法,需要使用channel方法创建一个元组,第一个元素就是发送方,第二个元素就是接受方,发送方使用send方法发送数据,接收方使用recv方法接受数据并阻塞线程,如果发送方或者接收方任意一方达到生命周期消失,那么就会返回一个错误。
今天公司加班,没什么时间学习rust,只是稍微学习了rust的面向对象的编程方式和特性,这点和java有相似之处又有不同之处,rust并没有继承的方式,只有类似于接口的实现tarit的方式来实现面向对象的编程。
今天公司又加班了,剩下的rust课程并不是很多了,我也算正式入门rust了,今天视频上讲解了rust模式匹配的各种用法,rust的模式匹配确实是一种非常可靠的方法,可以控制代码的各种分支,并且能保证各个分支都会被匹配到,很大一部分的工作都会被编译器所检查,这就使得代码会有较少的错误,大部分的错误在编写代码阶段就被暴漏出来。另外我还复习了一下昨天有关于rust面向对象的编程方式,使用trait约束各个类型是一种方式,使用struct也是一种方式,两种方式各有优缺点,这使得对于rust来说面向对象编程更加灵活,我们可以根据自己的习惯和实际的业务场景选择合适的面向对象编程方式。还有我也复习了多线程并发的一些知识,在marker包下的两个trait Send和Sync这两个trait,Send可以允许多线程之间转移所有权,Sync可以允许多线程之间相互访问,我们也可以根据自己的业务场景来选实现自己的并发类型。
今天把所有的rust课程学习完了,但是说实在的rust语言的难度还是很高的,我只能说是我对rust语言有一个初步的了解,对于rust的大部分语法有了认识,我可以阅读rust语言编写的程序了,但是让我去编写rust程序,我觉得我还得经过很长时间的锻炼和练习才可以,今天主要学写了对于trait的一些高级使用方法和使用方式,还有自定义宏的使用方式,还有一些非安全的函数或者代码块的使用方式,对于非安全的函数或者代码块,通常是为了与C语言或者其他语言交互而使用的,也会使用到原始指针等语法,这里的东西需要程序员自己保证程序的安全性,一般这里主要是由程序员对非安全函数进行封装,向上层提供安全的函数。另外像自定义宏等内容,我学习得并不是很融汇贯通,这类似于函数的定义,但定义起来比函数要困难,使用起来更加抽象一些,有点像java中的面向切片编程。另外,我还进行rustlings的练习,计划在明天完成所有的rustlings练习。
Exercise | Book Chapter | Done |
---|---|---|
variables | §3.1 | |
functions | §3.3 | |
if | §3.5 | |
move_semantics | §4.1 | |
primitive_types | §4.3 | |
structs | §5.1 | |
enums | §6 | |
modules | §7 | |
collections | §8.1, §8.3 | |
strings | §8.2 | |
error_handling | §9 | |
generics | §10 | |
option | §10.1 | |
traits | §10.2 | |
tests | §11.1 | |
standard_library_types | §13.2 | |
threads | §16.1 | |
macros | §19.6 | |
clippy | n/a | |
conversions | n/a |
今天把剩下的rustlings的练习完成了,感觉rustlings涉及的练习面还是很广泛全面的,但是一些高级的用法或者知识点考察得并不是很全面,但是这对于我来说已经很难了,能够完成rustlings的练习已经很不容易了,总之这样的rustlings练习对我很有用,而且这次的rustlings练习更新了advanced errors练习,教会了我们如何构造自己的error,也有一些trait实现的相关方法方式。接下来我就要开始自己的操作系统练习啦!加油!坚持下去!
Exercise | Book Chapter | Done |
---|---|---|
variables | §3.1 | |
functions | §3.3 | |
if | §3.5 | |
move_semantics | §4.1 | |
primitive_types | §4.3 | |
structs | §5.1 | |
enums | §6 | |
modules | §7 | |
collections | §8.1, §8.3 | |
strings | §8.2 | |
error_handling | §9 | |
generics | §10 | |
option | §10.1 | |
traits | §10.2 | |
tests | §11.1 | |
standard_library_types | §13.2 | |
threads | §16.1 | |
macros | §19.6 | |
clippy | n/a | |
conversions | n/a | |
advanced_errors | n/a |
今天开始搭建了操作系统课程的开发环境,使用到了riscv的虚拟机以及各种开发环境,也跟着精简的教程开始运行自己的helloworld程序,然而跟着课程进行编写的程序并没有成功得打印helloworld,请教了群里得的大佬才了解到为什么会无法打印helloworld,因为在底层的环境里,输出分为用户输出和系统输出,我所编写的helloworld并没有达到系统输出的那一层,二十停留在了用户输出的那一层,故我的代码运行了,但是并没有输出到屏幕上来,今天的实验智能说成功了一一半,由于时间和精力有限,我并没能完成我内心所期待的目标,明天的话我可以努力一下推进一下自己的学习进度。顺带一提,在这个精简课程中有很多重要的基础知识并没有讲解,所以我决定学习http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter0/3os-hw-abstract.html 来进行接下来的操作系统以及riscv的学习。目前我已经学习到了 操作系统抽象的这一节,对于操作系统和裸机程序有了一定程度的了解
今天学习陈渝老师的操作系统课程,这个课程总共有13节,每节有2个半小时,所以我要安排一些接下来的学习计划,因为剩下的时间只有不到10天了,要在这剩下的10天学习13节课是非常不容易的,我得计划好每天得学习内容,因为工作的原因,我不能每天都来上课。计划是剩下的时间每天看至少两节课,在周末的时候做实验,这样才能保证在剩下的时间跟上训练营的进度。今天的课程和昨天的差不多,主要讲了操作系统发展的历史和遇到的问题,人们是如何在遇到问题后针对问题做出对于操作系统的修改和完善的,也展望了未来操作系统的发展方向,我们应该关注操作系统实现时应该注意的细节问题,在互联网发展迅速的今天,分布式操作系统应该如何实现。https://github.com/LearningOS/rust-based-os-comp2022/blob/main/relatedinfo.md#%E8%AE%AD%E7%BB%83%E8%90%A5rcore-tutorial%E5%92%8Crustlings%E8%A7%86%E9%A2%91%E8%AE%B2%E8%A7%A3
今天复习了昨天的操作系统过的发展历史,和操作系统要解决的一些问题,比如操作系统是如何从lib类操作系统向批处理类操作系统发展,再向多线程类的操作系统发展的历史和发展设计的思路,又比如操作系统是如何启动的,他是由bootloader中的一段固定的代码跳转到os的一段固定的代码,os的固定代码是叫一种ELF的执行程序,这段执行程序会启动os,os启动之后才是应用程序的启动,应用程序在运行的过程中会中断会跳回os的执行程序中。os的程序设计是依靠调用标准库来实现的,对于rust而言,只有一个叫core的系统级标准库,而对于c语言来说会有大量的系统及标准库,会根据硬件的不同来调用不同的标准库,这也是c语言os不易移植的原因,rust会有大量的检查来保证代码是编写的安全的,调用标准库会执行一些系统级的调用,这些系统级的调用有些是基于core提供的标准库,有些不存在的方法可以使用汇编来编写实现,再由rust编译汇编加载,这就使得rust的操作系统可移植性变得很高。对于linux操作系统而言,大概有400多条core级的指令,每条指令都是相对而言简答易用的,设计的思路就是简单就是美的,老师列举的20多条指令中大部分都是数十行代码就可以实现的。这也是在之后的代码编写和软件设计上我们可以借鉴的,还有就是对于linux操作系统而言,所有的设备控制都被抽象为了文件控制,只需要对抽象出来的文件进行操作,就可以完成对于各种复杂设备的控制,这也是操作系统的设计思想之一。https://meeting.tencent.com/user-center/shared-record-info?id=0c2a73ec-238a-453b-8f0f-aaadaeb55eca&from=3
今天学了libos的实现思路和一些相对具体的实现细节,了解了一些如os是如何申请stack和heap的操作,如bss是保存一些未初始化变量的东西,还比如编译器生成的二进制程序是如何加载到内存的,这里也就涉及到了一些libOS的问题,那就是libOS会直接调用相对底层的指令和内存地址空间,如果有恶意的程序或者bug就会导致我们的内存被覆盖掉,进而导致我们的os崩溃掉,这也就引出了多道程序控制的操作系统。多道程序控制的操作系统的设计思路是由软件和硬件共同构建出对于底层的隔离,在指令集设计中会区分用户态和内核态,应用程序只能在ABE执行ABI的程序,也就是在用户态执行的操作,如果应用程序想要执行一些底层的操作,他就必须调用ecall去访问底层的一些程序来完成用户态到内核态的转化。RISCV的设计思路是可以根据实际应用场景的不同来对操作系统对底层的控制灵活组建结构分层,比如U-S-H-M的各个模式,各个层次对于底层的控制权限也是逐步递增的。https://meeting.tencent.com/user-center/shared-record-info?id=c21406cf-96f9-4df6-8cab-af4dbd798769&from=3
最近工作太忙,周日家里有些事情,没有进行学习,好好休息了一下。
今天继续学习了操作系统的相关知识,对于批处理操作系统的调用和实现方式有了原理上的了解,还是和上节课一样,我了解到了程序是如何从U-Mode到S-Mode再到M-mode的,每个等级的mode要处理的问题也是不一样的,能调用的指令集也是有所不同的,这里也提到了中断是如何产生的,中断解决了什么问题,中断是如何实现,中断要保存程序运行时的一些状态和内存地址信息,当中断处理完成之后又是如何回复到原先程序执行的状态的,中断又是如何避免新的中断产生导致自身被覆盖的一些原理。课程中也提到了批处理程序是如何连接在一起,在内核态和用户态为什么要使用不同的栈和内存地址,原因就是os要保证安全性,保证用户的程序不会破坏os从而导致操作系统崩溃。最后在第四节讲了操作系统是如何从批处理发展到多任务分时处理,多道程序处理的操作系统的,随着硬件水平的提升,内存的扩大,计算机可以同时保存更多的程序了,所以为了充分利用cpu,所以任务的概念,cpu时间片的概念就产生了,通过对于多个任务不断的中断和恢复,对应用程序达到并发执行的目的。这里操作系统的主要的内容还是中断的产生和回复。https://meeting.tencent.com/user-center/shared-record-info?id=5dae93b5-6f9d-40b9-86c3-f2c13670ecaf&from=3
学习了多道程序处理分时任务处理的操作系统的实现原理,在底层cpu是如何进行中中断恢复的原理,各种安全级别是如何实现的,os和硬件是如何协通处理并封装底层的cpu操作的,给上层提供更加简单抽象的abi和sbi,让应用程序开发者不用关系内存的大小与结构,不用关系cpu的资源与使用。对于riscv的cpu而言使用ecall进行mode的切换与恢复,操作系统是如何装在咋内存中,os是如何启动的回顾。
这周工作非常的紧张,以至于我没有什么时间继续学习操作系统的相关课程了,这导致我没法跟上训练营的原定计划了,但是我不会放弃的,而且我交到了一个西安的朋友,希望在日后的学习中能够相互帮周到吧,这一周开始使用rust来刷LeetCode,进行算法的学习和rust预研的学习。