该不该在 Rust 上做点投资?

简介: 问题不是“该不该”,而是“怎么来”?

作者 | 雷卷
来源 | 凌云时刻(微信号:linuxpk)


前言

Rust 在 Stack Overflow 上连续5年被评为最想学习的编程语言,一直备受好评,所以这篇文章完全就是标题党,当然必须投资,明眼人都知道,也不需要我来为Rust摇旗呐喊。

image.png

下面内容是我个人一些学习点滴,同时结合我平时工作的一些情况,探讨一下 Rust 的可行性,算是落地场景讨论吧。

当然你可以理解为一个Up主做直播,没有什么话题,就是和大家随便聊聊技术,不过我这个是文字版的。


Rust 和云

微软的这篇文章 Microsoft: Rust Is the Industry's 'Best Chance' at Safe Systems Programming 阐述的非常清楚,云是工业级的产品,当然需要工业级的安全系统。这里的安全不是指互联网安全等,而是软件开发中的 Memory Safe、Type Safe 和 Thread Safe等,这样才能保证产品的运行其的稳定性。

我们知道新产品发布后,接下来一段时间基本就是各种 bug 修复,这些 bug 通常不是业务上的 bug,而是代码级别的 bug,比如内存溢出啊、空指针、并发控制没有做好导致数据错误等等。这些 bug 都很难被测试出来,如果有一个好的开发语言能帮助消除这方面潜在的很多问题,是不是非常好?

性能,这个大家不用担心,Rust is as fast as C and C++。

我非常认同文章中的观点,Rust 是非常好的基础设施类云产品开发语言,这是稳定性的保障,也是对客户负责。大家都说用互联网的思维做云产品,但是云厂商的重要客户都是企业客户,稳定性保障是第一位的,可能让企业来用自己的业务来为云产品试错。

另外一个消息:Programming languages: Now Rust project looks for a way into the Linux kernel, 也就是 Linux 内核可能拥抱 Rust 语言,当然 Linus Torvalds 是已经认可啦。

image.png


产品 Rust SDK 开发

使用 Rust 开发基础设施云产品的优点就不赘述啦!性能好、稳定性高。

如果我们做不到产品用 Rust 开发,那么是不是普通程序员就不能接触 Rust 啦?完全不是,这里有一个产品
Rust SDK 开发。很多云厂商的中间件产品都是 Java 语言、Cpp 语言开发的,我们都需要开发不用开发语言的 SDK,如 Java SDK、Python SDK 等。

那么产品的 Rust SDK 有什么不同之处吗?这里我给你解释一下。这里我们就举 Alibaba Dubbo 的例子吧,如果你不知道 Dubbo,现在只要理解为分布式 RPC 调用框架就可以。Dubbo Rust SDK 有以下一些特点:

  • 为Rust应用提供访问 Dubbo 的服务支持

如果客户的系统本来就是采用 Rust 开发,那么通过Rust访问 Dubbo 服务,这个需求应该没有什么好反驳的吧?要知道 Rust Web 框架 Actix-web 在性能测试中是排名靠前的。当然对 Dubbo Rust SDK,尤其针对IO和网络这一块,基本上都是通过 Tokio 实现的,所以默认就是支持异步化的,性能当然也是非常高的。

稍等一下,写一个涉及网络调用的 SDK 哪那么简单啊?

你就说一下使用 Tokio,还是有非常多的工作量的,不是那么好写的。 理论上是这样的,但是如果你看一下 Tokio 0.2.22版本的 tutorial ,你会发现就非常简单啦!这个 tutorial 不是告诉你如何写一个 Echo Server & Client,而是告诉你如何实现一个 Mini Redis,文档和代码样例都非常全,你只要一些调整,估计就能初步实现产品 Rust SDK 的功能。

image.png


  • 为 Rust WebAssembly 提供访问 Dubbo 支持

我们知道 WebAssembly 当前首选语言是Rust,假设你想在 WebAssembly 中访问 Dubbo 服务,如在浏览器中,我们只需要做 WebSocket 适配,在 WebAssembly 独立运行环境,我们可以通过 WASI Socket 来访问 Dubbo 服务。而针对 Wasm 的 Rust SDK 基本就是共享 Rust SDK 代码,然后做一些修改。

