标签 Rust 下的文章

Gopher的Rust第一课:建立Rust开发环境

本文永久链接 – https://tonybai.com/2024/05/10/gopher-rust-first-lesson-setup-dev-env

经过上一章的对Rust诞生演化的了解以及设计哲学的探讨后,如果你依然决定继续Rust编程学习之旅,那么欢迎你和我一起正式走进Rust学习和实践的课堂。

编程不是“纸上谈兵”,它是一门实践的艺术。编程语言的学习离不开动手实践,因此学习任何一门编程语言的第一步都是要拥有一个这门编程语言的开发环境,这样我们才可以动手编码,理论与实践结合,不仅加速学习效率,还能取得更好的学习效果。

在这一章中我们就先来学习下如何安装和配置Rust开发环境。如果你的机器上还没有Rust开发环境,那么就请跟我一起选择一种适合你的Rust安装方法吧。

第一步,我们先来挑一个合适的Rust版本。

2.1 选择Rust版本

2.1.1 Go与Rust发布版本与节奏的对比

《Go语言第一课专栏》讲解如何建立Go开发环境时,我首先讲解的也是选择Go版本。我们知道Go一年发布两次大版本,分别是每年的2月和8月,并且Go核心团队只对最近的两个大版本提供support。在处于support时间窗口中的时候,Go核心团队会发布一些补丁版本,修正及少量的严重问题或安全漏洞。比如Go 1.22版本是2024年2月份发布的,到2024年4月中旬,Go 1.22的最新补丁版本已经到了Go 1.22.2了。下图展示了Go版本发布的节奏以及support的窗口:

在Go中,我们可以选择最新稳定版(比如图中的Go 1.22.2)和次新稳定版(比如图中的1.21.8),这两个是Go社区选择最多的。此外,也可以选择某个特定的稳定版(因某种特殊原因,被阻塞在该版本上)以及tip版,其中tip版(master分支上的最新commit版本)主要用于体验最新的、尚未发布的功能特性或问题修复,或是contributor多使用tip版。

Rust的版本发布节奏与Go完全不同,因此Rust版本的选择逻辑与Go相比也就有所不同。下图展示了Rust的版本发布方法与节奏:

我们看到:Rust采用“6周一个稳定版”的滚动发布节奏,并且有三类版本:稳定版(stable)、公测版(beta)和nightly版,分别对应的是stable分支、beta分支和master分支。三个版本间是关联紧密的。

以图中的rust 1.77.0的发布为例,rust 1.77.0稳定版本的发布动作是这样的:

  • 基于当前beta分支(其实就是1.77.0 beta)创建新的stable分支,并tag 1.77.0;
  • 基于当前master分支(nightly版本)创建新的beta分支,并在新的beta分支上公测1.78.0版本,为六周后的1.78.0稳定版做准备;
  • 而master分支上继续开发v1.79.0的新特性,并每天发布Nightly版本。

之后,原1.76.0稳定版便会从support窗口删除,1.77.0进入Support窗口。如果新发布的1.77.0有紧急或安全问题需要修复,则通过补丁(patch)版本进行,比如rust 1.77.1、1.77.2等。

Rust这种“稳定一版,公测一版,开发一版”的“三路并发”的滚动开发节奏,显然要比Go的“稳定一版,开发一版”的“两路并发”节奏要快上很多。不过,频繁的更新可能对某些用户来说是一个挑战,需要他们不断学习和适应新的变化。另外,较快的演进速度也可能导致一些不稳定因素,需要开发者更加谨慎地使用新功能特性。

2.1.2 Rust的三类版本

选择Rust版本根据自己的角色和面对的场合来进行:

  • 对于大多数Rust开发者而言,最新的稳定版(stable)是最好和最明智的选择;
  • 也有少部分因为各种特殊原因,可能阻塞在某个特定的稳定版上;
  • Beta版contributor,或是想提前尝鲜下一个稳定版新特性的开发人员,可以临时使用beta版本;
  • Nightly版,主要针对的也是contributor,或是想临时尝鲜最新不稳定功能特性的开发人员。

Rust提供的安装和升级工具rustup可以灵活的在三类版本间切换:

rustup default beta
rustup default nightly
rustup default stable

切换后,rustup会自动同步该类版本到最新版:

$rustup default beta
info: syncing channel updates for 'beta-x86_64-apple-darwin'
info: latest update on 2024-04-11, rust version 1.78.0-beta.6 (27011d5dc 2024-04-09)
... ...

确定了要使用的Rust版本后,我们接下来就来看看究竟如何安装Rust。

2.2 安装Rust

2.2.1 使用rustup安装

和Go尽可以通过安装包或下载预编译二进制包进行首次安装不同,Rust官方提供了统一的Rust安装、管理和升级工具- rustup。 Rust官方在Linux和macOS上提供了“curl | sh”的一键式安装命令:

$curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

我们以Linux下安装rustup为例,看一下执行上面命令的过程和最终结果:

$curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /root/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory is located at:

  /root/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /root/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /root/.profile
  /root/.bashrc

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:

   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation

> // 敲击回车

info: profile set to 'default'
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2024-04-09, rust version 1.77.2 (25ef9e3d8 2024-04-09)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 14.9 MiB /  14.9 MiB (100 %)   3.7 MiB/s in  3s ETA:  0s
info: installing component 'rust-std'
 24.3 MiB /  24.3 MiB (100 %)   8.2 MiB/s in  2s ETA:  0s
info: installing component 'rustc'
 60.3 MiB /  60.3 MiB (100 %)   9.6 MiB/s in  6s ETA:  0s
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'

  stable-x86_64-unknown-linux-gnu installed - rustc 1.77.2 (25ef9e3d8 2024-04-09)

Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.

This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env"            # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish

接下来按照提示执行下面命令,使得Rust相关的环境变量生效:

$. "$HOME/.cargo/env"
$which rustup
/root/.cargo/bin/rustup

. “$HOME/.cargo/env”这行代码也被追加到/root/.bashrc文件中,如果新启动一个terminal窗口,这行shell配置也会被执行,即rustup的环境变量也生效。

查看一下安装的rustup的版本:

