第一次接触Rust

2021-10-23 141点热度 0人点赞 0条评论

Rust是一门赋予每个人构建可靠且高效软件能力的语言。

众所周知Rust语言的学习曲线非常的陡峭,但是其带来的回报非常的丰厚,是完全成正比的!Rust 已经连续五年在 Stack Overflow 开发者调查报告中被评选为最受喜爱的编程语言:20162017201820192020

它有什么特点?

Rust程序执行起来很快。Rust没有运行时和垃圾回收,所以运行起来速度很快且内存利用率极高,能够胜任对性能特别高的服务场景。

垃圾回收(GC)主要负责两件事情:发现无用对象和释放无用对象占用的内存。由于对象的创建和释放是程序运行期间一直会发生的行为,所以GC需要持续进行扫描对象和释放内存工作。低性能的GC和不恰当的GC策略会导致应用程序占用更多的CPU时间,从而影响性能。

Rust的类型系统和所有权模型保证了内存安全和线程安全,让程序在编译期就能够及早暴露各种的错误。在许多系统级应用中,程序的崩溃常常会造成巨额的损失,因而提前暴露错误很有意义。

它适合干什么?

Rust目前适合于构建命令行程序、WebAssembly应用、服务器网络应用和嵌入式程序。

WebAssembly或者 wasm 是一个可移植、体积小、加载快并且兼容 Web 的全新格式。大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML、CSS 与 JavaScript,2019年,联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specification)成为官方 Web 标准,这意味着 WebAssembly 成为了第 4 种 Web 语言。

安装rust

进入Rust官网(网址为www.rust-lang.org),在语言下拉框,找到简体中文并点选,这样官网就变成中文了。

Rust官方网站

点击菜单栏的“安装”,找到“下载 RUSTUP-INIT.EXE”(根据自己的系统选择32位或者64位),下载并运行之,这个程序会安装rustc, cargo, rustup等应用(安装在%USERPROFILE%.cargo\bin目录下,即C:\Users\xxx.cargo\bin。Windows系统)!Rust的主要安装方式就是通过rustup这个工具完成的,rustup既是一个Rust安装器又是一个版本管理工具。

image

Rust的升级比较频繁(每6周会更新一个版本),可以在命令行中运行rustup update获取最新版本的Rust。
可以在命令行中通过输入rustup doc来打开本地安装的文档。

image

rustup安装过程中需要安装“Microsoft C++生成工具”。

安装完毕后,我们可以通过下面命令来检查下电脑上的rust编译器的版本:

rustc --version
rustc 1.54.0 (a178d0322 2021-07-26)

第一个Rust程序

好,接下来我们要进入传统项目了,我们要写第一个Rust程序了,那就是打印 Hello world! 字符串,这个从B语言传承下来的项目。
新建一个hello_world.rs文件,这儿推荐使用VSCode编辑器。
在源码中写入下面代码内容:

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

main函数是Rust程序的入口。

函数由fn关键字开头,后面跟着函数名,()是参数,因为在这儿main没有参数,因而()内是空的。函数体用{}大括号括起来。

println!是一个宏(在名字后面有一个感叹号表明这不是函数,而是宏),向控制台打印 Hello world! 字符串。

在Rust中宏则可以接受可变个数的参数,而函数在定义的时候就确定了参数的个数和类型。例如:

println!("Hello world!");
println!("Hello world! {}", 1);

第一行打印宏只要一个参数,第二行打印宏有2个参数。

使用rustc进行编译
执行rustc编译,然后运行得到。

PS E:\t\rust-lang> rustc hello_world.rs
PS E:\t\rust-lang> .\hello_world.exe
Hello world!

使用cargo进行编译

Cargo是Rust的编译系统和包管理工具,我们在安装Rust的时候一起安装了。有了cargo我们不再烦恼与如何解决复杂的依赖关系。
Cargo让我们脱离工程构建的烦恼,不用写Makefile了!

运行下面的语句创建并编译运行一个bin项目hello-rust。

PS E:\t\rust-lang> cargo new hello-rust
     Created binary (application) `hello-rust` package
PS E:\t\rust-lang>PS E:\t\rust-lang> cd .\hello-rust\
PS E:\t\rust-lang\hello-rust> ls
    目录: E:\t\rust-lang\hello-rust
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----             08-27     00:04                src
-a----             08-27     00:04              8 .gitignore
-a----             08-27     00:04            179 Cargo.toml
PS E:\t\rust-lang\hello-rust> cargo run
   Compiling hello-rust v0.1.0 (E:\t\rust-lang\hello-rust)
    Finished dev [unoptimized + debuginfo] target(s) in 2.04s
     Running `target\debug\hello-rust.exe`
Hello, world!
PS E:\t\rust-lang\hello-rust>

Cargo给我们生成的工程,在顶层目录是TOML配置文件,源码放在了src目录中!编译之后生成的文件是target\debug\hello_rust.exe。

常用的cargo命令:

cargo new project --bin 生成一个可执行文件的项目
cargo new project --lib 生成一个库项目
cargo check 可以快速检查代码是否可以正常编译
cargo build 可以构建项目
cargo build --release 可以构建并优化项目
cargo run 可以运行项目(如果代码有修改则先进行编译)
cargo test 可以测试项目
cargo doc 可以为项目构建文档
cargo publish 可以将库发布到 crates.io。

Cargo.toml 为 Rust 的清单文件。其中包含了项目的元数据和依赖库。

[package]
name = "hello-rust"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

package段写着工程的基本属性:名字和版本。

dependencies写着这个工程依赖的,hello-rust目前没有任何的依赖,所以它下面的空的。

TOML和INI、XML、JSON、YAML文件类似,都是一种通用的配置语言,它并不是cargo发明的。TOML 的全称是 Tom's Obvious, Minimal Language,它的作者是 GitHub 联合创始人 Tom Preston-Werner。TOML被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。

Cargo.lock文件由Cargo自动生成,用于保存我们依赖的crate确切的版本,假设我们今天将它封存起来,几年之后拿出来编译,不论在此期间工程所依赖的crate变化有多大,这个工程还能依靠Cargo.lock文件找到当初的依赖的一模一样的源码并顺利编译得到需要的文件。Cargo.lock文件的内容像这样:

[[package]]
name = "ferris-says"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9515ec2dd9606ec230f6b2d1f25fd9e808a2f2af600143f7efe7e5865505b7aa"
dependencies = [
 "smallvec",
 "textwrap",
 "unicode-width",
]

在Rust中,我们把一个包叫做crate(板条箱)。

image

现在我们来给上面的应用添加一个依赖。你可以在crates.io中找到所有类别的crate。

吉祥物,Rust有一个尚未转正的吉祥物,它的名字叫做Ferris,是只螃蟹!!!为什么是它?估计是因为crustaceans(甲壳纲动物,如螃蟹,龙虾等)这个词里面包含了rust。

image

https://rustacean.net/中有很多关于Ferris的图,有兴趣的可以去看看。

教头Lily

铁汉柔情