当然 WebAssembly 还承担着通用开发包(Universal Library)的角色,如果大家看过 wasmtime demo 的例子就应该能理解。


  • 为 Deno JavaScript / TypeScript 提供访问 Dubbo 支持

这里我们不想讨论 Node.js 和 Deno 谁是最后大赢家的问题,假设一些 JavaScript / TypeScript 的开发工程师选择了 Deno,我们知道 Deno 是基于 Rust 构建的,通过 Deno Plugin 为 JS / TS 提供调用接口,然后通过对应产品的 Rust SDK 实现,这样你不需要做太多的工作,使用 Deno 平台的同学就可以通过 JS / TS 访问你发布的服务啦。

Node.js 的开发者众多,但是我们都知道使用C++开发一个 Node.js 扩展不是那么容易的,只有极少数的同学有这个能力。那么开发一个 Deno Rust Plugin 复杂吗?可以说是非常简单,你只需要参考一下 Calcite 框架, 有非常好的文档和样例,同时结合一下 https://crates.io/ 上的开发包,开发一个高质量的 Deno Rust plugin 非常简单。


  • 为 C 语言提供访问 Dubbo 服务支持

如何为 C 语言提供 Dubbo 的访问支持?如果你问这个问题,估计会被打死的,但是没有关系,假设一些 ARM 设备的 C 程序想访问 Dubbo 服务,我们完全可以通过 Rust FFI 导出 cdylib 库,提供给C语言调用,这样省去我们开发 C SDK 的成本,而且这个成本并不低。我之前还想给 RSocket 写一个 C 的 SDK,仔细想了一下还是放弃啦,现在打算通过 Rust SDK 来为 C 提供访问接口。如果 C 能访问,那么基于 C 之上的一些小众语言,如 Lua 等,是不是也是可以访问 Dubbo 服务的。


  • 为其他语言提供运行期支持

上面我们谈到了 Rust SDK 通过 FFI 为 C 语言提供对应的 SDK,同样原理还可以套用到其他语言上,典型的就是 Calling Rust From Python,这个网上一堆案例,同样的还试用于 Ruby 语言。Java 有没有对应的案例呢?有的,就是 java-ext-wasm 这个项目,也就是在 JVM 中内嵌 WebAssembly 运行期环境,来运行 WebAssembly,而这个 WebAssembly Runtime 就是 Rust 编写的。


Rust 的开发者体验

Rust 的开发体验非常好,我们都知道 JavaScript 的开发者体验基本是 No.1 的,所以我们就不拿 Rust 和 Golang、Java 来对比,我们直接看一下 Rust 和 JavaScript 的开发体验对比,如下:

image.png

个人觉得 Rust 一些方面比 JavaScript 还好,如内置单元测试支持、example 样例支持、 文档 doc、代码格式化 format、Clippy(Linter) 等支持,这个是比 JS 要好一些的。

如果你拿 C++ 和 Rust 做开发者体验对比,那简直是地下和天上,诸如 Linux、Windows 和 Mac 平台的一致性等,这些都是 C++ 无法 Rust 对比的,更不用说 Rust 还有 https://crates.io/ ,这个也是 C++ 没有的。

目前来说,Rust 一个不好的开发者体验就是编译速度太慢,没有办法,编译器做了非常多的工作,但是好像有一个 sccache - Shared Compilation Cache 能提升编译速度,这个我还没有使用过,可能是我的项目都不够大,我还没有遇到编译速度非常慢的情况,基本还能接受。 当然 Rust 社区也在讨论 pre-built 依赖问题,可能需要一些时间。


Rust 没有想象的那么复杂 学习成本没有那么高

讲到这里,一定有同学想尝试学习和了解Rust,那么学习成本高不高?个人觉得要从几个方面来看。

  • 学习资料