$rustup -V
rustup 1.27.0 (bbb9276d2 2024-03-08)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.77.2 (25ef9e3d8 2024-04-09)`

同时我们看到:首次安装rustup时,如果选择“standard installation”,rustup会为我们安装一个最新的Rust stable版本,这里是1.77.2,我们可以通过rustup show命令查看已安装的rust工具链:

$rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /root/.rustup

stable-x86_64-unknown-linux-gnu (default)
rustc 1.77.2 (25ef9e3d8 2024-04-09)

除此之外,rustup还在你的系统中都做了啥呢?我们下面来探索一下。

2.2.1.1 安装后的探索

根据rustup在安装过程中的提示,有两个路径是需要重点关注的。

一个就是\$HOME/.cargo,rustup将.cargo/bin加入到了\$PATH变量下,我们来看看.cargo下都有哪些目录和文件:

$tree -F .cargo
.cargo
|-- bin/
|   |-- cargo*
|   |-- cargo-clippy*
|   |-- cargo-fmt*
|   |-- cargo-miri*
|   |-- clippy-driver*
|   |-- rls*
|   |-- rust-analyzer*
|   |-- rustc*
|   |-- rustdoc*
|   |-- rustfmt*
|   |-- rust-gdb*
|   |-- rust-gdbgui*
|   |-- rust-lldb*
|   `-- rustup*
`-- env

.cargo下主要的目录就是bin,这里存放了日常rust开发时在命令行使用的所有cli命令,包括cargo(构建管理工具)、rustc(编译器)、rustdoc、rustfmt以及rustup自身等。

另外一个更值得关注的目录就是\$HOME/.rustup目录,这个目录下的内容较多,我们通过tree命令查看的结果如下:

$tree -F -L 3  .rustup
.rustup
|-- downloads/
|-- settings.toml
|-- tmp/
|-- toolchains/
|   `-- stable-x86_64-unknown-linux-gnu/
|       |-- bin/
|       |-- etc/
|       |-- lib/
|       |-- libexec/
|       `-- share/
`-- update-hashes/
    `-- stable-x86_64-unknown-linux-gnu

settings.toml是一个rustup配置文件,它的内容如下:

$cat .rustup/settings.toml
default_toolchain = "stable-x86_64-unknown-linux-gnu"
profile = "default"
version = "12"

[overrides]

这里的default_toolchain指示了当前默认使用的工具链版本为stable-x86_64-unknown-linux-gnu。这个版本也是一个target,Rust支持的不同平台上的target以及含义如下图:

.rustup下的另外一个值得注意的目录是toolchains,它下面存放了安装到本地的所有版本的toolchain,上面由于只安装了stable的最新版本,因此当前toolchains下只有一个stable-x86_64-unknown-linux-gnu目录。

值得注意的是.rustup中存储了rust工具链的所有内容,因此它的空间占用也着实可观:

$ du -sh .rustup
1.2G    .rustup

现在我们来切换默认版本到beta:

$rustup default beta
info: syncing channel updates for 'beta-x86_64-unknown-linux-gnu'
info: latest update on 2024-04-11, rust version 1.78.0-beta.6 (27011d5dc 2024-04-09)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 15.1 MiB /  15.1 MiB (100 %)   3.4 MiB/s in  3s ETA:  0s
info: installing component 'rust-std'
 24.2 MiB /  24.2 MiB (100 %)   9.3 MiB/s in  2s ETA:  0s
info: installing component 'rustc'
 63.5 MiB /  63.5 MiB (100 %)   9.6 MiB/s in  6s ETA:  0s
info: installing component 'rustfmt'
info: default toolchain set to 'beta-x86_64-unknown-linux-gnu'

  beta-x86_64-unknown-linux-gnu installed - rustc 1.78.0-beta.6 (27011d5dc 2024-04-09)

我们看到rustup会自动下载安装最新的beta版本,安装后,我们再执行rustc -V来查看当前版本,我们发现结果已经变为了下面这样:

$ rustc -V
rustc 1.78.0-beta.6 (27011d5dc 2024-04-09)

这里值得注意的是,虽然我们执行的rustc是.cargo/bin/rustc,但.cargo/bin/rustc有些类似于一个指针,真正执行的是其“指向”的某个工具链版本的rustc,我们可以使用rustup which rustc来查看究竟执行的是哪个rustc:

$ rustup which rustc
/root/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/bin/rustc

此时,.rustup目录下面发生了怎样的变化呢?我们来看看:

$ tree -F -L 3  .rustup
.rustup
|-- downloads/
|-- settings.toml
|-- tmp/
|-- toolchains/
|   |-- beta-x86_64-unknown-linux-gnu/
|   |   |-- bin/
|   |   |-- etc/
|   |   |-- lib/
|   |   |-- libexec/
|   |   `-- share/
|   `-- stable-x86_64-unknown-linux-gnu/
|       |-- bin/
|       |-- etc/
|       |-- lib/
|       |-- libexec/
|       `-- share/
`-- update-hashes/
    |-- beta-x86_64-unknown-linux-gnu
    `-- stable-x86_64-unknown-linux-gnu

我们看到toolchains下面多了一个beta-x86_64-unknown-linux-gnu目录,存放的就是刚刚安装的beta最新版本工具链。

现在我们在用rustup show命令查看已安装的rust工具链,其结果如下:

$rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /root/.rustup

installed toolchains
--------------------

stable-x86_64-unknown-linux-gnu
beta-x86_64-unknown-linux-gnu (default)

active toolchain
----------------

beta-x86_64-unknown-linux-gnu (default)
rustc 1.78.0-beta.6 (27011d5dc 2024-04-09)

现在,我们切换回stable版本,由于stable版本之前已经安装完毕,也就无需下载和安装过程了:

$rustup default stable
info: using existing install for 'stable-x86_64-unknown-linux-gnu'
info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'

  stable-x86_64-unknown-linux-gnu unchanged - rustc 1.77.2 (25ef9e3d8 2024-04-09)

2.2.1.2 安装和使用特定版本rust工具链

我们还可以使用rustup安装特定版本的rust工具链,比如通过下面的命令,我们安装stable版本的1.66.0:

$ rustup install 1.66.0
info: syncing channel updates for '1.66.0-x86_64-unknown-linux-gnu'
info: latest update on 2022-12-15, rust version 1.66.0 (69f9c33d7 2022-12-12)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 19.0 MiB /  19.0 MiB (100 %)   4.4 MiB/s in  3s ETA:  0s
info: installing component 'rust-std'
 29.7 MiB /  29.7 MiB (100 %)   8.1 MiB/s in  3s ETA:  0s
info: installing component 'rustc'
 68.0 MiB /  68.0 MiB (100 %)  10.2 MiB/s in  6s ETA:  0s
