0%

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

总结 Rust 语言的文章已经又许多了。我的眼界和能力有限,对于操作系统更是一窍不通,即便接触 Rust 语言的时间比许多这这三周才开始学习的人要久,却甚至也写不出同学们这样清晰的总结,故在此分享学习过程中我的一些想法。尽管只是一个菜鸟的瞎扯,也希望能给读到的你一些有价值的想法。

我接触 Rust 还算比较早,但是真正阅读官方的 The Book 也还只是一年前。在此之前,我几乎可以说是 OOP 的忠实拥趸,崇尚 OOP 社区流行的各式设计模式等技巧。然而随着见识越来越广泛,了解的各种编程范式越来越多,OOP 带给我的问题也越来越多。
为了逃避面向对象的各种苦难,我曾经花费数个月混迹其他编程语言,尤其是函数式语言中间。那段时间我似乎从一个极端走到另一个极端,极力反对面向对象中常见的各种稀奇古怪的概念,崇尚纯粹的函数式编程,尝试各种各样的编程语言,包括经典的 LispML 两大家族,以及 Prolog 这样的逻辑语言。在浪费许久之后,我终于意识到存粹函数式语言的局限性,尤其是远离主流编程社区导致的各种难题,以及将他们用于编写更加复杂的系统的困难度。而就在这时,我又重新找到了 Rust
初次认识 Rust 是在 2020 年。当时的 Rust 远没有如今如此高的声量,庞大的社区,缺乏其他编程语言的经验也使得我难以接受 Rust 所展现的各种复杂概念 —— 所有权、生命周期、traitcrate 等等。没有在其他语言中碰壁或者见识到那些稀奇古怪的问题之前,这些概念的出现似乎是晦涩而完全不必要的。然而如今,他们的出现却又好像展现出极大的用处,在主流编程语言界被 OOP 统治十几年后,指出了一个可能的未来方向。
我对于 Rust 中这些复杂的概念的理解,其实仍然非常粗浅,在此也没有必要照着 The Book 抄一遍。然而个人认为,目前在 Rust,或者说大部分编程语言的教学中,还是存在一些与我个人的期待不太相符的情况。康奈尔大学的 CS3110 课本中提出,学习一门编程语言要从五个方面入手,即 “syntax, semantics, idioms, libraries, and tools”。在语法层面,rustc 搭配 Rustlings 已经是远超大部分传统编程语言,足够优秀。在语义层面,各种教学资料,包括本次训练营第一阶段的课程,也都给出了非常详尽的解释。然而,我认为,尤其是对于像 Rust 这样一门极其复杂的编程语言,单纯对语法和语义做出解释是不足够的。在这一方面,CS3110 所采用的方式值得学习。对于 OCaml 中的每一个概念,其都以一种相对严谨的方式给出对于语法和语义的描述,尤其是考虑到 OCaml 同样复杂的类型系统,CS3110 将语义拆分为动态语义和静态语义进行讲解。初听起来,这么做似乎会加重学习者的压力,尤其是在学习的初期,在对于编程语言还没有一定认识的时候,就要接收接踵而来的一系列概念。然而,从我个人的角度看,其实不然。
以一种相对严谨而准确的方式来描述一门编程语言,对于学习时期,尤其是入门阶段,是由极大的好处的。首要的就是学习者能够直接理解并记忆语言的底层机制,从而避免对于语法和语义的模糊理解,尤其是在对于基础概念模糊不清时,还要强行应用这些概念,导致学习者感到身处云雾中找不着东南西北。一旦理解了底层机制,在日后的学习中,就几乎不会再出现模糊的问题。同时,这也十分有利于 Rust 语言以及社区的健康、长久的发展。
十分遗憾的是,Rust 并不(也不太可能)诞生于学术界,因此在发展的过程中,许多概念是以一种实用性而非精确、严谨的方式加入,而是在经过发展后再进行补正、修改。这样的方式允许 Rust 快速发展,不掉入 C++ 发展过程中的许多坑,避免了语言与其实际应用的脱节,却也在一定程度上导致了对 Rust 进行学术化的、精细准确的描述的高难度。当然,Rust 的火热也吸引了学术界的更多目光,Rust 的理论基础也已经在快速的发展中了,虽然我并不是学术界的人,却也能经常见到这方面的突破,Ferrocene、Rust标准团队、LLBC、Charon 等的出现也是一个非常好的标志,相信未来我们就能看到一个完善的 Rust 标准。
期待未来的 Rust

PS: 将 Rust 应用于编写操作系统这样关键性软件的举措是十分大胆的,在几年前我初见 rCore 项目时就这么认为,即使现如今相关生态逐步成熟,将 Rust 引入各类商业和学术环境中也是非常勇敢。为各位敢于将 Rust 应用于操作系统的教学、研究和实现中点赞!