有更新的动力了
阅读本文大概需要 9 分钟。
大家好,我是 polarisxu。
距离 Rust 劝退序列第 9 期更新已经有一段时间了,新的一期一直没有更新,也没怎么见催更,可能大家已经忘了这事。也许适合全部写完后,不间断的定期更新,大家阅读形成规律。
另一方面,不少人对 Rust 的认知还是不够的,更多会听到说 Rust 难学。从一些信息看,给我的感觉,Rust 有点和 Vim 类似,上手不容易,但只要上手了,就会扔不掉,至少其中的某些点会让你受用终生。比如 Vim 中的模式和快捷键,我现在各种编辑器都会设置 Vim 模式,包括浏览器都装上了 Vim 插件,使用 Vim 模式和快捷键。
StackOverflow 的调研显示,连续六年,Rust 都被评为最受喜爱的编程语言,这里指的是用过 Rust 的人大部分都喜爱。当然,也许不喜爱的人从此不用了?或难以入门就放弃了。
鉴于大家工作中基本还用不到 Rust,对 Rust 能干嘛,很多人可能不清楚。这里对 Rust 的相关情况做一个梳理,方便大家对 Rust 总体上有一个更全面的认识。
01 Rust 的特点
Rust 是一个静态类型的多编程范式语言,专注于安全性和性能。
关键词:静态、多范式、安全、性能
Rust 解决了 C/C++ 长期以来一直难以解决的问题,比如内存错误和构建并发程序。所以,C/C++ 用户大概率会喜欢上 Rust。
Rust 有三大好处:
得益于编译器,Rust 拥有更好的内存安全; 得益于数据所有权模型,Rust 中没有数据竞争,可以更好的进行并发编程; 零成本抽象;
内存安全
Rust 一般进行系统编程,而系统编程常常需要对内存管理进行低级控制,这方面 C 语言的手动管理经常会出现各种问题。Rust 的所有权系统在编译时分析程序的内存管理,以确保不会发生由于内存管理不当而导致的错误,并且不需要垃圾收集。
一直以来,编程语言要么选择用户自己管理内存,要么编译器负责管理内存,即提供 GC。然而,Rust 另辟蹊径,既不用用户自己管理,也不需要 GC。
当然,Rust 也允许和 C 类似的自己控制内存(通常不建议)。
更简单的并发
由于借用检查器,Rust 可以在编译时防止数据竞争。当两个线程同时访问相同的内存时,就会发生数据竞争,这可能导致一些讨厌的、不可预知的行为。值得庆幸的是,防止未定义行为就是 Rust 会处理的事情。
零成本抽象
零成本抽象确保你使用的抽象实际上没有运行时开销。简而言之:低级代码和抽象代码在速度上没有差别。也许你感受不到这个事情的牛逼之处,看两个例子:
微软在过去 12 年中解决的问题中,大约有 70% 是内存错误。谷歌浏览器也是如此。
02 Rust 的应用场景
一般地,当你需要从所拥有的资源中挤出更多时,Rust 是非常有用的。因为它是静态类型的,所以类型系统可以帮助您在编译期间阻止某些错误。
下面是一些 Rust 的应用场景:
强大的跨平台命令行工具。这方面,GitHub 上有很多开源的项目,很多工具 Rust 进行了重写,效果、性能都很不错; 分布式在线服务; 嵌入式设备。嵌入式开发,之前一直是 C 语言的天下,现在 Rust 也是很好的选择; 区块链领域; 其他需要进行系统编程的地方,比如浏览器引擎、Linux 内核等;可以替代 C/C++ 的很多场景;
此外,Rust 在游戏后端、Web 编程方面也有一席之地。
要特别强调的一个应用场景是 WebAssembly。
过去,浏览器能够运行 HTML、 CSS 和 JavaScript,HTML 负责结构,CSS 负责外观,JavaScript 负责交互。但是,JavaScript 不具备运行计算密集型应用程序(如游戏)所需的可预测的快速性能。(这是由于垃圾收集器和动态类型。)
在这方面,我们需要 WebAssembly 的帮助。它是一种适用于浏览器的语言,可以作为任何语言(如 Rust、 Python、Go)的编译目标。这意味着你基本上可以用任何现代编程语言编写代码,然后把它放到浏览器中。
与其他语言相比,Rust 非常适合编写代码来编译到 WebAssembly。
最小运行时。WebAssembly 没有自己的运行时,因此需要随代码一起发布。运行时越小,用户需要下载的东西就越少。 静态类型。由于 Rust 是静态类型的,因此编译器可以使用这些类型来优化代码,所以它可以编译成一个更高效的 WebAssembly。 先人一步。最重要的是,Rust 已经全心全意地拥抱了 WebAssembly。Rust 已经有了一个非常棒的社区和工具来编译到 WebAssembly,可以说这是这三者中最重要的优势。
最后,国内字节的飞书,在 IM 方面使用 Rust;PingCAP 的 tikv 使用的 Rust 等,据说清华大学本科已经开始学习 Rust,而不是 C/C++。
这张图较好的阐释了 Rust 的应用场景:
03 为什么学以及如何学
为什么学 Rust?对我来说,这是一门「与众不同」的语言,它的设计值得学习,借用、生命周期、所有权,这些东西虽然难理解,但新颖、另辟蹊径,值得了解。因此,我认为 Go 爱好者应该对 Rust 有所了解,比如它竟然没有 GC 做到自动内存管理,做到并发编程没有数据竞争。。。
此外,对于从事或将来可能从事上面介绍的领域,Rust 不失为一种好的选择,学 Rust 是值得投资的事情。
怎么学呢?相比 Go,Rust 学习确实不容易,这需要一定的毅力。之前,我介绍过相关的图书。不知道大家学习下来感觉如何?
今天看到了另外一个高效学习 Rust 的方法:即极客时间刚出的《Rust 第一课》。这是由陈天主讲的,陈天现任北美最大的免费流媒体服务 TubiTV 的研发副总裁,18 年始终致力于高性能系统的研发工作。
经验丰富,涵盖网络协议、网络安全、服务端架构、区块链以及云服务等诸多热门领域,他一直主张“以合适的工具解决合适的问题”,所以,当面对不同的工作需求,他坚持深度使用形态和机理都大相径庭的开发语言。
用 C 和汇编打造过各种网络协议,维护过在网络安全领域非常知名的嵌入式操作系统 ScreenOS;
用 Python/Javascript 撰写过曾经的创业项目途客圈;
用 Node.js/Elixir 打造过 TubiTV 高并发的后端核心;
用 Elixir 打造过区块链框架 Forge;
也研究过 Haskell/F#、Clojure/Racket、Swift、Golang 和 C#等其他语言。
可以说,他对各个语言都了如指掌,这种资历的大佬能来开课,把自己独特的 Rust 学习方法和经验共享出来,真的很难得。下图是陈天总结的 Rust 学习路径:
整个专栏总结了一套系统的 Rust 入门路径,由浅入深,对比多种语言,带你攻克 Rust 编程 10 大难点,有 100+ 原理图,详解 Rust 设计理念。最后通过 4 个项目实操训练,理论与实战两手抓,真正让你掌握 Rust 开发精髓。
具体来看,整个专栏分成 5 个模块:
1.前置知识篇
回顾软件开发的基础概念:堆、栈、函数、闭包、泛型、同步和异步等。这些是学好任意一门编程语言都要吃透的概念,因为编程语言不过是这些概念的具体表述和载体。
2.基础知识篇
深入浅出地探讨 Rust 变量的所有权和生命周期,对比几种主流的内存管理方式,包括 C 的手工管理、Java 的 GC、Swift 的 ARC 和 Rust 的独特方案。之后围绕所有权和生命周期,来讨论 Rust 的几大语言特性:函数式编程特性、类型系统、泛型编程以及错误处理。
3.进阶篇
Pascal 之父,图灵奖得主尼古拉斯·沃斯有一个著名的公式:算法 + 数据结构 = 程序,想随心所欲地使用 Rust 构建数据结构,深度掌握类型系统必不可少。所以将重点介绍 Trait、Trait Object、泛型、Unsafe Rust、 FFI,用 Rust 为自己的主力语言在关键路径上提供更高性能。
4.并发篇
学会用最合适的工具解决最合适的问题很重要。这个模块将带你从底层的 atomics 一路向上,历经 Mutex、Semaphore、Channel,直至 actor model,探索不同的并发手段。你会深度了解到,其他语言中被奉为圭臬的并发手段,在 Rust 里,只不过是一种并发工具。
5.实战篇
单纯掌握语言特性,能写出解决一些小问题的代码,就像在游泳池里练习冲浪,算是初窥门径;想要真正把语言融会贯通,还要靠大风大浪中的磨炼。这个模块会带你学习如何把 Rust 应用在生产环境中,以及如何用 Rust 解决实际问题。
今日订阅福利
1、新人首单,仅需 ¥59.9。早鸟 + 口令「Rust66666」立省 ¥40 到手仅 ¥89,原价 ¥129。
2、今日订阅,可加入「陈天老师的 Rust 交流群」,跟大家一起讨论干货、交流技术、学习成长。陈天老师后续也会进群带着大家学习。
跟着一起学,努力将「劝退系列」继续搞起来~一起加油!
点击「阅读原文」,只要 89 元,掌握“Rust 开发" 这个大技能,让 Rust 成为你的下一门主力语言,不亏。