info: installing component 'rustfmt'

  1.66.0-x86_64-unknown-linux-gnu installed - rustc 1.66.0 (69f9c33d7 2022-12-12)

info: checking for self-update

安装ok后,我们再来看看.rustup目录下的变化:

$tree -F -L 3  .rustup
.rustup
|-- downloads/
|-- settings.toml
|-- tmp/
|-- toolchains/
|   |-- 1.66.0-x86_64-unknown-linux-gnu/
|   |   |-- bin/
|   |   |-- etc/
|   |   |-- lib/
|   |   |-- libexec/
|   |   `-- share/
|   |-- beta-x86_64-unknown-linux-gnu/
|   |   |-- bin/
|   |   |-- etc/
|   |   |-- lib/
|   |   |-- libexec/
|   |   `-- share/
|   `-- stable-x86_64-unknown-linux-gnu/
|       |-- bin/
|       |-- etc/
|       |-- lib/
|       |-- libexec/
|       `-- share/
`-- update-hashes/
    |-- 1.66.0-x86_64-unknown-linux-gnu
    |-- beta-x86_64-unknown-linux-gnu
    `-- stable-x86_64-unknown-linux-gnu

我们看到toolchains下面多了一个1.66.0-x86_64-unknown-linux-gnu,那我们如何使用新下载的1.66.0 stable版本呢?有几种方法,下面逐一介绍一下。

我们可以使用rust工具链的“plus语法”在命令行上指定要使用的工具链,这个语法对cargo、rustc等工具链中的命令行程序都适用:

$ rustc +1.66.0 -V
rustc 1.66.0 (69f9c33d7 2022-12-12)
$ rustc +1.65.0 -V
error: toolchain '1.65.0-x86_64-unknown-linux-gnu' is not installed

$ cargo +1.66.0 -V
cargo 1.66.0 (d65d197ad 2022-11-15)
$ cargo +1.65.0 -V
error: toolchain '1.65.0-x86_64-unknown-linux-gnu' is not installed

注:cargo是Rust语言的官方构建系统和包管理器,它提供了一组命令行工具,可以自动化构建、测试和发布Rust项目。它还支持自动解析和下载依赖项,使得管理项目的依赖关系变得简单和可靠。Cargo是Rust生态系统中重要的工具之一,为开发者提供了高效和方便的开发体验。在后面的章节中我会详细介绍cargo。

对于要使用特定版本进行构建的rust项目,我们可以通过rustup override来指定版本号。下面就是一个这样的例子:

$cargo new hellorust
     Created binary (application) `hellorust` package
$cd hellorust/
$rustup override set 1.66.0
info: override toolchain for '/root/test/rust/hellorust' set to '1.66.0-x86_64-unknown-linux-gnu'

我们用cargo创建了一个新的hellorust项目,在hellorust项目下,我们执行rustup override来指定该项目使用1.66.0版本进行构建。

之后,我们分别在该项目目录下以及其他目录下执行rustc,我们看到输出结果如下:

~/test/rust/hellorust$ rustc -V
rustc 1.66.0 (69f9c33d7 2022-12-12)
$ cd ..
~/test/rust$ rustc -V
rustc 1.77.2 (25ef9e3d8 2024-04-09)

rustc override的原理其实是在$HOME/.rustup/settings.toml文件中添加了一些内容:

$cat .rustup/settings.toml
default_toolchain = "stable-x86_64-unknown-linux-gnu"
profile = "default"
version = "12"

[overrides]
"/root/test/rust/hellorust" = "1.66.0-x86_64-unknown-linux-gnu"

我们看到在overrides下新增了一条规则,指定了hellorust项目需要使用1.66.0-x86_64-unknown-linux-gnu这个工具链。

不过这种与本地路径紧耦合的配置方案并不是适合大范围协作,无法提交到git仓库中分享给其他人。

Rust还提供了另外一种override toolchain版本的方法,我们可以在hellorust项目的根目录下放置一个名为rust-toolchain.toml的文件,其内容如下:

// rust-toolchain.toml

[toolchain]
channel = "1.66.0"

我们先执行rustup override unset将上面设置的override规则取消掉:

$rustup override unset
info: override toolchain for '/root/test/rust/hellorust' removed

然后toolchain.toml就会生效了:

// 在hellorust路径下
$rustc -V
rustc 1.66.0 (69f9c33d7 2022-12-12)

显然,这里涉及到了override的优先级顺序问题。Rust规定版本override的优先级顺序由高到低依次是:

  1. plus语法:“rustc +1.66.0 -V”
  2. RUSTUP_TOOLCHAIN环境变量 (default: none)
  3. rustup override命令
  4. rust-toolchain.toml
  5. 默认toolchain

2.2.1.3 在Windows上安装Rust

上述通过“curl|ssh”安装rustup,并通过rustup安装Rust工具链的方法是在Linux和macOS上安装Rust的主流方法,但在习惯于图形化安装的Windows上,略有变通。在Windows上,我们可以下载和安装一个名为rustup-init.exe的程序,它等价于其他os上的rustup,但可以交互式的引导用户安装。

由于手旁没有Windows环境,具体的安装过程这里就不详细说明了。

2.2.2 离线安装包安装

和Go一样,Rust也提供了离线安装包的安装方式,在离线安装包下载页面可以找到各个平台的多种文件格式(目前包括.tar.xz、.msi和.pkg)的离线安装包。

习惯在Windows上开发Rust程序的开发者可以直接下载和使用.msi来安装Rust开发环境。

2.3 更新和卸载Rust

使用rustup来更新和卸载Rust非常简单方便。

以更新stable版本为例,通过下面命令,我们就可以将本地的stable版本更新到最新stable版本。以我的macOS为例,我通过rustup将stable版本更新为最新的Rust 1.77.2:

$rustup update stable
info: syncing channel updates for 'stable-x86_64-apple-darwin'
info: latest update on 2024-04-09, rust version 1.77.2 (25ef9e3d8 2024-04-09)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
 14.9 MiB /  14.9 MiB (100 %)   9.3 MiB/s in  1s ETA:  0s
info: downloading component 'rust-std'
 25.4 MiB /  25.4 MiB (100 %) 764.8 KiB/s in 12s ETA:  0s
info: downloading component 'rustc'
 54.9 MiB /  54.9 MiB (100 %)   8.6 MiB/s in  7s ETA:  0s