在所有的开发语言中,Rust 的文档是最好的,没有之一。https://www.rust-lang.org/learn 上的《The Rust Programming Language》 可以说是最好的学习图书,完全免费,且更新比较快。个人觉得质量堪比 Pragmatic Bookshelf 的《Programming Ruby》,但是 Rust 是免费的,而且经常更新的。当然其他 Rust 相关的文档,如 Rust By Example,Rust WebAssembly 等,文档质量都非常高。

另外大家都喜欢的 Cheat Sheet,你看一下 Rust 的 Cheat Sheet,就明白啦。 https://cheats.rs/

当然其他语言也有对应的文档,但是我想问一下有几个 Java 开发者是去 Oracle Java 站点学习 Java 的?但是 Rust 做的就不一样,所有的学习文档都堪称一流,让你学习无压力。


  • Rust Module 理解起来不容易

确实刚开始一头雾水,我觉得这篇文章 Clear explanation of Rust’s module system 非常好,废话多说无益,看完后基本全明白啦!

image.png


  • Rust Ownership

刚接触的同学非常头痛,至少我是,但是这也是 Rust 的特点,没有 GC,但是能做到 GC 差不多的效果,当然要走不同寻常路。但是也没有那么头痛,找几篇 Rust Ownership 的文章看一下,就可以啦。另外我推荐一下这个站点,这个老头的 Rust 教学视频非常好,非常容易理解, 资料也比较多,相信你看啦就明白啦,你只需要一个好的指导。

image.png


  • Rust Enum

Rust 的 Enum 功能非常强大,这个要特别留意一下,个人觉得 Swift 的 Enum 能和 Rust Enum 有一拼。我们经常看到其他语言中的 Result、Optional 等,在 Rust 中都是通过 Enum 实现的。


  • Tokio

Rust 其他的特性我就不说啦,其他语言都有。这里说明一下 Tokio。

Tokio 是 Rust 下的异步化框架,其地位相当于 Netty 在 Java 的作用,知名的 Deno 框架就是基于 V8 + Rust + Tokio 构建的。如果你有 JavaScript 的经验同时了解 Promise,那么 Tokio 的 Future async / await 和 JavaScript 的 Promise async / await 差不多,Tokio 的 Asynchronous stream 和 JavaScript 的 AsyncIterableIterator 也类似,学习的成本并不高。如果是 Java 程序员,可能理解起来有些吃力,但是如果你了解 Java 下的 Reactive 框架,如 RxJava 和 Reactor,那么理解起来也比较容易。


总结

当然这些是个人学习、编写一些 Rust Demo 和 Deno 了解等得出的结论,没有什么大道理,就是落实在一些点上,当然也就不可能非常全面,也就提供给你参考一下。

最后,学习一门语言,千万不要听什么语言大师的,就是自己看资料、写 Demo、同时多看一些知名开源软件的代码,然后自己得出结论,哪怕是那种从入门到放弃的那种。

另外大家都可以参考一下 Considering Rust,帮助你更好地了解 Rust。

扫描下方二维码关注“凌云时刻”公众号回复“Rust”获取Considering Rust演讲文稿PDF

image.png

目录
相关文章
|
3天前
|
Rust 安全 程序员
|
3天前
|
Rust 安全 程序员
Rust vs Go:解析两者的独特特性和适用场景
在讨论 Rust 与 Go 两种编程语言哪种更优秀时,我们将探讨它们在性能、简易性、安全性、功能、规模和并发处理等方面的比较。同时,我们看看它们有什么共同点和根本的差异。现在就来看看这个友好而公平的对比。
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十三)(1)
Rust vs Go:常用语法对比(十三)(1)
63 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(七)(1)
Rust vs Go:常用语法对比(七)(1)
48 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(四)(1)
Rust vs Go:常用语法对比(四)(1)
122 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十三)(2)
Rust vs Go:常用语法对比(十三)(2)
73 1
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十二)(2)
Rust vs Go:常用语法对比(十二)(2)
59 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十二)(1)
Rust vs Go:常用语法对比(十二)(1)
64 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十一)(2)
Rust vs Go:常用语法对比(十一)(2)
55 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十一)(1)
Rust vs Go:常用语法对比(十一)(1)
48 0