2023年度Rust调查结果


Rust 调查团队分享了于 2023 年 12 月 18 日至 2024 年 1 月 15 日期间进行的 2023年 Rust 编程语言调查的结果。

2023年Rust编程语言调查结果显示,Rust用户数量略有增加,主要使用英语进行技术沟通。调查显示Rust在全球范围内得到了广泛应用,尤其在美国、德国、中国等国家。对于技术领域的沟通,有 6.1% 的用户选择使用中文

  • 调查表明:Rust用户希望改进Traits、Const execution和Async等方面的功能
  • 调查表明:Rust用户也关注编译时间、运行时性能和编译器错误等问题。
  • 调查还揭示了Rust在工作中的使用情况、用户对Rust的关注和担忧、以及用户对Rust未来发展的期望。

Rust 用户普遍认为 Rust 在工作中具有帮助,认可其性能、控制、安全性等特点,但也提出了关于 Rust 复杂性、未来担忧和改进优化的建议。

详细点击标题

Reddit讨论
有趣的是,与借用检查器相比,更多的人在异步(async)和特质/泛型(traits/generics)方面遇到了问题,而借用检查器通常被认为是学习 Rust 时最容易出问题的地方。
我想,经过一段时间的学习,你会学会如何与借用检查器合作,而不是与之对抗,然后它有时就会变成一个小麻烦。
这也清楚地表明,该语言的这两个部分最需要在今后的工作中加以改进(顺便说一句,这两个部分似乎进展顺利)。


异步有啥意义?
如果理解了借用检查器要解决的问题后,它就开始变得有意义了,那么异步有啥意义?

因为......十年前,事件驱动编程、"c10k 问题"(一万个并发连接)、nginx 如何比 apache 更好(因为它是事件驱动的,而不是预分叉/线程的)等风靡一时。
当然,nginx 只是一个大的状态机,用来管理一个由套接字(以及文件或其他 I/O)组成的多路复用的 epoll(或现在越来越多的 io_uring)阵列,它 "优雅地 "消除了创建新进程/线程的开销。
异步可以帮助你 "更优雅 "地做到这一点。

在某些问题上,这些绝对性能导向的异步架构是有意义的。(例如,在编写高频交易机器人或网络中间件(防火墙、路由器、vSwitch、代理服务器)前置软件时,就可以使用这种架构。

当然,预先分配的一切意味着扩大或缩小规模都需要重新配置/重启,也意味着一旦达到容量限制,就不会有优美的降级,请求/数据包会被丢弃等等。

如今,NUMA 和 SMP(以及多队列网卡和 NVMe 设备)已成为默认设置,"分割 "机器并并排运行多个进程通常是合理的......但这样一来,它们之间的工作分配可能就会出现问题,突然之间,你又回到了工作抢占队列(如果你想避免不平衡负载,通常在这种优化级别上会这样做,因为你想要一致性),以及由文件描述符和数组索引结构表示的工作单位,这又是nginx所做的(现在仍然在做),而tokio在这方面也有帮助。

考虑到 Rust 的首要目标--追求无畏的并发性,它也是为了帮助用户处理这些棘手的问题!
- 在 Rust 中,将线程模型推进到令人发指的程度非常容易。
(例如,使用队列和工作线程......你为自己构建了一个线程池执行器,如果你不需要async/await的所有花哨语义,那么......线程就可以工作,即使理论上你会留下一些 "可扩展性")。


异步很难
大多数其他语言都是通过以下方式掩盖这种复杂性的:

  • 闭上眼睛,假装整个概念不存在:Golang
  • 提供一套受限的高级控件,增加了易用性,但减少了控制:C#、JS
  • 是一个完全不正常的、无用的中间地带:Python
  • 所有工具、所有功能、所有风险:C/C++

语言级异步的缺点
异步编程的主要用例是支持大量(数千或更多)并发任务/线程,例如在网络服务器中。不过,如果只有少量并发任务(比如小于 100 个),那么生成普通的系统线程就可以了(即使是Web服务器),而且使用起来更简单(因为 Rust 中的 async 目前存在限制,而且缺乏 "函数着色")。

语言级异步 async 并不是实现轻量级任务的唯一方法,例如在Java21 中,他们选择了使用虚拟线程 的更 "开发人员友好 "的解决方案。这意味着无论您使用的是系统线程还是虚拟线程,代码看起来都基本相同(尽管仍有一些差异需要消除),因此无需学习语言中的特殊异步构造。一切都将由运行时和 stdlib 来处理。

不过,Java这种解决方案并不适合 Rust,因为它需要堆分配和运行时。