info: downloading component 'rustfmt'
  1.8 MiB /   1.8 MiB (100 %) 564.9 KiB/s in  3s ETA:  0s
info: removing previous version of component 'cargo'
info: removing previous version of component 'clippy'
info: removing previous version of component 'rust-docs'
info: removing previous version of component 'rust-std'
info: removing previous version of component 'rustc'
info: removing previous version of component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 14.9 MiB /  14.9 MiB (100 %)   4.2 MiB/s in  3s ETA:  0s
info: installing component 'rust-std'
 25.4 MiB /  25.4 MiB (100 %)  13.8 MiB/s in  2s ETA:  0s
info: installing component 'rustc'
 54.9 MiB /  54.9 MiB (100 %)  13.9 MiB/s in  4s ETA:  0s
info: installing component 'rustfmt'

  stable-x86_64-apple-darwin updated - rustc 1.77.2 (25ef9e3d8 2024-04-09) (from rustc 1.75.0 (82e1608df 2023-12-21))
... ...

通过更新的日志,我们看到rust的相关工具组件(比如cargo、rustfmt等)也得到了一并的更新。

Rust通过rustup提供了卸载Rust环境的命令:

$rustup self uninstall

Thanks for hacking in Rust!

This will uninstall all Rust toolchains and data, and remove
$HOME/.cargo/bin from your PATH environment variable.

Continue? (y/N) _

我们看到:rustup会在控制台上与你进行一个确认继续的交互,确认你真的要卸载。如果你输入y并按Enter键继续,那么rustup会移除所有与Rust相关的文件,包括工具链、库、环境变量等。

如果你需要保留一些Rust版本,可以先运行rustup toolchain list,查看已安装的版本。然后用rustup toolchain uninstall命令单独卸载不需要的版本:

$rustup toolchain uninstall 1.64-x86_64-apple-darwin
info: uninstalling toolchain '1.64-x86_64-apple-darwin'
info: toolchain '1.64-x86_64-apple-darwin' uninstalled

2.4 配置Rust

《Go语言第一课专栏》讲解安装Go之后的配置时,我们主要提到了国内开发者要配置一个合适的GOPROXY。而Rust的各个站点都在合规访问范围内,我们安装Rust后无需做任何配置即可敞开使用Rust。

不过也有开发者觉得通过Rust官方下载crate慢,希望更换国内源,这种换源主要涉及的是cargo这个工具,我们后续学习Cargo时再来说明如何换源以及换哪个稳定的国内源。

2.5 在线体验Rust

Go提供了在线的Go playground可供尚未在本地安装Go环境的开发者体验Go语法,Go playground提供了三个版本:最新稳定版、次新稳定版以及tip版本,并且可以将代码通过短连接分享给其他开发者,十分方便。

这方面Rust也不逞多让,提供了功能足够丰富的Rust Playground

在这里,我们可以选择Rust的版本:stable、beta还是nightly;可以选择编译模式,是debug还是release;可以选择Rust edition;可以选择执行一些工具,比如rustfmt;可以选择执行的命令:Run、Build、Test、MIR等。

不过,Rust、Go的playground毕竟只是用于在线体验的站点,他们具有共同的一些局限,比如:不支持第三方依赖,无法做复杂的多源文件项目的体验。

2.6 编辑器与IDE

对于开发人员来说,一门语言的开发环境不仅包含语言官方提供的编译器以及其他工具链,代码编辑器或IDE也是必不可少的。接下来,我们就来简单说说使用什么编辑器或IDE来开发Rust代码。

2023年Rust官方年度的用户调查显示,在编辑器/IDE使用排名中VSCode和VIM位列前二:

Jetbrain推出的商业版RustRover位居第三,正在迎头赶上,但由于是商业版,这里就不详细介绍了。下面我们分别介绍一下如何使用VSCode和VIM来开发Rust代码,都需要安装哪些插件。

2.6.1 使用VSCode开发Rust

使用上面介绍的rustup在本地安装Rust环境后,rust的相关工具(cargo、rustc、rustfmt、rust-analyzer等)就都已经就绪!使用VSCode开发Rust只需再安装一个扩展插件即可,它就是由Rust官方维护的rust-analyzer

该插件实现了Rust语言的Language Server Protocol,可以在开发者编写Rust代码时,提供代码补全、转到定义/实现/类型定义、查找所有引用、工作区符号搜索、符号重命名、悬停时的类型和文档、类型和参数名称的嵌入提示、语义语法高亮等功能。可以说,有了Rust-analyzer的帮助,开发者可以自由在Rust代码中徜徉了。

更详细的VSCode支持Rust开发的文档,可以参考Rust in Visual Studio Code

2.6.2 使用VIM开发Rust

和VSCode仅需安装一个扩展插件相比,VIM的配置就相对复杂一些了。目前Rust+VIM的主流方案是rust.vim + coc.nvim + coc-rust-analyzer

我们以安装了vim-plug插件管理器的VIM为例,下面是VIM的插件关系以及插件与Rust工具链的交互图:

首先,通过vim-plug安装coc.nvim和rust.vim,我们需要在~/.vimrc中添加下面代码:

call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'rust-lang/rust.vim' "for rust
call plug#end()

然后在vim中执行:PlugInstall安装coc.nvim和rust.vim。

rust.vim是Rust团队官方维护的vim插件,用于提供Rust文件检测、语法高亮显示、代码格式化等,它需要Vim 8或更高版本才能实现完整功能。

coc.nvim则是一个强大的Neovim (Vim的衍生版本)插件,主要用于提供代码补全、语法检查、代码导航等功能,支持多种编程语言。它基于微软的 Language Server Protocol (LSP),可以与各种语言服务器集成,从而为不同语言提供智能化的开发体验。

安装coc.nvim成功后,我们再在VIM中使用:CocInstall coc-rust-analyzer安装coc.nvim的插件:coc-rust-analyzer,通过该插件可以实现与LSP实现rust-analyzer的交互,从而实现代码补全、转到定义/实现/类型定义、查找所有引用等功能。

此外,我们还需要配置一下coc.nvim,配置文件在~/.vim/coc-settings.json中:

{
    "languageserver" : {
            "rust": {
              "command": "rust-analyzer",
              "filetypes": ["rust"],
              "rootPatterns": ["Cargo.toml"]
            }
  }
}

安装好上述插件并完成配置后,你同样可以使用VIM在Rust代码中徜徉!

2.7 小结

在这一章里,我们学习了如何建立Rust开发环境。

