作者:谢经纬,人称“刀哥”,20年IT从业者,数据通信网络专家,电信网络架构师,现任Netwarps开发总监。刀哥在操作系统、网络编程、高并发、高吞吐量、高可用等领域有多年的实践经验,对网络和编程方面的新技术有着浓厚的兴趣。最近一直在学习和研究Rust。据说Rust的学习曲线很陡,确实有这种感觉。在学习Go之前,我基本上没有专门看语法。只是需要的时候上网查一下,然后花点时间看看大型的开源软件项目,差不多能写出生产级的代码了。但Rust并非如此。至少我花了将近两三个星期的时间专门学习语法。不过我还是觉得看开源项目很吃力,Rust的几种编码模式,尤其是异步模式,我也花了一些时间去了解,分为poll循环方法,combinator方法和.await协程方法。坑很多,填坑的过程相当费力。在两个月的学习过程中,遇到了很多问题,在网上看了很多文章寻找答案,也在微信上和有经验的开发者交流。我总体感觉Rust仍然是一门发展中的语言,不同版本之间存在一些差异,特别是Rust没有提供非常完整的运行时(也可以理解为开放,提供各种选项),异步编程模式和tokio和async-std等阵营分裂,相关资料在互联网也是鱼龙混杂。对于初学者来说,有可能迷失在一些错误的描述或各种自相矛盾的信息中,走远路。因此,在这里我用文字来梳理一下自己的学习过程和心得,希望对大家有所帮助。语法相对而言,Rust的语法比较特殊。由于生命周期和借用检查等独特的概念,语法可能看起来很复杂。作为现代编程语言,泛型被广泛使用,但也带来了代码可读性差的问题。相信所有初学者都会对包裹的泛型参数及其局限性感到头疼,可能需要一段时间才能适应。枚举类型Option替代了Null,错误处理Result也别具一格,但也让相关代码略显臃肿(个人经验,完成同样的功能,Rust代码总是比Go代码明显更长)。总之,学习Rust,语法是第一道门槛,需要一点耐心和韧劲。“安全”和“高性能”所有权的概念解决了内存安全和GC的问题,这是Rust语言的基石,也是整个系统的亮点。结合类型系统和特征限制(发送、同步),Rust以不太直观但极其优雅的方式指定了多线程编码的基本元素。也就是说,除非写了Unsafe,否则程序员无法在C/C++中制造常见的内存doublefree问题,也没有机会写出线程不安全的代码。这类问题基本上是大型软件项目后期的灾难。然而,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相关文章或教程。推荐的入门教程:?书籍:经典入门教程。个人觉得过于简洁,跳过了很多内容。?Rust通俗易懂:中文书籍,非常适合学习语法。内容很详细,有些地方略显陈旧。异步编程:?TheFutureWithFutures:文章有点老,但还是值得一读?AsynchronousProgramminginRust:tokio团队的异步编程教程,系统地讲解了异步编程的来龙去脉?Rust中的异步编程Rustwithasync-std:async-std团队关于异步编程的教程。有一个很棒的教程案例用于设计和实现聊天程序。这不是一个简单的例子,至少不是一个用unwrap写的...博客:?withoutboats的博客:著名的withoutboats,博客内容很多,应有尽有?stjepang的博客:crossbeam,smol的作者。smol现在是async-std的底层支持。作者的博客详细介绍了executor的实现细节?snoyman'sBlog:详解asyncfn的原理,值得一读。中文博客里有一系列关于Rust的精彩文章:?最近学写async/await被Rust打脸:这篇文章作者写的很形象很具体,里面提到的问题都是亲身经历?RustAsync:AtomicWaker深度解析:深度解析waker深圳市星联网络科技有限公司(Netwarps),专注于互联网安全存储领域的技术研发与应用,是一个高级安全存储基础架构提供商。主要产品有去中心化文件系统(DFS)、区块链基础平台(SNC)、区块链操作系统(BOS)。微信公众号:网华