[Rust_1] 环境配置 | vs golang | 程序运行 | 包管理
目录
Rust 环境安装
GoLang和Rust
关于Go
关于Rust
Rust vs. Go,优缺点
GoLang的优点
GoLang的缺点
Rust的优点
Rust的缺点
数据告诉我们什么?
Rust和Go的主要区别
(1) 性能
(2) 并发性
(3) 内存安全性
(4) 开发速度
(5) 开发者体验
Rust和Go的共同特点
交互性
何时应该使用GoLang?
何时应该使用Rust?
总结
Rust 学习
1.介绍
2、Rust简介
3、第一个Rust程序
4、初识包管理
5、总结
终极目标:用rust实现一个Pratt 解析器,并运行测试
预计实现结果:
学习契机:
- 有个作业涉及到了 pratt 解析的实现,然后搜论文的时候,发现论文中使用 rust 实现的,就学习了一下 rust。
- and 看到了说一旦学会了 Rust,即使是作为较为底层的开发人员,同样也能享受到像 py 一样的包管理的便利了 ovo
- (下篇文章会在学完语法后,就来尝试实现 pratt 啦)
参考资料:
社区 - Rust 程序设计语言
https://crates.io/
Rust 环境安装
linux 上 rust 环境安装,一行命令即可解决
sudo apt update && sudo apt install -y cargo
cargo new pratt_parser
win 上环境也好配,官网安装完包后 配合 vecode rust 插件即可
关于外网上面一篇关于 rust & go 的文章翻译
and 谨记 万变不离其宗,语言只是工具
GoLang和Rust
Rust vs. Go,在2024年,应该选择哪一个?或者说应该选择哪种语言——GoLang还是Rust。这可能是许多程序员在选择语言时考虑的一个问题。选择理想的编程语言被视为在这个不断变化的环境中取得成功的重要抉择。
- GoLang和Rust是当今使用的最年轻的编程语言。Go于2009年在Google推出,而在Go之后,Rust于2010年在Mozilla推出。
- 这两种语言在当前流行的编程语言工具中有一些相似之处和差异。
- 通过本文,我们将讨论Rust和Go之间的基本差异和相似之处。
关于Go
Go是一门开源的计算机语言,可以更轻松地创建简单、高效和强大的软件。
Go是精确、流畅和高效的。编写一个利用多核和网络机器的程序非常方便。
- Go或GoLang是由Google工程师创建的,他们希望创建一种既具有C++的效率,又更容易学习、编写、阅读和安装的语言。
- GoLang主要用于创建网络API和小型服务,特别是其goroutines,具有可扩展性。GoLang可以流畅地组装为机器代码,并提供舒适的垃圾回收和表示运行时的能力。
- Go是一种快速、静态类型的汇编语言,给人一种解释型和动态类型语言的感觉。Goroutines的语言使开发人员能够创建完全掌控并发的应用程序,例如大型电子商务网站,同时在多个CPU核心上调度工作负载。
因此,准确地说,它非常适合并行计算环境。
垃圾回收是Go的另一个特性,可以保证高效的内存管理。因此,未使用的内存可以用于新项目,而未使用的对象则从内存中“丢弃”。
关于Rust
Rust是一种静态类型的编译型编程语言,受到多种编程原型的支持。
- 该语言最初的创建目标是优先考虑性能和安全性,其中安全性是主要目标。
- Rust主要用于处理CPU密集型的活动,例如执行算法和存储大量数据。因此,需要高性能的项目通常使用Rust而不是GoLang。
- 理想情况下,Rust是C++的镜像。与GoLang和Java不同,Rust没有垃圾回收。相反,Rust使用借用检查器来确保内存安全。这个借用检查器强制执行数据所有权协议,以避免数据竞争。在这里,数据竞争意味着多个指针指向同一个内存位置。
- Rust是一种用于长时间大型或小型团队的计算机编程语言。对于这种类型的编程,Rust提供了高度并发和极其安全的系统。
Rust现在被广泛用于Firefox浏览器的大部分部分。在2016年之后,Rust被宣称为最受欢迎的编程语言。Rust是一种非常基础的语言,可以在短短5分钟内学会。
Rust vs. Go,优缺点
要准确决定选择Go还是Rust,最好看一下GoLang和Rust的优势和劣势。上面我们已经对它们有了简单的了解,下面是它们的优点和缺点。
GoLang的优点
- 它是一种简洁和简单的编程语言。
- 它是一种良好组合的语言。
- 以其速度而闻名。
- Go具有很大的灵活性,并且易于使用。
- 它是可扩展的。
- 它是跨平台的。
- 它可以检测未使用的变量。
- GoLang具有静态分析工具。
GoLang的缺点
- 没有手动内存管理。
- 因为它太容易,所以感觉很表面。
- 由于年轻,所以库较少。
- 其中一些函数(如指针算术)是底层的。
- GoLang的工具有一些限制。
- 分析GoLang中的错误可能很困难。
Rust的优点
- 提供非凡的速度。
- 由于编译器,提供最佳的内存安全性。
- 零成本抽象的运行时更快。
- 它也是跨平台的。
- 它提供可预测的运行时行为。
- 它提供了访问优秀模式和语法的方式。
- 它具有特殊的所有权特性。
- 它易于与C语言和其他语言结合使用。
Rust的缺点
- 尽管它确实很快,但有人声称它比F#慢。
- 它具有基于范围的内存管理,可能导致内存泄漏的无限循环。
- 在Rust中无法使用纯函数式数据框架,因为没有垃圾回收。
- Rust没有Python和Perl语言支持的猴子补丁水平。
- 由于语言还很新,可能会对语法感到担忧。
- 编译时有时会很慢,因此学习变得困难。
数据告诉我们什么?
- 根据一份报告,GoLang语言被认为是参与者最喜欢的语言。
- 我们对GoLang和Rust语言有了基本的了解,现在继续进行Rust vs. Go的比较,并清楚地认识到这两种语言之间的差异。
Rust和Go的主要区别
GoLang和Rust之间的主要区别包括:
- 性能
- 并发性
- 内存安全性
- 开发速度
- 开发者体验
(1) 性能
- Google推出Go作为易于编码和学习的C++替代品。Go提供Goroutines,通过其中一个可以通过简单地包含Go语法来运行函数。
- 尽管Go具有这些有用的功能和对多核CPU的支持,但Rust占据上风,超过了Go。
- 因此,Go vs Rust:性能是Rust在与GoLang的比较中获得更多分数的一个特点。这些编程语言都是为了与C++和C等价而创建的。然而,在Rust vs. Go的比较中,GoLang的开发速度略高于Rust的性能。
- 虽然Rust在性能上优于Go,但在编译速度方面,Rust落后于Go。
- 然而,人们对编译时间并不太在意,所以整体上Rust在这方面是胜利者。
(2) 并发性
- GoLang支持并发,在这一因素上比Rust有优势。Go的并发模型允许开发人员在不同的CPU核心上安装工作负载,使Go成为一种连贯的语言。
- 因此,在运行处理API请求的网站的情况下,GoLang goroutines将每个请求作为子进程运行。这个过程提高了效率,因为它将任务从所有CPU核心中卸载出来。
- 另一方面,Rust只有一个原生的等待或同步语法。因此,程序员更喜欢使用Go的方式来处理并发问题。
(3) 内存安全性
- Rust使用编译时头文件策略来实现零成本中断的内存安全性。如果不是内存安全的程序,Rust将无法通过编译阶段。实际上,Rust的好处之一就是提供了内存安全性。
- 为了实现内存安全的并发,Rust使用类型安全性。Rust编译器调查你引用的每个内存地址和使用的每个变量。Rust的这个特性将通知你任何未定义行为和数据竞争。
- 它确保程序员不会遇到缓冲区溢出的情况。
- 相比之下,Go在运行时完全自动化。因此,开发人员在编写代码时不必担心内存释放。
- 因此,无论是GoLang还是Rust都优先考虑内存安全特性,但在性能方面,GoLang具有数据竞争的可能性。
(4) 开发速度
- 在某些情况下,开发速度比性能和程序速度更重要。Go语言的直接性和清晰性使其成为一种开发速度较快的语言。Go语言具有更短的编译时间和更快的运行时间。
- 尽管Go既提供了开发速度和简单性,但它缺少一些重要的功能。为了使语言更简单,Google删除了其他编程语言中可用的许多功能。
- 另一方面,Rust比Go拥有更多的功能。Rust具有更长的编译时间。
- 因此,如果项目的优先级是开发速度,Go比Rust要好得多。如果你不太关心开发速度和开发周期,但希望获得性能和内存安全性,那么Rust是你的最佳选择。
(5) 开发者体验
- 由于开发Go的主要动机是简单和易用性,大多数程序员认为它是一种“无聊的语言”或“简单的语言”。Go中的功能有限,使得学习和实现非常简单。
- 相反,Rust具有更高的内存安全功能,使得代码更复杂,降低了程序员的生产力。所有权的概念使得Rust语言对许多人来说不是理想的选择。
- 与Go相比,Rust的学习曲线要陡峭得多。然而,值得注意的是,与Python和JavaScript等语言相比,GoLang的学习曲线也较陡峭。
Rust和Go的共同特点
- 在Rust vs Go的比较中,这两者之间有很多共同之处。GoLang和Rust都是许多年轻开发人员使用的现代编程语言。
- GoLang和Rust都是编译语言,都是开源的,并且都是用于微服务的计算环境。
- 此外,如果你对C++有一些了解,那么这两个程序都非常容易理解。
交互性
- Rust能够与代码进行接口交互,例如直接与C库进行通信。Rust没有提供内存安全性的认证。
- 交互性带来了速度。Go提供了与C语言配合使用的Go包。
何时应该使用GoLang?
- Go语言可用于各种不同的项目。根据一份报告,Go的用例包括网页开发、数据库和Web编程。大多数GoLang开发人员声称,由于Go的并发性,它对Web服务有一些限制。
- 不仅如此,Go还被列为后端Web开发的首选语言。Go语言还为Google Cloud Platform提供支持。因此,在高性能云应用中,Go确实是性能消耗大的语言。
何时应该使用Rust?
- Rust是一种几乎可以在任何地方使用的计算机编程语言。然而,仍然有一些领域比其他领域更适合使用。系统编程就是其中之一,因为Rust在高性能方面表现出色。
- 系统程序员基本上是在硬件侧开发的软件工程师。由于Rust处理硬件侧内存管理的复杂性,它经常用于设计操作系统或计算机应用程序。
- 尽管在开发者社区内对什么构成中级语言存在一些争议,但Rust被视为具有面向机器的现代语言的特点。
总结
- 这两种语言,GoLang和Rust,由于它们非常相近的起源时间,被认为是彼此的竞争对手。Go的发展速度比Rust快。这两种语言有很多相似之处。
- GoLang和Rust之间的区别在于Go是简单的,而Rust是复杂的。然而,它们的功能和优先级在各种有意义的方面有所不同。
- Go与Rust并驾齐驱。这意味着这完全取决于拥有的项目类型,主要取决于对业务来说什么是最好的。
Rust 学习
1.介绍
近些年来不断有新的语言崛起,比如当下非常火的 go 语言,不过相比于 C++,go 语言确实是非常简单的。
- 而
rust
作为一名新兴语言,与 go 又有些许不同,因为它的目标是对标系统级开发,也就是试图动摇 C、C++ 这两位纵横编程界数十年的老大哥位置。 - 比如我们最常用的
windows
系统,就是用 C/C++ 语言开发的,也正因如此,我们才能用 C++ 在 VS 中非常方便的调用 win API 函数。 - 而同样的,越是涉及到底层,需要控制的细节就会越多,即使是这位试图通过简便语法、便利包管理、安全可靠等良好特性脱颖而出的 rust 语言,也同样不例外。
- 目前来看,rust 语言最大的缺陷是诞生时间太短,生态还不够完善。
比如当你想要用 rust 写 GUI 程序,就很麻烦,因为官方目前还没有推出 GUI 库。
- 但这并非是无法解决的,rust 同样意识到了这个问题,所以它提供了简便的方式让你可以直接在代码中调用 C 语言开发的库。
- 这意味着只要是用 C 语言开发的库,你就能用 rust 语言调用它进行开发!
- 比如你可以使用 rust 绑定 C 开发的 FLTK、GTK 等 GUI 库就可以进行开发 GUI 程序了,当然也有正在发展的库,比如 egui、iced、tauri 等等。
目前比较推荐的是 Tauri,不过前提是需要会 web 前端,关于 Tauri 后续专栏会提到,并进行学习~
而 rust 带来的代码安全、便捷的开发又是 C 语言所无法比拟的,所以预测要不了多少年,随着 Rust 生态的不断完善,会取代很大一部分 C/C++ 的份额。
- 不过想要彻底将 C/C++ 取代,短时间内还是有点不现实的,比如
windows
、linux
、mac
三大操作系统以及各种 C/C++ 开源库的代码量是一个非常恐怖的数字,想要彻底替换,绝非一朝一夕之功。 - 同时需要注意:学习 rust 前,最好对 C/C++ 语言有一定的了解,否则 rust 里面的很多概念你都可能无法理解。
2、Rust简介
参考百度百科:
Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目。第一个有版本号的 Rust 编译器于2012 年 1 月发布。Rust 1.0 是第一个稳定版本,于 2015年5月15日发布。
可以看到,Rust 是 2015 才对外开放稳定版本的,距今不到 10 年,根据目前程序员对 Rust 这门语言的普遍评价来说,现在学习 Rust,还有机会享受到这门语言在不久的将来可能会带来的福利。
事实上现在在国内的招聘市场上,与 rust 语言相关的岗位已经开始变多了。
那么具体来说,Rust
能为开发人员带来哪些便利呢?
主要有以下几点:
- 内存安全
Rust 中的所有内存访问都经过了编译器的严格检查,并且在运行时不会出现空指针异常或数据竞争等问题。这意味着 Rust 代码具有更高的可靠性和安全性,可以避免常见的安全漏洞。
而 C/C++ 中则时常需要担心指针、内存问题,尤其是在大型项目中,非常容易因此出现各种各样的 Bug。 - 高效性能
Rust 具有与 C 和 C++ 相当的性能,并采用了现代语言的特性和设计理念,如智能指针、闭包和模式匹配等。这使得 Rust 很适合编写高性能、低延迟的系统级应用程序和库。 - 并发性
Rust 的所有权系统和借用规则使其易于编写线程安全的代码,即使在多线程环境下也可以保持高效率和可靠性。 - C/C++ 中则完全需要自己进行控制。
- 社区支持
Rust 拥有活跃的社区,在crates上提供了许多开源库、工具和框架,可以大幅度提升开发效率。
C/C++ 虽然学习的人很多,但却几乎没有官方的、活跃的社区可以供大家交流,都是在各搞各的。 - 统一包管理
C/C++ 中,最让人诟病的便是包管理了,想要用一个包,还需要自己下载、安装、配置等等。
-
- 💡在 AI 时代,是否可以借助 AI 来实现让 C++和 Rust 一样的包管理呢?(可行性)
- 之后的文章会更新和 AI 的讨论结果🤔
- 而 Rust 则直接提供了一个统一的包管理程序,只需要写一行代码,就能自动为你下载配置好你所需要的一切,并且还提供对应的文档,使用起来非常方便!
综上,你便能看出 Rust 的优势所在了。
- Python 语言之所以能火,有很多原因,而其中相当大的一个原因就是 Python 有一个统一的包管理程序
pip
,可以很方便的下载各种第三方包,而不需要像 C/C++ 那样自己配置。 - 而一旦学会了 Rust,即使是作为较为底层的开发人员,我们同样也能享受到这种便利了!
- 这是学习 C/C++ 所无法想象的,虽然目前有一个
vcpkg
包管理库很不错,但这毕竟不是标准委员会推出的,而是微软带头组织的一个开源项目,如果不会科学上网,中国几乎也无法使用。
3、第一个Rust程序
我们可以通过命令
cargo new projectName
来创建一个 Rust 项目。
比如运行
cargo new hello-world
然后它就会为我们在当前目录中生成一个项目文件夹:
这里简单对其介绍一下:
src
:这是存放代码的地方,以后我们写的 rust 代码就放在这个文件夹里面。.gitignore
:这同样是 git 使用的,用于忽略哪些类型文件,不进行版本管理,一般同样不用管Cargo.toml
:这个文件就很重要了,cargo
作为 rust 的包管理程序,就是通过这个文件知道你这个项目中需要哪些依赖库的
打开 Cargo.toml
,就能看到下面这样的内容:
对于想要用到的库,直接写在 [dependencies]
项的下面即可,后面我会再对其进行详细介绍。
然后来到 src
这个存放 rust 代码的目录里面。
- 这里面默认有一个
main.rs
文件,其中后缀.rs
便是rust
的简写,这个文件是rust
项目中不可或缺的,因为它将作为整个项目的入口文件。 - 注意:不可更改这个文件的名称!否则后面的编译将会直接失败!(hh 因为尝试过失败了,才知道......踩坑+1)
- 同样的,我们可以打开它:
这里写的是一个函数:
fn
:rust 中的关键字,即为function
的简写,代表后面跟着的是一个函数。main
:这个函数的名称,这里不可更改!因为这是程序的入口函数,程序将从这个函数开始顺序执行内部的代码。()
:与前面的函数名、fn
关键字、后面紧跟的{}
组成一个完整的函数签名,最简单的函数就是:fn name(){}
。{}
:函数体,即这个函数要执行的代码,比如这里填写的是println!(\"Hello, world!\");
,就是说要打印出"hello world"
这个字符串。
println!
是一个 rust
中的宏,用于简化我们输出一个字符串到控制台的步骤。
- 如果你学过 C/C++、python、java 等等其它语言,前期学习过程中可以直接把它当作一个
print
函数即可,只是要注意它的后面先有一个!
,然后才是()
。 - 这里同时要注意,每一个语句的结尾用的英文符号
;
,不用则会报错,这一点和 C/C++ 保持一致。
现在回到控制台,进入这个文件夹,然后来运行这段代码试一试,运行代码的命令为
cargo run
然后就可以看到它成功运行并打印出了 Hello World!
字符串。
- 如果你学过 C/C++,会发现到目前为止,
rust
比C/C++
会稍稍复杂一点,毕竟C/C++
只需要一个源代码文件就能输出hello world
了,而rust
却一上来就给我们生成了这么多文件。 - 但很快你就会发现 rust 这样做的好处,尤其是在后面开发项目时。
- 前面我们说了,rust 是一个编译型的语言,所以会编译成二进制后才能运行,我们可以在下面的目录中找到这个生成的
exe
程序:
不过直接点击它运行是不行的,因为前面的代码中我们只写了一个打印字符串的代码,打印完程序就结束了,后面我们会想办法解决这个问题。
上面提到的这个 cargo run
命令即为编译并运行当前项目的意思,可如果我只想编译,不运行呢?
那就可以使用命令
cargo build
其默认构建的是 Debug
版本,即可调试版本,直观的来说就是生成的 exe
程序会稍微比较大。
我们也可以构建 Release
版本,使用命令:
cargo build --release
直观来说,这个命令生成的可执行文件会较小:
如果你还是觉得它比较大,那么我们还可以使用一些工具来进一步压缩它,可以让它只有几十 kb,有兴趣的可以了解一下 upx
工具。
4、初识包管理
配置 IDE
我们 来 试一下 rust 官网提供的一个示例,来看看 rust 的包管理有多好用。
比如我想要在终端打印出下面这个图案:
这里就用到了 ferris-says
这个库,首先来到前面提到的 Cargo.toml
文件,然后在 [dependencies]
项添加一下这个库:
- 后面的数字是这个库的版本号,
Ctrl+S
保存后,vscode 就会自动给我们拉取这个库包到本地。 - 你可能也注意到了不知道什么时候,项目文件夹中多了一个
Cargo.lock
文件。
这个文件用于记录我们当前项目用到的所有库以及依赖,是由 cargo 自动管理的,我们无需操心。
现在来到代码中,让我们来使用一下这个库
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};fn main() {let stdout = stdout();let message = String::from("Hello lvy");let width = message.chars().count();let mut writer = BufWriter::new(stdout.lock());say(message.as_bytes(), width, &mut writer).unwrap();
}
第一次看上去,你可能会感觉怎么有点复杂啊?
- 因为这一小段代码就涉及到了 rust 中相当多的概念,所以我暂时并不会讲解这段代码的逻辑,你可以自己随意更改这段代码里面的字符串:
"Hello lvy"
- 然后运行上面这段代码,就能在终端看到输出的图案了。
- 而这个库的下载安装位置默认为当前用户文件夹的
.Cargo
文件夹中
至于库代码上层的这个文件夹,则是代表着仓库名
5、总结
学习 了 rust 的特点、安装、项目结构、IDE 环境配置、代码运行。
主要有以下几个命令需要稍微记忆一下:
cargo new
:新建一个 rust 项目cargo run
:直接运行代码cargo build
:只编译代码,不运行,默认编译的为debug
版本cargo build --release
:编译为release
版本
同时还可以使用 upx 工具减小最终编译程序的体积。