首先我了解到,Rust有stable(稳定版)、beta(公测版)和nightly(每晚版)三种版本渠道,发布节奏是每6周一个新的稳定版,与Go语言有所区别。对于大多数开发者来说,选择最新的稳定版是最明智的选择。

接着,我介绍了在Linux环境下使用rustup这个官方工具安装Rust的方法。rustup提供了一键安装命令,可以方便地安装不同渠道的Rust版本。

安装完成后,rustup在主机的主目录下创建了.cargo和.rustup两个目录。.cargo/bin存放了cargo、rustc等命令行工具,.rustup/toolchains则存放了安装的Rust工具链。

我们还学会了如何使用rustup在不同版本间切换,并演练了如何安装指定版本的Rust。另外,通过rustup的”plus语法”,可以在单个命令中临时使用特定的Rust版本。当然Rust提供了不止一种方法,还有rust-toolchain.toml文件、环境变量等方法,请注意这些方法的优先级顺序。

最后,我们还介绍了如何利用Rust playground在线体验Rust编码,以及Rust编码使用的两种最常使用的IDE和编辑器:VSCode和VIM,针对这两个工具,我分别介绍了Rust开发环境的配置方法。

相信大家通过本章内容,已经可以成功搭建了Rust开发环境了,这为后续的Rust编程学习打下了坚实的基础。


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

Gopher的Rust第一课:Rust的那些事儿

本文永久链接 – https://tonybai.com/2024/04/22/gopher-rust-first-lesson-all-about-rust

要说这两年后端编程语言谁最火,Rust说自己第二,没人敢说第一。Rust连续8年霸榜stackoverflow最受推崇的编程语言,甚至被推特之父Jack Dorsey称为“完美的编程语言”:

注:最火:仅代表人气最旺,最受欢迎,但并不代表使用者最多。

如果你经常读我的博客,你可能会问:“你不是Go语言布道师吗?怎么也要转Rust了?”其实不然,学习Rust不是要蹭热度,而是实际开发的需要。这些年在汽车行业这个赛道上,云端和车端都要兼顾。目前车端基础软件的开发语言主要是C/C++,但内存安全、性能不输C且高可靠的Rust日益受到车载软件开发的青睐,AUTOSAR组织在2022年成立了Rust工作组就是一个重要的信号。并且据我所知,一些国内造车新势力已经或正在将一些Rust开发的中间件或应用放到了量产车或即将量产的车上。

注:AUTOSAR (Automotive Open System Architecture) 是一个面向汽车电子系统的开放式软件架构标准,由汽车制造商、零部件供应商和电子供应商共同发起并持续维护的一个全球性标准化组织。

不过,Rust语言在某些领域的崛起确实引发了其他编程语言社区的一些不满和争议。特别是Rust社区的一些人提出“Rewrite Everything in Rust”的观点,让很多编程语言社区,尤其是C++社区十分不安。Go社区则相对更加开放和友好的,主流观点是Go与Rust是可以互补的,两种语言在各自的优势领域发挥作用,通过合作而非对抗的方式,能为开发者提供更好的选择。更多细节,可以参考几年前我曾翻译过的前Go团队产品经理、gohugo的作者Steve Francia联合创作的一篇文章《Rust vs. Go:为什么强强联合会更好》。

也就是说Go依然是我的主力语言,但考虑工作上的需要,我要系统学学Rust了。为了避免“从入门到放弃”,我打算采用边学习边输出的方式,一方面可以督促自己学习,另一方面也希望能和读者及时互动,纠正学习中的错误理解。

我的Go语言第一课专栏广受欢迎,其知识结构想必也是大家认可的,这里我就仿照其形式,写一下学习Rust的第一课这个入门系列。

正如我在Go语言第一课专栏所说的那样:我一直认为,当你开始接触一门新语言的时候,你一定要去了解它的历史和现状。因为这样,你才能建立起对这门语言的整体认知,了解它未来的走向。而且,也能建立起学习的“安全感”,即相信它能够给你带来足够的价值和收益,更加坚定地学习下去。

在这篇文章中,我就先来了解一下Rust的诞生历史和现状发展,以及它独特的设计哲学。并与Go语言做个简单对比,希望能够让自己和读者对Rust有一个初步的认识。

1.1 Rust的历史与现状

1.1.1 Rust的诞生与演进

Rust诞生于2006年,这比Google三巨头“密谋”创建Go语言还要早上一年。不过和Go的三位创始人:图灵奖获得者、C语法联合发明人、Unix之父肯·汤普森(Ken Thompson),Plan 9操作系统领导者、UTF-8编码的最初设计者罗伯·派克(Rob Pike),以及Java的HotSpot虚拟机和Chrome浏览器的JavaScript V8引擎的设计者之一罗伯特·格瑞史莫(Robert Griesemer)相比,Rust之父格雷登·霍尔(Graydon Hoare)的身份和江湖地位却没有那么“显赫”。彼时的他只是Mozilla Research的一位加拿大籍的、不到30岁的开发人员:

注:Graydon Hoare这个人非常低调,极少在公开场合露面,因此在网络上很难找到他的肖像,上面图中的肖像来自https://www.crunchbase.com/person/graydon-hoare,我这里甚至不能保证这个肖像就是Hoare本人的。

新生代编程语言的诞生都伴随着一段轶事,比如Go语言的创始人们在Google内部经常遇到C++项目漫长的编译时间问题,每当他们启动一个C++项目的编译,都要等很长时间,期间都能喝上几杯咖啡。这让他们深有感触并意识到需要设计一门编译速度更快的新语言,于是Go语言就这样诞生了。和Go语言“喝咖啡,等C++项目编译”类似,Rust的诞生也有一段轶事:

2006年,29岁的Hoare有一天回到温哥华的家中,但他发现电梯坏了,电梯软件崩溃了!他不得不爬楼梯回到位于21层的家中。当他爬上楼梯时,他感到很恼火。他想:“我们做计算机编程的人居然无法制造出一部可以正常工作而不崩溃的电梯!” Hoare知道,许多此类崩溃都是由于程序使用内存的问题造成的。电梯等设备内部的软件通常是用C++或C语言编写的,这些语言以允许程序员编写运行速度非常快且相当紧凑的代码而闻名。问题是这些语言也很容易意外引入内存错误,这些错误会导致崩溃。Hoare决定对此做点什么。于是他打开笔记本电脑,开始设计一种新的计算机语言,他希望这种语言能够编写小而快速的代码,而不会出现内存错误,他将其命名为Rust

