【译论】如今,是否有充分的理由在新项目中使用 C++ 而非 Rust ?

您好!在开发需要高性能的项目时,我最常用的语言是 C++。我做过很多高频事务处理、系统编程(为特定领域的问题实现微小的编译器/解释器等)、个人项目等,我通常用 C++ 开始我的项目。但现在越来越觉得 Rust 可以解决 C++ 可以解决的所有问题,而且不会降低性能,同时还能获得更好的内存安全保证和更好的类型不变性保证。Rust 的打包故事、Cargo 等无疑非常有吸引力!
因此,我想到了一个问题。用 C++ 启动新项目还有意义吗?

我不希望这变成一场语言大战。我的问题是出于善意,而且我确实想从在这里发表评论的人们那里汲取智慧。使用 Rust 的时间比我长得多的人可以提供我可能不知道的宝贵见解。因此,为了避免 “火焰战争”,请允许我尽可能具体地说明这个问题:

1.在什么情况下,用 C++ 而不是 Rust 启动一个新项目更有意义?

2.对于像我这样对 Rust 没有太多经验的人来说,在用 Rust 启动一个新项目时应该注意或小心哪些事情?

3.对于像我这样考虑把 Rust 作为新项目的首选语言的人,你还有什么其他自由发挥的建议吗?

本文文字及图片出自 news.ycombinator.com

你也许感兴趣的:

