关于Rust和C++

关于Rust和C++

概述

注意

事先声明: 本人只学了2小时Rust就写了这篇文章, 如果哪有错误还请指出

最近看到说Rust进入Linux内核, 还有什么Rust将要取代C++之类的话(还有美国安全调查报告😂), 那正好最近空闲, 就直接学一学Rust. 看看Rust是否真就是所谓的Safe C++.

初探Rust

作为一名C++小喽喽, 初次接触Rust语法其实是很不适的, 初看代码有种Python的语法, C++的性能, 还有Typescript的类型标注. 不过这并不是说Rust语法恶心, 毕竟每种语言都有自己独特的语法, 所以下面是不会去吐槽他的语法. 更多的是一些Rust的特性.

所有权

其实你看Rust的代码, 无处不在说明所有权的问题

官方对于所有权是这么描述的

  • Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
  • 值在任一时刻有且只有一个所有者。
  • 当所有者(变量)离开作用域,这个值将被丢弃。

其实一看这个就在说Rust是内存安全的, 不会造成内存泄露, 还有所有权混乱的问题, Rust是从一开始就向开发者贯彻这种思想, 而C++那边其实也是有类似的概念, 不过出现的比较晚, 一般学到入门也不知道这个东西的概念, 这点Rust直接显示表明, 让初学者早期就养成所有权管理的理念.

C++这里的其实叫做RAII, 并且标准库里很多东西也都体现了这个概念, 并且还诞生了智能指针这个东西, 不过呢, 智能指针并没有像Rust的所有权管理那样从一开始就接触到, 并且部分情况下也并不安全(其实是C++给了开发者一定的自由).

所有权呢确实是解决了内存泄露的问题, 不过学习起来并不那么好理解. 在绝大多数编程语言中=通常是赋值, 或者说是复制, 不过放在Rust就变成了所有权转移, 初见确实感觉奇怪, 不过了解Rust特性其实也没那么难以接受.

包管理

Pythonpip, RustCargo, C++只能眼巴巴的看着

如果说, C++的内存泄露是开发者自己的问题, 无关痛痒, 那包管理就是C++最恶心的一点, 没有之一, 虽然我也从中学到了不少手动链接的方法, 但还是很恶心, 目前就vcpkg还算完善, 能跨平台, xmake目前未来可期(其实能加上头文件索引就已经能达到能用的地步了), cmake那边显然没有包管理的打算, 不过C++至今没有一个官方的包管理, 说实话, 就目前一个包管理就已经足够劝退了, 只能说日后能有以个官方的包管理器(显然这是幻想).

代替

说了这么多了, 那Rust或Carbon或者未来的兴新的编程语言真的能完全取代C++吗? 那答案自然是否定的, 首先C++庞大的库生态摆在这呢, 不过还有就是, 其实这些语言也没必要去取代C++, 除非哪天C++直接摆烂不更新了, 那时候C++也确实改退休了, 所以, 这些语言的诞生根本不是去为了取代C++, 在某方面它为我们提供了更多的选择, 也驱动C++一代一代的更新.

总结

这些新兴语言是 C/C++ 最重要的“诤友”和“催化剂”。 它们的最大历史作用,可能不是“取缔” C/C++,而是:

  1. 为系统编程的新需求(安全、并发、工具链)设立更高的基准。
  2. 迫使 C/C++ 正视自身弱点,以更快的步伐现代化。
  3. 丰富系统编程的“工具箱”,让开发者可以根据项目背景(全新 greenfield vs 遗留 brownfield,安全要求 vs 极致控制)选择最合适的工具。

这场竞赛没有输家。最大的赢家是整个软件工业,因为我们获得了更安全、更高效、更多样的工具来构建可靠的基础设施。未来,我们更可能看到一个 “C++ 与 Rust/Carbon 等长期共存、互相借鉴、边界逐渐模糊” 的技术图景。


版权声明:本文为原创文章,转载请注明出处。

C++第一次授课文档
从汇编层面学习C++右值引用