
缘起
我工作中主要是用C++,也跟了11、17和20标准,在11出来之前写C++程序觉得很难,当然也和刚工作比较菜有关。C++的多范式以及内存控制的颗粒度都很考验开发人员的水平,好的C++开发者能写出艺术般的代码,菜的开发者就GG了,偏底层的还得懂点操作系统,那时候写多线程也痛苦,直到11标准出来才官方支持线程,智能指针才真的在项目中派上用场,一直到20标准才有包管理。所以当Rust刚出来的时候,我就一直想看看,无赖工作和生活确实不太允许我有太多时间干这个事,最近过年终于开始把这个事搞起来了,顺便记记笔记,也分享给对Rust学习感兴趣的人,大家有意见可以直接留言交流,一起探讨。
Rust 简介
本系列文章主要是对比C++/C来学习Rust,当然也会先介绍Rust基本概念。Rust语言是由Mozilla研究院的Graydon Hoare在2006年开始开发的,目标是设计一种类似C++,但是更安全、高效的系统级编程语言。2010年,Rust发布了第一个版本,之后,Rust社区不断壮大,在2018年发布了1.0版本,发布后不久,口碑就一路高飞猛进,从 16 年起,连续 6 年成为 Stack Overflow 用户评选出来的最受喜爱的语言,被广泛认为是未来编程语言发展的重要趋势。
Rust得到了很多国外厂商认可,被广泛应用在工业界,例如Dropbox、Firefox、Fuchsia、Docker等公司和项目中。不过我认为他会大量使用在中间件,而C/C++会去做更底层的部分,而Java会更向应用层发展。
rust对初学者并不友好,即便是有编程基础的人,对诸如变量的所有权、生命周期这些新概念也需要时间去感受去理解。所以他会有一个陡峭的学习曲线,一个好的教程就显得尤为重要,而我就正在做这个事情。
Rust 特点
-
安全性:Rust语言通过静态类型系统、内存管理等机制保证程序的安全性,避免常见的缓冲区溢出、数组越界等问题。下述代码中,Rust 编译器会报错,因为在 y 和 z 指向 x 的时候 x 是不可变的,不能进行修改。而在 C++ 编译器可能不会报错,而要等到运行期才会报错。
fn main() { let mut x = 10; let y = &x; let z = &x; *y += 1; *z += 1; println!("x = {}", x); }
-
性能:Rust语言提供了高效的编译和运行时机制,编译时采用了LLVM,可以生成高效的机器码,媲美C++和C语言。运行时,Rust使用了内存安全机制来保证程序的稳定性和性能。
-
类型安全:Rust语言通过静态类型系统来保证类型安全,避免了在运行时发生错误。在 Rust 中,类型不匹配将会在编译时报错,而在 C++ 和 C 中可能会在运行时才出现错误。例如,Rust使用了像借用检查和所有权系统之类的机制来防止数据竞争和使用未初始化的内存,这些都有助于减少程序中常见的安全漏洞。
举个例子,在C++中下面代码是有问题的,因为函数get_num()返回了局部变量x的地址,而x在函数结束后就不存在了。但在Rust中上述代码是不能编译的,因为Rust编译器会检测到这里的x是不可变的,不能在main()中试图修改它。以下是C++和Rust代码对比:
C++代码:
int* get_num() { int x = 10; return &x; } int main() { int* p = get_num(); *p = 6; return *p; }
Rust代码:
fn get_num() -> &i32 { let x = 10; &x } fn main() { let p = get_num(); *p = 6; *p }
-
并发编程:Rust语言提供了丰富的并发编程支持,比C++和C语言更容易。
fn main() { let mut x = 0; let handle = thread::spawn(|| { x += 1; }); handle.join().unwrap(); println!("x = {}", x); }
-
生态系统:Rust语言拥有强大的生态系统,提供了丰富的库和工具,如 reqwest可以让我们方便地进行网络请求。
extern crate reqwest; use reqwest::Client; fn main() { let client = Client::new(); let res = client.get("https://www.rust-lang.org").send().unwrap(); println!("status: {}", res.status()); }
所以,不要被网上的评论忽悠了,Rust也没有很难,他们都是人设计出来的,一点一点去吃透他,不知不觉就会用了,并且Rust拥有很多高效实用的特性帮助我们解决工程中的问题,性能还媲美C++/C这类中低级语言,下一篇我会说说Rust的安装、IDE以及环境,当然了,还有Rust的“Hello Wrold”。
今天的内容你有什么看法呢?欢迎在评论区留言讨论!如果觉得文章有用,记得点赞关注加收藏,以后就会第一时间收到文章推荐啦 :D
网友评论