这段轶事显然不可考证了。但可以确定的是从2006年开始的若干年里,Hoare创建的个人语言项目Rust并没有真正的用于改善电梯系统的程序,而是在得到了Mozilla的赞助下,用在了持续开发Mozilla的浏览器引擎Servo上了,Mozilla在2010年官宣了该项目,Hoare在2010年的一次演讲中也第一次介绍了Rust语言:

Rust开源的第一行代码也是在2010年完成的:

此外,最初的Rust编译器是由OCaml实现的,2011年Rust团队使用Rust基于LLVM重新实现了编译器并实现了自举。同年,Rust也有了自己的LOGO,其设计灵感来自于自行车齿盘

2012年,Graydon Hoare接受InfoQ专访,谈及他带领Rust team在Mozilla开发的系统编程语言Rust,包括Rust的特性、Rust相对于C/C++/Java/Go的优势与不同以及Rust的1.0版本发布计划。

但是,就在下一年,即2013年,Graydon Hoare就因为精力耗尽而辞去了Rust team的领导职务,离开了自己的Rust team,并从此远离了Rust开发。Hoare的离开对Rust team和语言本身来说是一次重大的损失,但Rust社区和团队采取了积极的措施来确保Rust的持续发展和演进。

2014年11月,Rust官宣了cargo和crates.io,前者是Rust项目构建管理器,后者则是Rust官方维护的Rust代码的中央包存储库,通过cargo可以轻松构建和发布包到crates.io,或从crates.io上拉取Rust代码的依赖。

2015年5月15日,Rust迎来了一个里程碑的时刻:Rust 1.0正式发布! ,这要比Go发布1.0版本迟了3年。但正如官博所说:“1.0版本的发布标志着混乱的结束。此版本是我们对稳定性承诺的正式开始,因此它为构建应用程序和库提供了坚实的基础。从现在开始,重大更改基本上超出了范围(一些小的警告适用,例如编译器错误)”。

Rust 1.0发布后,Rust的版本发布周期与节奏也得以确定下来,即每6周发布一个稳定版本,按照这个节奏,与Rust 1.0同时发布的还有Rust 1.1 Beta版本。经过六周的测试后,Rust 1.1 Beta转为Rust 1.1稳定版本,同时发布Rust 1.2 Beta版本,依次类推。当然,Rust还有一个nightly build版本,这个版本包含了最新但不稳定的特性。和Go社区和开发人员每年只能high两次相比,Rust开发者和社区更加幸运,每六周就能high一次!

Rust的演进是基于RFC(Request For Comments)驱动的,并且这一措施是早于Rust 1.0发布前就基于RFC确定下来的。这与Go的Proposal process类似,但感觉比Go的流程更规范和严谨,当然这与两种语言的治理结构的组成和规则有关。

然而,Rust 1.0的发布只是Rust语言发展的一个新起点,这件事并没有像Go语言在2009年宣布开源那样获得足够的曝光度并赢得TIOBE年度最佳编程语言的称号。

Rust之后的发展依旧是一波三折,这主要也是缘于Rust当时没有一个“好爹”:


TIOBE Rust曲线(2012~2024.3)

2020年,Rust语言迎来了自己诞生以来的至暗时刻。因新冠疫情全球流行导致的业绩下滑,2020年8月,Mozilla解雇了全球1000名员工中的250名,这其中就包含Servo引擎背后的团队。该事件引起了人们对Rust未来的担忧,因为团队的一些成员是Rust的主要贡献者。

但塞翁失马焉知非福,2021年2月8日,由五家创始公司(AWS、华为、谷歌、微软和Mozilla)共同赞助的独立非营利组织Rust基金会宣布成立!Rust团队终于有了新家,并且这次除了亲爹Mozilla外,还有四个财大气粗、执IT牛耳的干爹,Rust语言的未来一下变得光明了。

实际上Rust的发展也是如此,从2021年基金会成立至今(2024.4),Rust取得了长足的发展:语言特性不断增强,编译器性能持续优化,生态系统日渐壮大和完善,增加和完善了对WebAssembly、嵌入式、大数据、区块链、人工智能等领域的支持。下面我们就来说说Rust语言的现状。

1.1.2 Rust的现状发展

1.1.2.1 语言排名

虽然Rust热度很高,但在语言排名方面与几乎同期的Go还有一定差距,在2024.3月的TIOBE排名中,Go稳居第8位,而Rust虽然刷新了自己的历史最高排名,但也仅仅排在第17位:


TIOBE Rust 2024.3排名

Redmonk 2024.1月排名中,Rust位列19位,Go位列12位:


Redmonk Rust 2024.1排名

不过,Rust的热度和社区活跃度甚至要高于Go,究其根源,我认为还是与两个开源语言的治理结构有关,下面是Go和Rust在Reddit论坛上的拥趸数量与在线人数对比(2024.4.6 21:39北京时间):

如果能持续保持住这样的热度和发展势头,Rust可能在未来几年迅速接近Go的位置,甚至超越也是有很大可能的。

和Go开发人员自称Gopher类似,Rust开发人员自称Rustacean,这是一个结合了“Rust”和“Crustacean”(甲壳类)两个词语的组合词。此外,Rust社区还设计了Rust的非官方吉祥物(mascot):Ferris,一只可爱的红色螃蟹,它是由设计师Karen Rustad Tölva在2010年创作的。Ferris象征着Rust语言的安全性、并发性和生产力,同时也代表着Rust社区的活跃和友好。

crates.io上还有一个名为ferris-says的crate,可以用来打印Ferris吉祥物相关的文字,可以输出像下面这样的ASCII字符拼接出的Ferris形象:

1.1.2.2 语言采纳

从上面TIOBE的Rust排名曲线来看,Rust在2018 edition和2021 edition前后到达过两个“尖峰”。各大公司以及初创也基本都是在2018 edition之后开始逐渐采纳Rust的。

注:关于Rust edition,感兴趣的读者可以先参考Rust官方文档,在后续学习cargo和Rust项目编译构建的时候,我们还会深入学习和理解edition。

接下来,我们列举一下Rust基金会创始公司以及其他一些知名IT公司和组织对Rust的采纳情况。

  • AWS

