作者:谢敬伟,江湖人称“刀哥”,20 年 IT 老兵,数据通信网络专家,电信网络架构师,目前任 Netwarps 开发总监。刀哥在操作系统、网络编程、高并发、高吞吐、高可用性等畛域有多年的实践经验,并对网络及编程等方面的新技术有浓重的趣味。
近段时间在学习钻研 Rust。都说 Rust 学习曲线平缓,感觉果然如此。之前学习 Go,基本上没有专门去看语法,只是在须要的时候上网查一查,再花点工夫看看大型的开源软件我的项目,差不多就能够写生产级别的代码了。而 Rust 则不然,至多自己花了差不多两三周的工夫专门学习语法,然而去看开源的我的项目仍然感觉很吃力,又花了一些工夫才搞明确了 Rust 的几种编码模式,特地是异步模式,又分为 poll 循环的形式、combinator 形式和.await 协程的形式,各种坑比拟多,填坑的过程还是比拟吃力的。
整个大概两个多月学习过程中,已经碰到过很多的问题,在网上浏览过很多的文章寻找答案,也和有教训的开发者进行过微信交换,总体感觉 Rust 还是一个正在倒退中的语言,不同版本之间有一些差别,特地是 Rust 并没有提供一个十分残缺 runtime(也能够了解成是凋谢的,提供了各种选项),异步编程模式还有 tokio 和 async-std 这样的营垒决裂,网上相干的材料也是泥沙俱下,对于初学者而言,有可能迷失在一些谬误的形容或者互相矛盾的各种材料中,走一段冤枉路。故而,在这里用文字将本人的学习历程和心得体会整理出来,心愿可能对别人有所帮忙。
语法
相对而言,Rust 的语法是挺特地的。因为有生存周期和借用查看这类独有的概念,所以语法上看上去比较复杂。作为一种古代编程语言,大量应用了泛型,然而也带来代码可读性较差的问题。置信所有的初学者都会对层层包裹的泛型参数及其限定感到头痛,可能须要破费一段时间来适应一下。而枚举类型 Option<T> 代替 Null,错误处理 Result<T,E> 也是有特色的中央,然也导致相干的代码略显臃肿(集体领会,实现雷同性能,Rust 代码篇幅总是较之 Go 代码显著更长)。总之,学习 Rust,语法是第一道门槛,须要一点急躁和韧性。
“平安”和“高性能”
所有权概念解决内存平安和 GC 的问题,是 Rust 语言的基石,也是整个零碎的亮点。联合 Type 零碎和 Trait 限定(Send, Sync),Rust 用一种不那么直观但极为优雅的形式规定了多线程编码的基本要素。也就是说,除非写 Unsafe,否则程序员无奈制作出 C /C++ 中常见的内存 double free 问题,也没机会写出线程不平安的代码,这类问题在大型软件我的项目前期根本都是劫难。然而,Rust 并不能解决代码的逻辑谬误。咱们一样会碰到内存透露,多线程死锁之类的问题。个别看来,多线程死锁差不多也是劫难级别的问题。此外,对于高性能,很多时候是 Unsafe 的同义词,而应用 Unsafe,Rust 就进化为 C 语言。因而,对于 Rust“平安”和“高性能”,须要有一个辩证的意识。
同步,异步
Rust 提供凋谢的选项,怎么写代码是程序员的抉择。同步的代码比拟间接,把握了 Rust 语法就可以看懂,容易上手。当然,如果仅仅是同步模式多线程的代码,Rust 差不多相当于一个增强版的 C ++。同步模式的代码与异步模式代码的观感上差异很大。或者说,没有专门学习过异步编程模式,很可能齐全看不懂异步的代码。异步模式对于器重 I / O 吞吐的利用场景意义重大,支流编程语言纷纷退出了异步模式的反对,特地是 Go 原生反对且只反对异步模式。然而,Rust 异步编程模式须要学习除语法之外的更多内容,多了不少新的概念,还有不同格调写法,把握起来有肯定难度。类库还有诸如 tokio 与 async-std 的不同营垒,无疑很大水平地又减少了学习的难度。而无论 tokio 或是 async-std,成熟度都有欠缺,远远不如 Go 简略易用。然而对于应用异步编程模式的开发人员,还是很有必要理解异步模式的工作原理和技术实现,否则,面对一些绝对简单的问题可能就大刀阔斧了。
第三方类库
Rust 因为其高门槛,注定就是小众的。目前来看,第三方类库可能提供的轮子数量无限,品质堪忧,与同样号称零碎编程语言的 Go 差距微小,在劳动生产率上无奈等量齐观。如果从头开始一个大型项目,是否选用 Rust,取舍值得三思。到底须要“平安”和“高性能”,还是疾速开发,尽早交付?
开发工具
这一点须要使劲吐槽。相较于应用 Goland 进行 Go 开发的轻松愉悦,应用 Clion 进行 Rust 开发堪称惨不忍睹。编辑器无奈很好地了解或开展 Rust 宏,因而语法提醒等性能都会生效,有点盲人摸象的感觉。调试器断点不牢靠,很多时候被迫祭出 printf 大法,调用栈很难提供有用的信息,被层层包裹的变量无奈查看,等等。如果说 Goland 能够打 9 分,那么 Clion 只能是不及格。另外,已经尝试过 VSCode,感觉还不如 Clion。展望未来,随着 Rust 被更多认可并失去更多反对,开发工具的改善和进步是能够预期的,特地是调试器,针对 Rust 做相干的优化后置信体验会大幅改善。然而,因为 Rust 语法的复杂性以及大量依赖泛型的个性,冀望 Rust 开发工具的体验成果达到 Go 开发工具的水平,预计不大事实。
网上各种材料
相较于宽泛风行的 Java,Go 等语言,Rust 的生态不可同日而语,相干材料、文献不够丰盛。特地不足高质量的中文原创内容。不少的翻译文章,原文内容丰盛,品质很高,但译者可能并没有齐全了解原文的精华,很多中央直译了事,没能讲到点子上。这时候,倡议读者找到原文比照浏览。几位 Rust 外围开发人员的博客,倡议关注
Rust 相干的文章或教程举荐
入门教程:
• Book:经典入门教程。集体感觉过于简练,略过了很多内容。
• 深入浅出 Rust:中文书籍,作为语法学习很不错。内容详尽,个别中央稍显古老。
异步编程:
• The Future With Futures:文章有点长远,但还是值得一读
• Asynchronous Programming in Rust:tokio 团队对于异步编程的教程,系统性地解说了异步编程的前因后果
• Async programming in Rust with async-std:async-std 团队对于异步编程的教程。外面有一个十分棒的设计实现聊天程序的教程案例。这不是一个简略的示例,至多不是用 unwrap 来写的简略示例…
博客:
• withoutboats’Blog:驰名的 withoutboats,博客中有十分多内容,方方面面
• stjepang’s Blog:crossbeam,smol 的作者。smol 当初是 async-std 的底层撑持。作者博客中详尽地介绍了 executor 的实现细节
• snoyman’s Blog: 解说了 async fn 的原理,值得一读。博客中有一系列对于 Rust 的精彩文章
中文:
• 最近学写 async/await 被 Rust 毒打的教训:这篇文章作者写得十分活泼具体,外面提到的问题都是亲自领会
• Rust Async: 深度剖析 AtomicWaker:对于 waker 的深入分析
深圳星链网科科技有限公司(Netwarps),专一于互联网安全存储畛域技术的研发与利用,是先进的平安存储基础设施提供商,次要产品有去中心化文件系统(DFS)、区块链根底平台(SNC)、区块链操作系统(BOS)。
微信公众号:Netwarps