Rust语言从入门到入土 1:Rust的开始


没办法,还就那个得学一下Rust。本文参考官方教程:https://kaisery.github.io/trpl-zh-cn/ch01-00-getting-started.html

Rust从入门到入土

Rust语言从入门到入土 1:Rust的开始

我对学习的态度是,学习什么之前,得有足够的动力去学习他。所以得先明白他是什么,他有什么用。

1. 什么是Rust

简单的介绍,类似于CC++Rust是一种系统级编程语言,由Mozilla开发。它的设计目标是提供一种安全、并发、高效的编程语言,可以用于编写操作系统、网络服务器、嵌入式系统等高性能应用程序

Rust的语法类似于C++,但它采用了一些新的语言特性,例如所有权系统、借用和生命周期等,这些特性可以帮助程序员避免常见的内存安全问题,例如空指针引用和数据竞争等。Rust还提供了一些高级的并发编程特性,例如通道和闭包等,可以使编写并发程序更加容易和安全。

Rust的编译器非常快,并且可以生成高效的本地代码,所以Rust非常适合用于编写高性能的系统级应用程序。

此外,Rust还具有良好的跨平台性,可以在各种操作系统和硬件平台上运行。

Rust的Logo

2. Rust无痛开箱

学一个新语言,总得先准备好开发环境吧?

Rustup既是一个Rust安装器又是一个版本管理工具,在首次安装Rustup时,就会顺带把Rust的其他工具一起安装了。因此安装Rust的主要方式是通过Rustup这一工具

运行下面的命令安装Rustup

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

PS:curl会去https://sh.rustup.rs这个网站下载安装脚本,所以需要一些魔法。不过我把脚本内容贴在后面了,自己创建一个脚本运行效果也是一样的

然后开始安装:

安装Rustup-1

然后会输出一些关键信息,根据需要选择就好

安装Rustup-2

稍等片刻,大概喝杯咖啡的功夫就好了。PS:我的魔法不够强大!!!

Rustup安装-3

最后按照提示添加一下Rust环境激活命令到当前shell的配置文件,然后重新加载配置就好。

(echo 'source "$HOME/.cargo/env"' >> ~/.zshrc && source ~/.zshrc && cargo --version)|| echo 'fail'

PS:我用的是zsh,所以是~/.zshrc

安装成功则输出cargo版本,失败则输出fail

运气不错,一遍过

最后,Rust工具链全部在~/.cargo/bin目录下(如果你没修改的话),用ls查看一下

ls ~/.cargo/bin

查看Rust工具链

3. Rust开发环境配置

当然是宇宙第一编辑器啦!

VSCode的扩展,搜索Rust。找到点击install

或者你更熟悉命令面板(觉得命令面板更酷)的话,按下Command + P,然后输入:ext install rust-lang.rust

安装Rust的Language Server

然后创建一个Rust,看看有没有补全

(cargo new hello_world && code hello_world/main.rs) || echo fail

好耶,补全出现,可以开始快乐的写代码了!ヾ(@^▽^@)ノ

VSCode成功补全

4. Rustc和Cargo

Rust类似于C/C++一样,也需要使用编译器将源代码编译为可执行文件,而rustc就是Rust的编译器。除了编写单独的Rust源代码以外,Rust还可以使用Cargo来创建项目。

A. Rustc

学习一门新语言的时候,使用该语言在屏幕上打印Hello, world!是一项传统,我们将沿用这一传统!

1) 创建项目目录

首先创建一个存放Rust代码的目录。Rust并不关心代码的存放位置,不过对于会把Rust代码放到home目录中下的projects目录里的rust-learning目录

mkdir ~/projects/rust-learning && cd ~/projects/rust-learning && mkdir -p hello/hello_{rustc,cargo_init}

2) 编写源代码

Rust源代码以.rs为后缀,使用下面命令创建一个Rust源代码

cd hello/hello_rustc && code main.rs

然后编写如下的代码

fn main() {
    println!("Hello, world!");
}

3) 编译可执行文件

类似于gcc,使用Rustc编译Rust源代码

rustc main.rs -o main
ls

得到的main是可执行文件(有x权限)

rustc编译Rust源代码

4) 运行可执行文件

因为main已经有可执行权限了,并且是二进制程序,所以直接运行即可

file main
./main

运行可执行文件

B. Cargo

简单的程序,使用 rustc 编译是没问题的,不过随着项目的代码量的增长,项目编译起来就麻烦了。此外,因为项目还可能会依赖第三方的Rust库,因此在使用别人写好的Rust项目的时候还需要注意Rust依赖的问题。

Rust提供了一个叫做Cargo的工具,用于帮助我们开发、管理、分享Rust项目。

1) 创建项目

使用下面的命令创建一个Cargo管理的Rust项目

cd ~/project/rust-learning/hello
cargo new hello_cargo_new

而后,Cargo会帮助我们创建一个名为hello_cargo_newRust项目

Cargo创建一个Rust项目

Cargo new会创建一个新的目录,如果已经有一个目录,我们想要将这个目录转换为一个Cargo管理的Rust项目的话,那么就是用Cargo init

cargo init hello_cargo_init

Cargo初始化一个Rust项目

2) 项目结构

使用tree查看一下项目的目录结构

tree hello_cargo_new