除了成为Rust基金会创始成员,让大家真正知道了AWS对Rust投入的决心外,真正让大家看到AWS内部大量使用Rust的文章是2022年2月AWS在官博发表的一篇名为Sustainability with Rust的文章,这篇文章介绍了Rust在AWS内部基础设施构建上发挥的关键作用,包括用Rust进行Firecracker、AWS Lambda、Amazon S3、 Bottlerocket等开发。这篇文章还引用了一篇2017年发表的论文Energy Efficiency across Programming Languages中的结论,认为Rust在能耗方面的优势是其他语言如Go、Java不能匹敌的,这一定程度上引发了争议,记得Russ Cox在Twitter上海批驳了这篇文章中引用的数据不准确。

  • 华为

作为国内以一己之力力抗美帝的通信、IT、手机、汽车等多赛道公司,同样也是拥有处理器、OS、编译器等全技术栈的研发型公司,华为对Rust这一的系统级编程语言尤为青睐。但从公开资料上能看到的东西不多,从华为可信编程实验室的主页上,我们看到了Rust在华为应用的一些情况。

华为的目标是在全球最大的电信行业设计值得信赖的软件系统。华为正在努力将部分代码库迁移到Rust,它比C/C++更安全且性能更高。为了帮助开发人员完成这个过程,华为利用开源C2Rust翻译器直接从C生成Rust代码。

huawei还在内部用Rust开发了一组丰富的内部库,这些库围绕基于actor的并发范式而构建,这样利用Rust语言功能(例如async、await等)简化了异步编程。

  • Google

Google已将Rust应用到Chromium、Android和FuchsiaOS中,其中Chromium对Rust的支持处于实验阶段。开发者可以使用Rust来开发适用于Android和FuchsiaOS的组件,并且Rust在Android和FuchsiaOS的内部代码中使用的比例相当大,特别是FuchsiaOS,Rust代码已经超过50%。由于内部Cpp代码量较大,2022年10月,谷歌推出了基于开源RISC-V芯片的新型安全操作系统KataOS。Sparrow是KataOS的参考实现,运行在seL4上,几乎完全用Rust编写。该操作系统不是为台式电脑或智能手机设计的,而是为物联网设计的,可用于智能家居设备。目标是为嵌入式硬件或边缘设备构建可验证的安全操作系统,例如捕获图像的网络连接摄像头,这些图像在设备上或云中处理以进行机器学习。在2022年发布的Android 13版本中,谷歌还宣布Android版本13中大约21%的新原生代码(C/C++/Rust)是Rust。AOSP拥有约150万行Rust代码,涵盖了新功能和组件。此外,Android的Rust代码中已发现零内存安全漏洞。为了实现提高Android内部安全性、稳定性和质量的目标,Android团队还表示,Rust应该用在代码库中需要原生代码的任何地方。

  • 微软

Microsoft拥有世界上最大的用C/C++编写的代码集合之一,其所有核心产品(例如Windows、Office和Azure云)均使用该代码。2019年,微软开始探索内存安全的编程语言,并试用了Rust。随后,Rust for Windows Library在GitHub上开源,使Rust开发人员能够顺利使用Windows API。

2022年,微软Azure CTO Mark Russinovich表示,新项目不应再使用C和C++。他建议,Rust应该用于需要非GC语言的项目,以提高安全性和可靠性。

2023年7月,微软宣布在Windows 11 Insider Preview Build 25905版本中发布了Rust参与编写的Windows内核模块。其中包含了一个 GDI 引擎的实现。

  • Meta(前身为Facebook)

虽然不是创始成员,但财大气粗的Meta目前已经是唯一非创始成员的铂金赞助商了。Meta历史上以C++为主,但从2021年开始,Rust便开始大量使用Rust了,并成为Meta支持的服务器端语言列表中的最新成员。

Meta在2021和2022年先后发表过A brief history of Rust at FacebookProgramming languages endorsed for server-side use at Meta详细说明了Rust在Meta内部的应用,感兴趣的读者可以去看看。

  • Linux基金会

炒得沸沸扬扬的在Linux Kernel中支持Rust语言终于尘埃落定,Linux Kernel 6.1版本对Rust提供了支持。Rust同时进入Windows、Linux内核,这让Rust的江湖地位得到进一步提升。相信未来,Rust在两大操作系统内核中的代码比例会逐步提升的。

  • 其他一些公司对Rust的应用

2024年初,cloudflare公司开源了其内部替代nginx的Rust库pingora,作为业界一家提供互联网基础设施和网络服务的公司,其采用Rust的示范效应也是非常明显的。

influxdb的母公司influxdata在2023年发布了influxdb 3.0版本,该版本采用Rust全面重写。不光是influxdb,诸多新兴时序数据库都采用了Rust技术栈(+Arrow+Parquet+DataFusion),比如greptimedb、cnosdb、CeresDB等。

字节跳动内部服务大量使用Go,但这几年也有一些Rust爱好者在字节内部布道Rust,并开源了诸如Rust RPC框架volo、基于io-uring的Rust async runtime monoio等。

埃隆马斯克的xAI在2024年发布的grok-1大模型中,Rust开发的Qdrant向量数据库也发挥了重要作用,也是Rust在AI领域应用迈出的重要一步。

1.1.2.3 应用领域

在Rust官网,我们能看到官方列出的Rust应用的四大领域:

在这四个领域中,Rust都有非常活跃的发展和应用,每个领域都有大量的优秀开源项目,这里无法穷尽,大家可以参考与awesome-go类似的awesome-rust项目查看自己关于领域的开源项目。

1.1.2.4 工作机会与薪酬

devjobsscanner统计的2023年的各个编程语言的工作需求来看,Rust目前依旧比较小众!

stackoverflow 2023薪酬统计来看,Rust薪资位于中游:

另外4 day week的工作数量和薪酬分析也印证了上面两点:Rust小众(工作数量相对较少),薪酬位于中游:

国内Rust的工作数量与国际相同,都处于较少的位置,但国内Rust薪酬数据可能并不低,因为这些Rust岗位基本都在一线大厂,或是拿了较多融资的初创,待遇可能都比较不错。

了解了Rust的诞生和演化历史以及Rust的不错的现状后,我们再来看看Rust的设计哲学。

1.2 Rust的设计哲学

设计哲学之于编程语言,就好比一个人的价值观之于这个人的行为。因为如果你不认同一个人的价值观,那你其实很难与之持续交往下去,即所谓道不同不相为谋。类似的,如果你不认同一门编程语言的设计哲学,那么大概率你在后续的语言学习中,就会遇到上面提到的这些问题,而且可能会让你失去继续学习的精神动力。因此,在真正开始学习Rust语法和编码之前,我们还需要先来了解一下Rust的设计哲学,等了解完这些之后,你就能更深刻地认识到自己学习Rust的原因了。

