没办法,还就那个得学一下
Rust
。本文参考官方教程:https://kaisery.github.io/trpl-zh-cn/ch01-00-getting-started.html
Rust语言从入门到入土 1:Rust的开始
我对学习的态度是,学习什么之前,得有足够的动力去学习他。所以得先明白他是什么,他有什么用。
1. 什么是Rust
简单的介绍,类似于C
和C++
,Rust
是一种系统级编程语言,由Mozilla
开发。它的设计目标是提供一种安全、并发、高效的编程语言,可以用于编写操作系统、网络服务器、嵌入式系统等高性能应用程序。
Rust
的语法类似于C++
,但它采用了一些新的语言特性,例如所有权系统、借用和生命周期等,这些特性可以帮助程序员避免常见的内存安全问题,例如空指针引用和数据竞争等。Rust
还提供了一些高级的并发编程特性,例如通道和闭包等,可以使编写并发程序更加容易和安全。
Rust
的编译器非常快,并且可以生成高效的本地代码,所以Rust
非常适合用于编写高性能的系统级应用程序。
此外,Rust
还具有良好的跨平台性,可以在各种操作系统和硬件平台上运行。
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
这个网站下载安装脚本,所以需要一些魔法。不过我把脚本内容贴在后面了,自己创建一个脚本运行效果也是一样的
然后开始安装:
然后会输出一些关键信息,根据需要选择就好
稍等片刻,大概喝杯咖啡的功夫就好了。PS:我的魔法不够强大!!!
最后按照提示添加一下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
3. Rust开发环境配置
当然是宇宙第一编辑器啦!
在VSCode
的扩展,搜索Rust
。找到点击install
。
或者你更熟悉命令面板(觉得命令面板更酷)的话,按下Command + P
,然后输入:ext install rust-lang.rust
然后创建一个Rust
,看看有没有补全
(cargo new hello_world && code hello_world/main.rs) || echo fail
好耶,补全出现,可以开始快乐的写代码了!ヾ(@^▽^@)ノ
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
权限)
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_new
的Rust
项目
Cargo new
会创建一个新的目录,如果已经有一个目录,我们想要将这个目录转换为一个Cargo
管理的Rust
项目的话,那么就是用Cargo init
cargo init hello_cargo_init
2) 项目结构
使用tree
查看一下项目的目录结构
tree hello_cargo_new
其中:
Cargo.toml
是项目的配置文件,使用TOML
格式。其中描述了项目名称、使用的Rust
版本、依赖的第三方Rust
库等等信息。目前因为我们的项目是刚刚初始化的,自然没有任何依赖src
目录存放项目的源码
TOML
(Tom'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
文件中,使用title
和description
定义了文档的标题和描述,使用[author]
和[database]
定义了两个域。在[author]
域 中,使用name
和[database]
域 中,使用server
、port
、username
和password
定义了数据库的连接信息。
TOML
文件格式的简洁性和易读性,使得它在各种应用程序和工具中得到了广泛的应用,Rust
语言中的Cargo
包管理工具就使用TOML
文件来管理项目的依赖关系和构建配置。
此外,Cargo
实际上在创建项目的同时,也会初始化Git
仓库
cd hello_cargo_new && git status && ls -a
3) 编写源代码
同样,我们还向src/mian.rs
中写入输出hello world!
的代码
fn main() {
println!("Hello, world!");
}
注意:
Cargo
管理的Rust
项目预期所以源文件存放在src
目录中。项目根目录只存放README
、License
授权文件、Cargo配置文件
和其他跟代码无关的文件。我们在编写项目的时候需要注意遵守这一默认的规定以保持项目的整洁
4) 构建项目
类似于CMake
和Make
这类C
/C++
项目的编译系统,他们在构建项目的时候可以编译所有源文件、更新目标文件(生成被修改过的源文件的目标文件而不用全部重新编译),Rust
也提供了编译系统。
这个编译系统继承进了Cargo
中,使用下面的命令编译项目
cargo build
注意,
cargo build
命令需要在项目根目录下运行
运行cargo build
命令后,Cargo
会将编译生成的中间文件、得到的可执行文件debug
的目录中。可执行文件的名字就是项目名,我这里就是hello_cargo_new
。
tree -d -L 3 ./
5) 运行项目
我们可以直接运行得到的可执行文件
./target/debug/hello_cargo_new
不过Cargo
提供了cargo run
命令,他可以在完成编译后自动运行
cargo run
6) 发布项目
cargo build
命令编译得到的可执行文件是带有符号表等帮助Debug
信息的,使用--release
选项来编译不带调试信息的发行版。
cargo build --release
此时生成的中间文件、可执行文件都在target/release
目录下
tree -d -L 3 ./
因为不带调试信息,release
版本的可执行文件小了很多
ls -alh target/{debug/hello_cargo_new,release/hello_cargo_new}
7) 检查项目
cargo build
会调用Rust
编译器,按照编译原理的步骤,一步步进行下去,词法分析、语法分析、语义分析,直到最后生成包含目标平台二进制指令的可执行程序。
但是在写代码的时候我们可能只想检查一下语法对不对,既能否通过前面的词法分析、语法分析,而不关心最后是否生成可执行程序,所以没必要去生成可执行程序。使用cargo build
确实可以完成检查,不过因为cargo build
需要生成可执行程序,所以速度会慢很多。
为此,Cargo
提供了cargo check
命令来快速检查代码的语法,该命令不会生成可执行程序。
cargo clean && time cargo build
cargo clean && time cargo check
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
然后就得到了exa
的可执行文件
接着使用exa
看看效果
./target/debug/exa -alh ./
实际上,我现在的ls
和tree
使用的就是exa
which ls
which tree