Cargo创建的Rust项目的目录

其中:

  • Cargo.toml是项目的配置文件,使用TOML格式。其中描述了项目名称、使用的Rust版本、依赖的第三方Rust库等等信息。目前因为我们的项目是刚刚初始化的,自然没有任何依赖

    Cargo.toml的内容

  • src目录存放项目的源码

TOMLTom's Obvious, Minimal Language)是一种易于阅读和编写的配置文件格式,旨在成为配置文件的标准。TOML文件使用简单的语法规则,支持注释、键值对、列表和嵌套数据结构等特性,可以用于配置各种应用程序和工具。

TOML文件的语法规则非常简单,其中键值对使用等号或冒号进行赋值,列表使用方括号进行定义,注释使用井号(#)进行标识。下面是一个 TOML 文件的示例:

# This is a TOML document

title = "TOML Example"
description = "An example of TOML file format"

[author]
name = "John Doe"
email = "john@example.com"

[database]
server = "localhost"
port = 3306
username = "root"
password = "password"

在上述 TOML 文件中,使用 titledescription 定义了文档的标题和描述,使用 [author][database] 定义了两个域。在 [author]域 中,使用 nameemail 定义了作者的姓名和电子邮件地址,在 [database]域 中,使用 serverportusernamepassword 定义了数据库的连接信息。

TOML文件格式的简洁性和易读性,使得它在各种应用程序和工具中得到了广泛的应用,Rust 语言中的 Cargo 包管理工具就使用 TOML 文件来管理项目的依赖关系和构建配置。

此外,Cargo实际上在创建项目的同时,也会初始化Git仓库

cd hello_cargo_new && git status && ls -a

Cargo初始化一个空的Git仓库

3) 编写源代码

同样,我们还向src/mian.rs中写入输出hello world!的代码

fn main() {
    println!("Hello, world!");
}

注意:Cargo管理的Rust项目预期所以源文件存放在src目录中。项目根目录只存放READMELicense授权文件、Cargo配置文件和其他跟代码无关的文件。我们在编写项目的时候需要注意遵守这一默认的规定以保持项目的整洁

4) 构建项目

类似于CMakeMake这类C/C++项目的编译系统,他们在构建项目的时候可以编译所有源文件、更新目标文件(生成被修改过的源文件的目标文件而不用全部重新编译),Rust也提供了编译系统。

这个编译系统继承进了Cargo中,使用下面的命令编译项目

cargo build

注意,cargo build命令需要在项目根目录下运行

Cargo build编译项目

运行cargo build命令后,Cargo会将编译生成的中间文件、得到的可执行文件debug的目录中。可执行文件的名字就是项目名,我这里就是hello_cargo_new

tree -d -L 3 ./

target/debug目录中存放中间文件

5) 运行项目

我们可以直接运行得到的可执行文件

./target/debug/hello_cargo_new

直接运行可执行文件

不过Cargo提供了cargo run命令,他可以在完成编译后自动运行

cargo run

cargo run编译后自动运行

6) 发布项目

cargo build命令编译得到的可执行文件是带有符号表等帮助Debug信息的,使用--release选项来编译不带调试信息的发行版。

cargo build --release

编译发布版的项目

此时生成的中间文件、可执行文件都在target/release目录下

tree -d -L 3 ./

target/release目录中存放中间文件

因为不带调试信息,release版本的可执行文件小了很多

ls -alh target/{debug/hello_cargo_new,release/hello_cargo_new}

release版本比debug版本小4K字节

7) 检查项目

cargo build会调用Rust编译器,按照编译原理的步骤,一步步进行下去,词法分析、语法分析、语义分析,直到最后生成包含目标平台二进制指令的可执行程序。

但是在写代码的时候我们可能只想检查一下语法对不对,既能否通过前面的词法分析、语法分析,而不关心最后是否生成可执行程序,所以没必要去生成可执行程序。使用cargo build确实可以完成检查,不过因为cargo build需要生成可执行程序,所以速度会慢很多。

为此,Cargo提供了cargo check命令来快速检查代码的语法,该命令不会生成可执行程序。

cargo clean && time cargo build
cargo clean && time cargo check

cargo check比cargo build快了很多

5. 把Cargo当成习惯

对于简单项目,Cargo并不比rustc提供更多的优势,不过随着开发的深入,Cargo会越来越方便。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让Cargo协调构建过程就会简单得多。

hello_cargo 这个Rust项目十分简单,但是却使用了很多之后我们Rust生涯将会用到的实用工具。

其实,要在任何已存在的项目上工作时,可以使用如下命令快速开始开发,爽的雅痞(*\^▽\^*)

git clone example.org/someproject
cd someproject
cargo build

例如我现在用的ls命令的替代品exa就是Rust开发的,当然你可以在APT上下载预编译好的exa可执行文件,如果在本地编译的话速度也很快:

git clone https://github.com/ogham/exa.git
cd exa
cargo build

首先会下载一些依赖:指定的Rust版本编译器、依赖库……

然后开始编译

完成编译

然后就得到了exa的可执行文件

exa可执行文件

接着使用exa看看效果

./target/debug/exa -alh ./

效果非常不错

实际上,我现在的lstree使用的就是exa

which ls
which tree

ls和tree都被我alias了


文章作者: Jack Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Wang !
  目录