查看原文
其他

【2023 Week-1】Rust视界周刊 | 用 Rust 和 C++ 代码编译时间同样糟糕吗?

张汉东 觉学社 2023-01-14

GitHub 阅读地址:https://github.com/RustMagazine/rust-horizon-2023

社区热点

Rust 官方正在讨论为 Rust 提供 interoperable_abi features gate

interoperable_abi[1] 意味着提供一个新的 Rust ABI   extern "interop"  和 repr(interop) ,用于实现有安全数据 类型的高级编程语言之间的互操作性。

动机摘要:

目前 Rust ABI 并不稳定,多语言交互只能通过 C-ABI 来进行。但是这限制了在 ABI 之间使用更高级的安全类型。可互操作的 ABI 将定义一种标准方法来跨高级语言进行调用,传递高级数据类型,而不需要将其降级为 C-ABI。该 ABI 将与任何提供 C 兼容 FFI 的语言(包括 C本身),并且语言还可以为可互操作的 ABI 添加特定的更高级别的支持。可互操作的 ABI 旨在成为 静态和动态形式的编译库(包括系统库)的合理默认值。

可互操作的 ABI 将是 C ABI 的严格超集。

可互操作 ABI 不支持的内容摘要:

  • 可互操作的 ABI 并不旨在支持整个Rust 标准库.
  • 可互操作的 ABI 不会旨在支持复杂的生命周期处理
  • 可互操作的 ABI(至少在第一个版本中)不会以源代码或编译形式提供接口描述语言(IDL)
  • 可互操作的 ABI 的目的不是在不同语言的表示之间提供“翻译”
  • 可互操作的 ABI 不能支持任意的编译时泛型函数

GCC-rs 项目在 2022 年取得了很大进展

gccrs是一个旨在为 GNU Compiler Collection 带来对 Rust编程语言的支持的项目。其目标是从头开始为 Rust 编程语言编写一个新的编译器前端,将该前端集成到 GCC 中,使其作为一种语言与 C、C++、Ada、D、Go 一起使用。

该项目最初于 2014 年启动。当时,Rust 尚未实现稳定版本(Rust 1.0 于 2015 年 5 月发布),对于单个开发人员来说很难跟上高强度的变化。2019年又开始努力,此后一直在稳步进行。

2020 年,菲利普·赫伦 ( Philip Herron )开始获得资金支持,随后他得以开始全职从事该项目。此赞助来自 Open Source Security公司。Philip 受雇于 Embecosm 并从他们的管理中受益,并得到 GCC 指导委员会的支持。2022 年,在将近一年半的单飞之后,Philip 加入了另一位由 Open Source Security 公司资助的全职工程师 Arthur Cohen ,也受雇于 Embecosm。现在有两名工程师每周为该项目投入 40 小时。

2022 年发生的最引人注目的事件是将 gccrs 合并到 GCC,gccrs 将在 2023 年 4 月发布的 GCC 13.1 版本中可用。

更多内容参考 gccrs 2022 年报[2]

P.S 与 gccrs 对应的是另一个项目 rustc_codegen_gcc。它是作为 Rust 编译器 GCC 后端,目前也正在积极开发中,感兴趣可以关注rustc_codegen_gcc:进度报告#19[3]

用 Rust 和 C++ 代码编译时间同样糟糕吗?

原文[4]作者写道:

C++ 因其缓慢的构建时间而臭名昭著。“我的代码正在编译”是编程世界中的一个梗,而 C++ 让这个笑话流传开来。


像 Google Chromium 这样的项目 在全新硬件上构建需要一个小时,在旧硬件上构建需要 6 小时。即使有数千美元的云计算能力,Chromium 构建时间仍然在六分钟左右。这是我完全不能接受的。人怎么可以每天这样工作?

作者也听说,Rust 也面临相同的问题,但他有实证精神,亲自动手证明一下 Rust 是不是和 Cpp 一样很慢。

这是他的计划:

  • 查找开源 C++ 项目。
  • 从项目中提取一部分为迷你项目中。
  • 将 C++ 迷你项目的代码逐行重写为 Rust。
  • 优化 C++ 项目和 Rust 项目的构建工具链。
  • 比较两个项目之间的编译+测试时间。

经过这样的测试,作者得出最终结论:

  • 编译时间是 Rust 的问题吗?是的。有一些提示和技巧可以加快构建速度,但作者没有找到神奇的数量级改进,否则作者将很高兴使用 Rust 进行开发。
  • Rust 的构建时间和 C++ 一样糟糕吗?是的。对于更大的项目,Rust 的开发编译时间比 C++ 更短,至少作者的代码风格是这样。
  • 对于完整构建,C++ 构建花费的时间与 Rust 相比,大致相同(17k SLOC)或花费更少的时间(100k+ SLOC),而不是更长。
  • 对于增量构建,与 C++ 相比,Rust 构建有时更短,有时更长(17k SLOC)或更长(100k+ SLOC),但并不总是更长。
  • 很欣赏 Rust 的工具链(尤其是 Cargo、rustup 和 miri)。

应用实践

Gama 发射的太阳帆宇宙飞船中使用了 Rust

Gama[5] 将发射太阳帆宇宙飞船🛰️,并且是公开将 Rust 送入太空的公司之一。提供软件服务的应该是这家公司:Tweedegolf[6] ,该公司也是 Rust 基金会银牌会员。他们的开源仓库[7]里有一个 Rust 实现的 PTP (精确时间协议) 库,这个PTP一般用在卫星的时间源,比NTP更精确。但这个是 PoC 实现,不知道这次发射的飞船上有没有用。从另外的项目 嵌入式开发板 pcf85063a (一般用于计时闹钟)rust 驱动来看,这次上天的 Rust 程序很可能和精确计时相关。

Gama 太阳帆的卫星于 2023 年 1 月 3 日由 SpaceX 猎鹰 9 号成功送入轨道[8]

生态看点

svix-webhooks:企业级 Webhooks 服务

svix-webhooks[9] 是基于 Rust 实现的企业级 Webhooks 服务器。Svix 使开发人员可以轻松发送 webhook。开发人员进行一次 API 调用,Svix 负责可交付性、重试、安全性等。

turmoil:开发和测试分布式系统的框架

Tokio 发布了[10]用于开发和测试分布式系统的框架 turmoil[11] 的初始版本。

测试分布式系统很难。不确定性无处不在(网络、时间、线程等),使得难以实现可重现的结果。由于部署,开发周期很长。所有这些因素都会减慢开发速度,并且难以确保系统的正确性。turmoil力求通过模拟主机、时间和网络来解决这些问题。这允许整个分布式系统在单个线程的单个进程中运行,从而实现确定性执行。

cargo-sandbox 发布

cargo-sandbox[12] 打算成为 cargo 的一个近乎直接的替代品。关键的区别在于,cargo-sandbox 在 docker 容器中运行相关命令,目的是将潜在的恶意代码与主机环境的隔离开来(关于威胁模型的更多细节,见README)。其目标是尽可能地接近 "100%"的兼容原版 cargo,并获得最顺畅的体验。

Rust 中的深度学习:Burn 0.4.0 发布以及 2023 年的规划

Rust 深度学习框架Burn[13] 0.4 完成了后端重构,除此之外,还实现了很多新的功能,如ADAM优化器、转化器模块等。下一个重点将是增加视觉相关的模块,如卷积和池化层。

shura-一个安全的2D 游戏引擎,易于创建易于管理的游戏

shura[14] 是rust编写的一个安全,快速并且跨平台的游戏框架。shura使用一个2D组件系统、场景管理和group系统帮你管理一个大型游戏。

shura主要的目标是,你的游戏逻辑可以分别放在不同的组件、group和场景中。

rumqtt: 构建  mqtt  的 Rust 生态

rumqtt[15] 是一组用 rust-lang 编写的开源库,用于实现 MQTT 标准,同时力求简单、健壮和高性能。

rumqtt 是 Bytebeam 物联网咨询公司开源的 MQTT 代理。rumqtt 目前版本已经发布到了 R19 版,并未按语义化版本来发布。

目前发布了 R19 新版本:

  • 新的版本提升了性能和可靠性(可以支持 多达 10,000 多个 MQTT 客户端,使用 mqttwrk[16] 进行基准测试)
  • 添加了一个用于测试 rumqttd 的公共服务器
  • 添加了 Prometheus 集成和其他优化更改
  • 加了对存储支持的持久性的实验性支持,以确保消息的零数据丢失

rumqtt 将在 2023 年初推出对 MQTT v5 的支持。

P.S 另外一个纯 Rust MQTT v5 客户端实现 mqrstt[17]

    学习资源

    • RustLab 2022:
      • https://www.youtube.com/watch?v=Phk0C-kLlho
      • https://docs.google.com/presentation/d/1P8Su5mZSYkfZ1A9mPAaKag-vtXmVD8nUBD7Ym-pfwJM/edit#slide=id.gff4f80ffe4_0_0
      • 困难问题的人体工程学 API:
      • 使用Tokio 实现 Actors: https://www.youtube.com/watch?v=fTXuGRP1ee4
    • Web 开发: 使用 actix-web 和模板引擎Tera 创建站点框架 https://webant.online/tutorials/actix-web-tera-skeleton-website/
    • Rust vs C++ 常见 Bug 对比: https://geo-ant.github.io/blog/2022/common-cpp-errors-vs-rust/-《Rust Atomics and Locks》免费在线阅读: https://marabos.nl/atomics/
    • Haskell 程序员用 Rust 抽象 : https://www.jernesto.com/articles/who_needs_haskell.html
    • egui写的票务管理工具 : https://github.com/TheBiochemic/tickets-rs
    • 基于 wasm 的unix终端: https://github.com/Property404/its-a-unix-system

    参考资料

    [1]

    interoperable_abi: https://github.com/rust-lang/rust/pull/105586

    [2]

    更多内容参考 gccrs 2022 年报: https://rust-gcc.github.io/reporting/2022-year-report.html

    [3]

    rustc_codegen_gcc:进度报告#19: https://blog.antoyo.xyz/rustc_codegen_gcc-progress-report-19

    [4]

    原文: https://quick-lint-js.com/blog/cpp-vs-rust-build-times/

    [5]

    Gama: https://www.gamaspace.com/

    [6]

    Tweedegolf: https://tweedegolf.nl/en

    [7]

    开源仓库: https://github.com/tweedegolf

    [8]

    Gama 太阳帆的卫星于 2023 年 1 月 3 日由 SpaceX 猎鹰 9 号成功送入轨道: https://www.sail-world.com/news/257330/Gama-launches-its-Gama-Alpha-solar-sail-mission

    [9]

    svix-webhooks: https://github.com/svix/svix-webhooks

    [10]

    Tokio 发布了: https://tokio.rs/blog/2023-01-03-announcing-turmoil

    [11]

    turmoil: https://github.com/tokio-rs/turmoil

    [12]

    cargo-sandbox: https://github.com/insanitybit/cargo-sandbox

    [13]

    Burn: https://github.com/burn-rs/burn

    [14]

    shura: https://github.com/AndriBaal/shura

    [15]

    rumqtt: https://github.com/bytebeamio/rumqtt

    [16]

    mqttwrk: https://github.com/bytebeamio/mqttwrk

    [17]

    mqrstt: https://github.com/GunnarMorrigan/mqrstt


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存