共有 85 条讨论

  1. 我是一名即将退休的工程师/企业家。我用 C++ 赚了很多钱。我很难告诉别人不要使用它。

    我最近用 Rust 开发了一个石油和天然气衍生工具。在我看来,Rust 还有很长的路要走。它让我想起了 OCaml。我曾花了两年时间用 OCaml 在 DEC/OSF1 上开发一个合规系统。我们犯了过早采用该语言的错误。此外,C++ 社区也更加宽容。这是 C++ 的一大优势。

    1. > 另外,C++ 社区也更加宽容。

      对我来说,Rust 最大的障碍已经不再是这门语言,而是围绕它的社区。

      我意识到这主要是少数人的声音,绝大多数 Rust 人,包括我个人认识的人,都非常友善。但是,也有一些令人生厌的 Rust 布道者。

    2. > 此外,C++ 社区也更加宽容。这是 C++ 的一大优势。

      我完全不同意这种说法。就我个人而言,C 和 C++ 社区似乎更加 “精英化”,他们会因为知道一些晦涩难懂的语言琐事而极度迂腐或互相攻击。与 Rust 相比,C 语言和 C++ 社区都对初学者非常不利。

      这并不是说 Rust 社区是完美的,因为它显然并不完美–但缺乏 “宽容 “似乎从来不是它的问题之一。

      1. 这与我的个人经历不谋而合。

        我还想补充一点,现在似乎更强调有意识地培养语言社区。在我看来,C 和 C++ 社区的形成并不是有意为之,而大多是偶然或巧合。

    3. 您认为 Rust 在哪些方面需要改进?

      1. 我很喜欢 rust,但与 go 相比,我不喜欢在模块中支持同步与异步需要不同的代码路径。或者选择不同的运行时,比如 Tokio。因此,你最终会发现有的模块只支持异步,有的只支持同步,有的两者都支持。

        这让我不禁怀念起 go,它内置了通道,也内置了运行时,而且两者总体上都很可靠。没有人会用 A 来做这个,用 B 来做那个,或者为错误的颜色函数写封装。

        1. Rust 内置了通道。事实上,最近在优秀的 crossbeam 板条箱基础上重建了标准通道。

          函数颜色已经成为一种时尚,但 “也许同步函数”(maybe-async functions)即将问世。

          https://lib.rs/tokio 是 std 环境的王道,https://lib.rs/embassy 是 no_std 环境的王道。

          1. 是的,MPSC,单一消费者,这是限制。

      2. 我想到了编译时间、异步、陡峭的学习曲线等问题

        1. 我还要补充一点,由于年代久远,C 和 C++ 与电路板、操作系统、图形用户界面、可能需要的库等的兼容性更强。特别是在嵌入式系统中,如果使用或雇佣 C/C++,你会有更多的选择。此外,还有更多用于分析 C/C++ 软件的工具,但这些工具通常价格不菲。

          对于常见的应用场景和平台,Rust 的库情况确实很快得到了改善。

        1. 我不是在诱导你,因为你说的话而攻击你的人都是白痴。

          我对这两种语言都没有太多经验,我对哪种语言更好也没有意见。我只是对你的观点感兴趣。

        2. 我理解你的犹豫,但我真的很感谢你的看法,因为你似乎很懂行。

          我个人认为,兄弟姐妹的评论是非常准确的,而Rust则是阻碍它的因素:

          – 大型项目编译速度慢

          – 异步的东西会很快导致非常复杂的诡计

          – 嵌入式仍要求您为 MCU 编写 HAL 内容,而 C 语言开箱即支持这些内容

    4. > 我最近用 Rust 开发了一个石油和天然气衍生工具

      听起来很酷!能详细说说吗?你有网站吗?有联系方式吗?

      干杯

    5. 您能分享一下您是如何/在哪类工作中用 C++ 赚到大钱的吗?

    6. > 我用 C++ 赚了很多钱。

      请详细说明。

  2. 我听其他公司的一些同事说,与 C++ 相比,Rust 对开发人员的工作效率有很大的负面影响。这使得 Rust 非常适合 Linux 内核等领域,因为这些领域非常需要安全和性能特性,而维护者根本不在乎贡献者需要花费多少时间和精力来合并他们的特性。另一方面,我目前所在的公司在开发人员的工作效率方面已经面临着巨大的挑战,很可能因为这个原因,一个新的内部项目从一开始就需要使用 Rust。

    1. 我的个人经历和许多人的经历恰恰相反。Mozilla和Oxide的工程师们都在谈论,在Rust中,重构是多么容易,花在构建系统上的时间是多么少。

    2. 我无法证实这一点。Rust 的安全特性允许快速开发,而不必担心出现细微的 bug。

      不过,使用 Rust 开发时,如果选择了不适合 Rust 的方法/架构,就会感觉像是在与编译器作斗争。这种情况经常发生在只有少量 Rust 经验的人身上。举个例子:由于自引用类型,在 Rust 中编写一个链表可能相当具有挑战性。随着 Rust 使用经验的增加,开发人员就能学会如何以最佳方式构建代码,从而避免出现这种摩擦。

    3. 个人解毒剂–我也听说过这种说法,但在使用 python/typescript 多年后,我突然发现它是如此高效。

      招聘的人可能比较少,但不要相信恐惧。

  3. 我曾经对 Scala 抱有同样的看法,认为它是 Java 的更新、更好的替代品。后来我在现实世界中遇到了一些问题。看看有没有并行的,我会复制粘贴我之前报告过的问题:

    “Scala在现实世界中存在一些问题。与 Java 相比,Scala 有很大的学习曲线,因为它从 Haskell 和函数式编程中吸取了很多特性,同时还保留了 Java 的所有老特性。Scala的一些库并不像Java库那样成熟,或者存在两个相互竞争的库,而Java只有一个流行的库。聘请 Scala 开发人员是个问题。编译时间很糟糕。Scala 的每个重要版本(如 2.10、2.11、2.12 等)都会破坏向后兼容性,因此如果在 Scala 2.10 中编译了 Scala 宏,那么在不修改代码的情况下就不一定能在 Scala 2.11 中编译。我们有一个库,维护者在 Scala 2.10 版本时就放弃了这个库,如果不把这个库拿出来用其他东西代替,或者接管这个库,我们就无法升级到 Scala 2.11,而这是不可行的。Scala 有一个问题,我在 C++ 中也遇到过,那就是语言太庞大了,不同的团队和不同的人使用不同的语言 “方言 “编程,使用不同的语言特性子集(例如,有些人使用 OOP 类继承,有些人不使用)。很多人都不懂 Monads 或函数式编程。不过是的,很多地方最终还是回到了 Java,或者使用 Node.js(如果他们想做异步/反应式的话)。

    1. 说得很对。Scala 是一种功能强大的语言,我们也从中获得了很多收益,但这是在 Scala 生态系统的支持下取得的,而不是因为它。

  4. 1.与现有库更好地集成,C/C++ 中存在大量软件,其中很多都很奇怪,也很有主见,必须为此编写绑定程序并不是件好事。

    2.继续说下去,QT 对于大型桌面图形用户界面项目来说仍然很好。但它与 Rust 的绑定似乎并不理想,而且 Rust 仍在努力摸索其可比较的 UI 故事。

    3.具有讽刺意味的是,在某些特定情况下,只要有良好的规范,(主要是看起来像 C 的界面)C/C++ 的编译速度会比 Rust 更快。

  5. 我认为选择 C++ 而不是 Rust 的最大原因是成熟的编译器和相对丰富的成熟库,还有可能是你已有的语言知识。

    看起来更大的问题是你的项目目标是什么?比如,如果使用 rust 获得更多经验是主要目标,那么上述优势就几乎没有意义了。相反,如果一个项目可以从利用成熟的编译器和库中获益良多,或者如果您无法承担精通一门新语言所带来的额外时间投入,那么 c++ 可能更有意义。

  6. 我对 “Rust好奇”,但我来自网络/应用程序背景(Dart、JS、TS、Java、Python),所以请慎重考虑我的想法。

    1.有一种情况似乎与您的情况相同,即团队或个人拥有丰富的 C++ 经验。

    你看,对我来说,学习 C++ 的几十年中,好坏参半,感觉难以承受,所以 Rust 对我来说是有意义的,即使它仍然是我学过的最难的语言,但由于你已经是一名经验丰富的 C++ 开发人员,继续使用 C++ 也许是有意义的。

    我已经习惯了简单、标准的格式化工具、打包和依赖管理(Rust 在这方面非常出色,即使对初学者来说也是如此),所以要在 2023 年弄清楚如何在 cpp 中正确完成这些工作会很难。但对你来说,这很容易,因为你已经知道了这一切!

    除此之外,我想可能有些库在 C++ 中很好,但在 Rust 中仍有不足。

    此外,还需要考虑内存安全对你和你未来的项目是否真的是个大问题。

    1. 以下是我对学习 C++ 的建议。不要先学 C++。先学 C,熟练掌握 C。然后再慢慢在代码中使用 C++ 的某些功能,以此类推。不要试图一次全部学完。我已经用 C++ 开发了 30 多年,现在仍在不断学习新知识。

      就像学习数学一样。你学过代数和三角函数,但微积分是另一门学问。如果你对前者没有扎实的理解,你就无法理解微积分的符号运算。随着微分方程的学习,情况会越来越糟。

      在尝试掌握多态编程、面向对象编程和函数式编程之前,应该先了解程序式编程和命令式编程。这其中有很多抽象的东西,而训练你的思维进行抽象是一个过程。

      要小心,有一些纯粹主义者存在,他们会尖叫和抱怨,但不要理睬他们。不要让别人控制你的思维方式。我的一位已故教授曾对我说过一句话,我以为自己听懂了,但直到多年后才恍然大悟。

      “用任何语言编写的程序,只要能产生正确的结果,就是正确的程序”。

      只要程序做了它应该做的事,怎么达到目的并不重要。

      另外,代码的纯粹性是神话,那些追求纯粹性的人是神秘主义和虚假美学的信徒。有好的代码组织,但当你遇到最后期限时,就很难保持代码的条理清晰了。

      别误会我的意思,内存安全问题很重要,但它完全被夸大了。SpaceX 用 C/C++ 构建了令人难以置信的火箭和系统。我们有外部工具来检查这些问题,但它们仍然需要与 Rust 一起使用。

  7. 使用 Rust 的好处是,与 C++ 相比,使用 Rust 可以更容易地管理第三方库,因此可以更快地完成工作。

    使用 Rust 的缺点是,它仍是一种不断发展的语言,因此你可能需要重构代码。一般来说,Rust 的用例是针对企业软件的,在企业软件中,有很多人在工作,需要快速,而且要尽量减少引入内存错误的机会。对于个人使用来说,我认为这并不值得,它只会拖慢你的速度。

    我个人只使用 Python 和 C。在 Python 中编写 C 扩展来处理需要快速处理的事情非常简单,然后让 Python 处理代码的启动。例如,我在玩 MCTS 时,会在 Python 中设置树,然后使用多进程技术将树分成 x 个进程,每个进程都会启动 C 代码,这样搜索速度会快很多。总的来说,实现起来非常简单,因为我不需要为初始设置和内存管理等编写底层 C 代码。

    最近有一个关于使用火炬编译自定义 CUDA 内核的视频(https://www.youtube.com/watch?v=nOxKexn3iBo)。我已经为一些自定义数据处理实现了这一功能,以前我需要用 C 代码在 CPU 上完成这些工作,而使用 CUDA 会快很多。

    1. 与 Rust 相比,我需要重构的 C++ 多得多。C++11、std::optional、概念和范围、std::format 等。我并不是一定不喜欢这些变化,但为了跟上语言的发展,你总是要重写 C++。

      在 rust 中,主要是将夜间版本的东西合并到稳定版本、1.0 之前版本和 async。总体上要稳定得多。

      1. > 你总是在重写 C++,以跟上语言的发展。

        如果这是你想做的事,而这是一个很大的 “如果”。我想严格来说,Rust 也是如此,但在 Rust 中,由于它是新语言,我更 “感觉 “应该跟上(至少对我来说是这样)。在 c++ 中,我主要是不去碰那些还能用的旧代码……

        1. 我是从 “我对这段代码的安全性和正确性有多大信心 “的企业角度来处理这个问题的。

          如果你递给我一堆恰好能编译的 c++03 代码,我对它满足这两个标准的信心是相当低的。如果你去问标准委员会或 Bjarnes,他们会告诉你用不断发展的现代 C++ 重写。

          相比之下,rust 只要能编译就没问题。

          1. > 标准委员会或 bjarnes,他们会告诉你重写它

            50 年后的 Rust 也是如此(假设 Rust 不会很快消亡)。如果他们认为不值得对 Rust 进行现代化改造,那他们就不会去管 C++ 了(我认为他们应该这么做,但这是另一回事)。

            对于老的 C++,你可以运行 valgrind 和 linter,如果什么都没发现,那也 “可能没问题”。至少我很难想象,开发人员所做的最有成效/最有利可图的事情就是将他们的旧 C++ 现代化。

            1. 你会把你的生命/金钱/应用安全都赌在 valgrind 和线程是否足以捕捉到所有这些问题上吗?这就是 C++ 的现状。

              在编译旧代码时,编译器无法像现代 C++ 那样检查代码是否符合标准。这就是为什么建议更新代码的原因,否则工具也救不了你。

              相比之下,Rust 能保证你要么是遇到了编译器/运行时错误,要么就是问题的局部范围比 “可能是每一行代码 “更小。当然,我希望能有更好的效果,但这也是一种进步。

              1. > 你愿意用生命打赌吗?

                肯定不会。但这么大的风险是很少见的。我也不会把自己的生命赌在借款检查程序上,程序中可能会出现很多问题。

                钱当然是多少的问题。应用程序安全只是 “以上”。未定义的行为可能会让你的电脑爆炸、穿越时空回到过去并成为你的父亲”,这个问题不容小觑。不过,如果旧代码多年来运行良好,但确实潜伏着一些不好的 UB,我们可以禁用一些优化,并在编译器的选择上保守一些。很多人不喜欢编译器越来越多地惩罚 UB 的趋势,我明白他们的意思,当然,要在性能和对无处不在、几乎不可避免的代码问题的健壮性之间找到平衡点是很难的(更不用说找到了)。

                Rust 的保证很好,与任何 C++ 项目相比,我当然更喜欢在现代 Rust 项目中工作,与 C99 带类的项目相比,我也更喜欢在现代 C++ 项目中工作。现有代码的现代化则是另一回事。我见过很少有人尝试对一个庞大而古老的 C++ 代码库进行现代化改造,没有人尝试过明显有成效的改造,只有一次尝试出了差错……

              1. C++ 中不断出现的新语法和编程概念要少得多。如果非要用数量来衡量的话,我估计现在的 C++ 大约集 3.5 种编程语言于一身,而 C 语言可能只有 1.5 种。

                东西越多,添加更多的东西就越有问题(添加 “脚枪 “并使语言难以学习),因为这些东西都是相互影响的。而 C++ 的很多特性都会以不好的方式相互影响……

  8. 考虑跨平台性。例如,如果你用 C++ 制作一个带有领域逻辑的新应用,你可以通过 Swift/Objective-C++ >> C++ 在 iOS 上构建它,或者通过 Java JNI >> C++ 在 Android 上构建它,或者通过 JavaScript Interface (JSI) >> C++ 在 React Native 上构建它,或者通过 wxWidgets >> C++ 在 Linux 上构建它,或者……等等。

    除此以外,Rust 是一门伟大的语言,它的编译器可以消除 C++ 可能存在的各种 bug。

    1. 我并不反对将更广泛的平台支持作为选择 C++ 的理由,但 Rust 也同样能够与你所说的特定平台集成。

      1. > Rust 在与你所说的特定平台集成方面同样出色。

        也许有可能,但在 iOS 上使用 Rust 绝对没有那么简单。与 C++ 相比。

        1. 我本人没有在这种情况下使用过 C++ 或 Rust,所以无法说明两者的易用性,您能说得更详细些吗?

          我所知道的用例基本上都是构建一个暴露于 C ABI 的库,虽然有点恼人,但很有效。我猜你指的是 Swift <-> C++ 互操作?

          1. 我的意思是,在 iOS 项目中添加 C++ 文件,并让它们一起编译和工作,而无需任何新的编译步骤或设置,并让 Swift 代码调用 C++ 实现中的 C api — 所有这些在 iOS 中都可以直接实现,Xcode 甚至会为您创建 “桥接 “头文件,并内置对 C++ 的支持。现在,将 Rust 加入其中?这将涉及更多的工作,而且肯定不会那么简单;Xcode 中的 iOS 工具集也不支持 Rust。这就是我反驳你的观点 “Rust 在与你所说的特定平台集成方面同样有能力 “的意思。

            1. 谢谢!

              我并不想说它们同样简单:只是说它们都具有相同的功能,没有什么特别之处是一个能做而另一个不能做的。

  9. 在嵌入式开发中,有时 gcc 比 rust(llvm)更容易被移植到更多的架构上,所以 c 或 c++(或 fortran)都是不安全的。

  10. 我在这里没看到有人提到市场。C++ 开发人员要多得多。无论你是要写一个别人会用到的库,还是要雇人(或让人做贡献),c++ 都是一个更大的 “市场”。

    这并不意味着我一定要支持 c++ 或 rust,但 c++ 肯定比 rust 有优势,即使这些优势并不只是固有的。

    1. Rust 与 C++ 有良好的 FFI,这意味着你可以编写 C++ 程序使用的 Rust 库。

      C++ 开发人员了解所有必要的概念,可以轻松掌握 Rust。只要不是一个马上就会被扔掉的快速项目,让 C++ 使用 Rust 将是值得的。

      1. Rust 与 C 和 C++ 都有良好的 FFI。Rust <-> C++ 的 FFI 体验还有点粗糙。

        1. 甚至 C++ <-> C++ 在处理对象代码时也很粗糙......

  11. 每种语言都有自己的优点,没有哪一种语言是最适合所有任务的。

    尽管如此,C++ 和 Rust 都占据着相似的领域(高性能、低级、经常与操作系统系统调用或硬件交互)。

    C++ 的优点

    – 更成熟、优秀的库生态系统、数十年的代码参考。

    – 语法可以说更容易读写

    – 非常流行(GitHub 上排名第六的语言),有大量人才可供聘用。

    Rust 的优点:

    – 内存安全,更难引入某种类型的错误。

    – 借用检查器更容易推理对象的生命周期。

    – Cargo 可以很好地拉入库(只是需要更多的库)。

    对我个人(图形/游戏开发人员)来说,成本和开发速度是决定性因素。我两种语言都用:默认情况下使用 C++,而 Rust 则用于底层、安全关键代码。

    1. >- 可以说语法更易于读写

      一般来说,这与其说是 “容易”,不如说是 “熟悉”。C/C++ 比较熟悉。

    2. 我通常听说有人将 Rust 与 C 结合使用。如果你同时使用它们,那么从 C++ 调用 Rust 和从 C++ 调用 Rust 有多容易?你能用它们的标准接口来调用 Rust 吗?

  12. 你真的希望尽可能少地使用 C++ 和 Rust,最好只在高性能代码中使用。应用程序的其余部分应使用 C# 或 Kotlin 等 RAD 语言开发。有了 MS 提供的第一方构建工具支持,C# 和 C++ 之间的互操作性现在真的很棒。据我所知,Rust 与其他任何语言都没有很好的互操作性,具有讽刺意味的是,除了基于此[0] 的 C++。

    [0]https://www.hobofan.com/rust-interop/

  13. 如果你需要与现有的 C++ 代码或库交互,显然使用 C++ 要比使用 Rust 容易得多。如果你没有这样的要求,或者你认为现有的 Rust 库足以满足你的需求,那就随便用吧。

    1. 就是这样。C++ 的巨大优势在于可以使用现有 C++ 和 C++ 库的整个生态系统,而无需任何绑定。

      当你需要制作自己的 Rust 绑定或依赖于某些可能会或可能不会积极维护的第三方项目时,C++ 则更具吸引力。

    2. 出于两个原因,我刚刚用 C++ 启动了一个新项目:

      1.我已经会(一些)C++

      2. 更成熟的 GPU 生态系统,尤其是对 CUDA 的支持

      我不介意学习新语言,所以 CUDA 是我的决定性因素。也许有一天 Rust 的 GPU 支持会有所改善,我会考虑重写。

  14. 一些支持 C++ 的论据:

    1.编译速度快得多。

    2.在很多情况下,必须在语法上指定所有权是一件很烦人的事,而且浪费时间。除非你需要手把手的指导,否则低级编程并不适合你。

    3.多个编译器。当你同时拥有 clang、gcc 和 msvc 时,解决 bug 会变得更容易。

    4.Valgrind 和其他调试、剖析和分析工具。

    5.我个人认为 Rust 的语法令人讨厌且杂乱无章。而在 C++ 中,大部分杂乱的语法都可以避免,这一点我很喜欢。

    1. 3.和 4.听起来有点像 “对于 C++,你有很好的工具来解决 Rust 首先不会出现的问题”。

  15. 在我看来,人们很少谈论 Rust 的最大缺点之一就是存在大量废弃和不完整的板条箱。当然,C++ 也是如此,但正如其他人所指出的,那里有一个非常成熟的生态系统。

    我想指出的第二点是,虽然 Rust 的构建工具在某些情况下显然非常不错,但它并不是灵丹妙药,而 C++ 的构建_是_一个已经解决的问题。它只是在滚动和添加新的依赖关系时需要付出更多的代价,但这些代价并不常见。不过,在非 Rust 构建链中添加 Rust 组件可能会非常痛苦。Cargo 真的希望一切都在 Cargo 中进行。

    最后但并非最不重要的一点是,C++ 也拥有极为成熟和全面的静态与动态分析工具。也许 Rust 在这方面已经开始迎头赶上,但我还不能确定。

  16. 评论中没有人提到 OpenACC 或 OpenMP 卸载,而这正是我使用 C++(甚至为了简单起见使用 C/Fortran)启动新项目的主要原因。

  17. C++ 看起来更容易使用,C++ 的工具也更多更成熟,所以如果开发的效率和速度很重要,这些都是使用 C++ 的好理由。

    1. 虽然我能想象熟悉工具会带来巨大的好处,但我不得不说,我倾向于选择 Rust 而不是 C++,原因恰恰相反。我发现 Rust 工具比 C++ 工具更容易使用。清晰的编译器信息会显示出错的地方,错误处理和日志记录简单得多,通过货物处理依赖关系也简单得多。

      另一方面,借用检查器(borrow checker)意味着你需要更多考虑如何使用生命周期,这可能会拖慢你的速度,但我发现这更经常地阻止了我写 bug。

    2. 丰富&成熟 != 易于使用。有没有在 CMake 中运行过 make?(这就是一个构建系统生成器在生成构建系统的同时运行一个构建系统……)。

  18. 归根结底,Rust 的核心论点并不在于技术;在 Rust 中,没有什么事情是 C/C++ 无法做到的。从一个经验丰富的 C 语言开发者的角度来看,Rust 可能会显得过于复杂。

    Rust 带来的真正好处在于编程的社会动力。初级程序员可以参与低级代码的编写,大大降低了破坏代码的可能性。前辈们可以在保持代码可被未来的贡献者维护的同时,进一步推动代码的发展。

    总的来说,Rust 提供了一个更加公平的竞争环境。这对于任何长期项目来说都是一大优势,但如果你已经习惯了 C 语言的工作方式,并且不关心自己手中代码的生命周期,就很难意识到这一点。

  19. 熟悉和库支持是两个显而易见的原因。

  20. 直接集成 C 源代码。除此之外,我想不出其他原因。

  21. 作为一个随机数据点,我最近了解到 Solana 区块链共识软件正在被完全重写……用 C 语言。

    我很好奇他们是否考虑过这一点,因为这将引入 Rust 从本质上可以避免的一整类错误。

    > Firedancer 是用 C 语言编写的,与原 Solana 验证器的 Rust 代码库形成鲜明对比

    https://firedancer-io.github.io/firedancer/guide/firedancer….

  22. Rust 有一种方法可以加强内存安全性。这对已部署的应用程序来说是件好事,但当你还在探索/修改代码以找出事物的正确形态时,这可能会很烦人。

    1. 我从未有过这样的经历,即精确地表达我的意思会拖慢我的速度,如果有的话,情况恰恰相反。

      1. 如果你还不知道解决方案的形状,”安全 “功能就会限制你。

  23. 即使过滤掉所有过时的内容,先用 c 或 c++ 编写、然后绑定 rust 或作为业余爱好由第三方转换为 rust 的库的数量,也要比使用 rust 或为 rust 编写的库和框架的数量多得多。

    旧的 c++ 程序还有一个 “特权”,那就是即使存在内存泄露或其他问题,也能编译并运行;而在生产过程中,很多时候截止日期非常严格,开发人员不得不将存在错误的程序交付使用,并在某处添加注释,说明 “如果使用函数 X,程序将冻结或崩溃”。

  24. 现有库支持。Rust 生态系统在某些领域(嵌入式的大部分)还不成熟。而且(热门观点),虽然总体而言,Rust 的语法比 C++ 的语法要好(没有头文件、结构和函数语法更清晰、数组引用代替指针等、避免了分散/全局状态),但在生态系统的某些部分,泛型和异步所产生的摩擦抵消了这些优点。

    因此,如果在某个项目中使用 Rust,最终可能会因为缺乏支持、库功能缺失或 API 不完善/文档不全而重新发明一些本可以成为库的东西。通常情况下,自动生成的 Rust 文档是学习一个库的好方法,但泛型库终止了链接路径,从而否定了这一点。

    我认为你会发现 Rust 的工具和(非同步、非泛型)语法比 C++ 更上一层楼。

  25. 我喜欢 C++,这对我来说已经足够了。

  26. 1.当你需要更大的生态系统,需要现有的/经过验证的软件和可用的开发人员时,C++ 会更有意义。如果你不喜欢 “NPM-esque “环境(crates.io),这可能也是一个因素。

    2.我不了解您的情况,无论如何,Rust 及其 “开发者体验 “一直在发展/改进。

    3.如果可以选择 Rust,那就选择 Rust 而不是 C++。这是我的观点,但很坚定。

  27. 在我看来,如果你真的需要 Rust 的安全保证,那就使用 Rust,但如果你更喜欢 C++,而且使用 C++ 能提高工作效率,那就使用 C++。

    在安全性并不是必需的情况下,为了一点微小的收益而影响工作效率是毫无意义的。

    这只是一个初学者的两点看法:)

  28. 您关心引导性吗?我有一个用非常老式的方法(C99、autotools)编写的副项目,特别是因为它需要参与引导链。Rust 在这方面并不擅长。

  29. 在 2024 年使用 C++ 而不是 Rust,基本上没有什么理由。我想,除了个人喜好之外(我是用 C++ 长大的,所以很怀旧,但它不是 Rust)。

  30. 我想这个问题可以用……我们公司为什么使用 JavaScript?因为那里有很多可用的库,而且维护得很好。很多时候,现有的库比编程语言本身更重要。

  31. 首先,我的背景是 Haskell 和 Rust。我通常会遵从具有安全意识的语言。所以请不要在回复中赞美类型安全、类型系统等的优点。我知道,我同意,但这并不能改变我要说的话。

    Rust 是很棒,但老实说,现代 C++ 正在迅速迎头赶上。Rust 具有安全性,但其中一个问题是,有时你不得不为此降低效率(引用计数),并付出代码乱码的代价(到处都是方框)。另外,实际上类型安全也需要时间来考虑(虽然不多)。无论如何,在代码运行和编译之前,你都要花时间打类型高尔夫。

    严格来说,C++ 的功能更强大,即使不考虑内存安全性也是如此。现代 C++ 的智能指针基本上内置了 “Rust”的所有权语义,而且有时还需要手动管理内存。现代 c++ 拥有概念、模板元编程(比 rust 强大得多)、constexprs 等。对我来说,仅这一点就使得使用 C++ 开发解释器和编译器比使用 Rust 容易得多。

    最后,经过近十年的专业 Haskell 开发,我终于体会到了能够快速构建原型的好处。事实上,类型安全的语言对于最终工作来说是非常好的,但如果能选择将其全部抛出窗外,只为完成某些工作,那也是非常不错的。在我的理想世界里,我们会有一种为类型不安全的程序(即使是未定义的行为)提供定义明确的语义的语言,然后在发布时提供严格类型检查的选项。是的,我知道 rust 有不安全机制,这很好,但也许我对不安全机制的了解还不够,所以效率不高。我发现使用起来并不明显。当然,Haskell 有一个 REPL,(在我看来)它比 Rust 和 C++ 都更容易进行原型设计。如果没有 REPL 或无类型回退,我认为 Rust 会花费更多时间。

    还有一件事…Rust 有很好的抽象,但与 Haskell 不同的是,在 Haskell 世界中,抽象很快就能得到合乎逻辑的结论,而在我看来,Rust 的方法则更为保守(例如多参数 traits)。从流行程度来看,这似乎是行之有效的。但至少对我来说,在使用 Haskell 时,我经常会开始追求更高级的特性,而这些特性确实应该有效。通常情况下,当该功能尚未实现时,我会找到已被批准的 GHC RFC,然后等待下一版编译器。在 Rust 中,事情的进展似乎要缓慢得多。我发现自己对其特质系统的弱点(没有存在性……:( ) )感到无尽的沮丧。

    归根结底,这两种语言都是可靠的编程语言,Rust 更适合处理业务逻辑,而 C++ 则更适合涉及大量元编程的项目。我个人曾用 Haskell(因为有 REPL)做过很多原型,然后用 C++ 实现运行时。Rust 则适用于一次性工具、实用程序以及任何与高性能异步 IO 有关的项目。

    1. 是否有可靠的方法来执行 C++ 的某些子集?我觉得 C++ 最大的缺点是功能太多,而且它们之间的交互难以预测。

    2. 同意你对 C++ 的评价。在过去的 10 年中,现代 C++ 有了很多改进,但 C++ 的公关问题很严重。部分原因是它的变化非常快,人们不知道是应该学习现代 C++,还是应该学习一些新东西(比如 Rust 或 Carbon),在很多情况下,人们决定学习后者,因为无论如何,学习 C++20 基本上就像学习一门新语言。

      尽管如此,与 Rust 等更现代的语言相比,C++ 目前仍然存在的最大不足就是库管理。C++ 标准制定者似乎每隔几年就会说,库管理是他们下一个 C++ 版本计划中的下一件大事,但却一直拖到后来。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注