什么时候 C 比 Rust 更好? - Reddit


1)最大的可移植性:
很少有平台没有某种C语言工具链可用,无论是奇怪的大型机系统、老式工作站,还是一些可爱的嵌入式东西。

2)合规性:
有大量的规范有效地规范C语言;MISRA就是一个例子。

3)工具化:
C有大量围绕它的工具,比如frama-c和其他分析你的代码的工具,或者compcert编译器。虽然Rust有很多适用于普通情况的工具,但对于更多的小众事物来说,它很难超越50多年的生态系统。

4)寿命长:
如果出于某种原因,你需要让你的代码在50年后仍可运行,那么我认为C语言是更好的选择。

其他观点:
1、我认为 4 对于 Rust 作为 C 来说是一个很大的优势。
我希望这句话成真:“C 是过去 50 年的语言,Rust 是未来 50 年的语言

2、除非我在 C 中有一个庞大的现有代码库/在 C 中有一组 C 库/框架,在这些地方处理常量 Rust 到 C FFI 会很痛苦,否则我总是会选择 Rust 而不是 C。
另一件事是对没有 Rust 支持/生态系统的嵌入式设备进行编程。

3、即使我有一个现有的 C 代码库,我也更愿意尽可能使用 Rust。与 C++ 不同,包装 C API 非常容易。即使你不能做一个安全的包装器,Rust 作为一种语言仍然要好得多,这是值得的
如果我确实别无选择,即法律要求、组织压力或不可能在受支持的目标上编译 Rust(每天都变得不那么重要),我只会用 C 编写一个项目。

4、当 LLVM 无法适合您的架构时

5、在我看来,唯一好的理由是语言本身的外部因素。比如你已经有一个很大的代码库,严重依赖非标准的C语言编译器扩展,而团队在C语言方面的能力很强,要想做就得学习Rust。Rust是用LLVM编译的,所以如果项目已经用GCC编译了(而且需要编译),你就不能得到跨语言的函数内联。所以,极其特殊和深奥的需求。

C语言的编译速度比Rust快得多,所以这可能也是一些人的顾虑。

从语言的角度来看,C语言唯一的优势是,当你有别名的可变指针时,一些数据结构可以用更简单的方式表达。这需要Rust中的不安全,但在某些情况下,编写正确的不安全的Rust可能比编写正确的C更难。典型的例子是链接列表。

就我个人而言,我认为来自C语言的任何好处都很容易被Rust的所有好处(更好的类型系统,借贷检查器等)所淹没。

6、我确实喜欢将 Rust 用于所有事物,甚至是 stm32 或 nrf52 或 esp32 或 RISCV 微控制器。然而,有时供应商会提供一组始终使用 C 语言的库 + 示例,在这种情况下,我会选择它作为快速原型。我还有一个使用大量 esp32 arduino 库的项目 - 蓝牙串行、SD 卡固件更新、FastLED、esp32 持久性 - 我认为还没有等效的 Rust 库。并且,STM32CubeMX 想到了一个 whack-job 原型,它也发出 C 代码。

7、最近我不得不为涉及多个进程共享内存区域的工作编写一些代码,并在这个共享内存区域上做一堆与 futex 相关的事情。我尝试用 Rust 做一些 mvp 工作,但最终意识到 c 是满足我需要的最佳选择。
更明确地说,在使用原始/共享内存做很多事情时,我更喜欢 c 而不是 rust。Rust 的系统在按预期方式使用时非常强大,但这是以缺乏灵活性为代价的。我绝对可以用 Rust 编写应用程序,我什至可以避免一个特别讨厌的内存错误,这个错误花了我几个小时才找到,但它至少会增加一倍的代码。

8、我使用了一个使用移动GC的程序--我试着用Rust写一个它的扩展,但我基本上不能使用任何标准库(因为我不能调用malloc),而且Rust中没有任何东西对被移动感到满意,所以它都是原始的和不安全的。基本上,太可怕了。

另外,我还做了一些代码,我只是在戳内存映射的寄存器。你可以在Rust中这样做,但我不确定在C语言中这样做是否有足够的好处(不管你用的是什么糟糕的SOC,它都会有更好的支持)。

反方:事实上,Rust中的所有东西都应该是可以用memcpy轻松移动的。它写得非常明确:每一个类型都必须准备好,以便它可以被盲目地memcopied到内存的其他地方。

我怀疑你的问题正好相反:你不是想要可移动性,而是想要非可移动性,你可以控制事物的移动位置和方式。

这与依赖移动构造函数/移动赋值运算符的C++库的问题是一样的:问题不在于Rust对可移动性的支持,而在于它不允许你轻易控制可移动性。

9、如果你在 HPC 工作,几乎总是使用 C 或 C++,因为 CUDA / MPI / OpenMP 等工具未得到官方支持,并且现有的绑定功能不完整。
我希望我只能为这些使用 rust,但 HPC 场景变化缓慢。

10、Rust 有足够的控制权,我认为没有任何严肃的论点表明你不应该仅仅基于语言特性在 Rust 和 C 中实现某些东西。这更多的是偏好/技能/开发能力和工具可用性的情况(如果您使用的是专用硬件)。可能在某些情况下可能出于监管原因而避免使用 Rust(例如,工具链尚未经过特定审查并且未获准在某些领域使用),但我并不特别了解这些。
作为一个非常喜欢 Rust 的人,我认为如果你喜欢 C 并且擅长 C,那么用 C 编写代码并不愚蠢。同样,我认为同等情况下选择 Rust 也不会是愚蠢的。其他人肯定会不同意,但我个人认为工具远不如团队重要。