1.2.1 Rust核心价值观

2019年6月,Rust核心组成员Stephen Klabnik在QCon London发表了一次名为How Rust Views Tradeoffs的演讲,在这次演讲中,他阐述了他个人理解的Rust的核心价值观,这些价值观是Rust team在做设计取舍时拒绝妥协的点,它们包括内存安全、执行速度和生产力:

按照Stephen Klabnik的说法,这三个核心价值观也是有序的,首先是内存安全,这是Rust最为在乎的立身之本,其次是高性能,最后是生产力。当它们之间出现冲突时,按最高价值观决策!

这其实与Rust官方对Rust的介绍也是一样的:

官方的Reliable对应的就是内存安全(memory safety),而efficient则有两层含义,一是运行时的高效,另外一个方面则是构建时的生产力也要保持高水准。

这三个价值观是Rust语言的设计目标,也是Rust语言的特色和优势所在。在失去了Graydon Hoare这个语言之父后,这些价值观也成为了Rust核心团队在判定语言演进方向的根本依据。

  1. 内存安全

内存安全是Rust最重要的价值观,它意味着Rust程序在运行时不会出现内存泄漏(不使用unsafe代码的前提下)、缓冲区溢出、野指针等内存相关的错误。这些错误不仅会导致程序崩溃,还可能导致安全漏洞的产生。Rust通过所有权(ownership)、生命周期(lifetime)和借用(borrowing)等特性,在编译时最大程度地检查出这些错误,从而保证程序的内存安全。

Rust的内存安全机制不仅能够提高程序的稳定性和可靠性,还能够降低开发和维护的难度。由于Rust能够在编译时就检查出内存错误,开发者就不必再花费大量时间和精力去寻找和修复这些错误了。

  1. 高性能

高性能是Rust的仅次于内存安全的一个核心价值观,Rust语言的设计目标之一就是要成为一种高性能的系统编程语言。Rust通过零成本抽象、移动语义、泛型编程等特性,使得程序能够在运行时达到与C、C++等传统系统编程语言相当的性能。

Rust的高性能机制不仅能够提高程序的运行速度,还能够降低硬件成本。由于Rust能够更好地利用硬件资源,因此在相同的硬件条件和资源开销下,Rust程序的性能通常比其他语言的程序更高。

  1. 生产力

生产力是Rust的第三个核心价值观,Rust语言的设计目标之一就是要成为一种能够提高开发者生产力的语言。Rust通过包管理器Cargo、智能编辑器支持、丰富的库生态、详实系统的文档等特性,使得开发者能够更轻松地编写、调试和维护Rust程序。

1.2.2 Rust的次要价值观

Stephen Klabnik还总结了三条Rust的次要价值观(secondary values):

我们看到:Rust的次要价值观包括ergonomics、compile times和correctness,这三个价值观也是Rust语言的设计目标之一,但和上面的第一级核心价值观相比,它们是可以被妥协掉的。

Ergonomics是指Rust语言的易用性,它是Rust语言的一个重要设计目标。Rust希望通过简单易用的语法和丰富的库生态,使得开发者能够更轻松地编写Rust程序。

Compile Times是指Rust编译器的编译时间。Rust编译器很慢,这是一个问题,Rust team也正在努力优化,但Rust team更关心二进制文件的最终执行速度,而不是让编译器变得更快,这就是Compile Time作为次要价值观的原因。

Correctness是指Rust语言的正确性,Rust真的很在乎你的程序是否正确,Rust希望通过强大的类型系统和静态检查,来尽可能地保证Rust程序的正确性。但Rust不愿意使用完全依赖类型以及证明助手来证明你的代码是正确的。

1.2.3 与Go的价值观的对比

我们来对比一下Go官方的对Go的介绍,看一下其隐含的Go价值观(设计哲学):

在官方对Go的介绍中有三个关键词:Simple、Secure和Scalable。

Simple是Go语言的首要设计原则,Go语言的设计者希望Go语言能够简单易用,使得开发者能够更快地学习和使用Go语言,以快速形成生产能力。Go语言的语法简单易懂,并且去掉了许多其他编程语言中复杂的特性,如类型层次与继承等,使得Go语言更加简洁易学、易读、易用和易维护。

至于Secure,Go语言的设计者希望Go语言能够更加安全可靠,避免许多其他编程语言中常见的安全漏洞。Go语言通过垃圾回收机制来自动管理内存,避免了许多其他编程语言中常见的内存泄漏和缓冲区溢出等问题。同时,Go语言提供了轻量级的goroutine和通道机制,使得开发者能够更加方便地实现并发编程,并且通过数据竞争检测工具,避免了并发编程中常见的数据竞争问题。同时Go语言提供了简单易用的显式错误处理机制,让开发者不遗漏任一处错误处理。

Scalable则体现在Go面向工程、原生内置并发以及崇尚组合的设计哲学上了。 Go语言的设计者希望Go语言能够更好地支持可扩展性,使得Go程序能够更好地适应不同的组织规模、不同的工作负载和硬件环境。Go语言通过简单的语法、基于module的可重现的构建管理、极高的编译速度、高质量的标准库、实用的工具链、强大的内置并发机制以及面向接口编程等特性,使得Go程序更加可扩展,生产力更为高效。

总的来说,Rust更注重安全、底层控制和极致性能,而Go则更加关注简单、安全、扩展性与工程效率。两者在定位和设计哲学上存在区别,但也有一些共同特点,比如都拥有现代的工具链、活跃的社区等。

1.3 本章小结

在这篇博文中,我们了解了Rust语言的诞生历程、现状发展,以及它独特的设计哲学。通过与Go语言进行对比,我们可以看出两者在出身、目标和设计理念上的一些差异。

随着软件系统的复杂度不断提高,对安全性、性能和并发的需求也越来越高。作为一门专注于底层系统编程、性能极致化的新语言,Rust正在吸引越来越多开发者的关注。相信通过后面对Rust的全方面的系统学习,我和大家都能够更深入地理解和掌握Rust。

如果你认为Rust的价值观与你的十分匹配,你也认同Rust未来的发展。那就期待下一篇吧,在下一篇中,我们将开始动手学习Rust了!

1.4 参考资料


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats