本系列文章,大约 100 多篇 ...
该系列文章是对官方在线教程的精华提炼:https://doc.rust-lang.org/book/
官方教程也有中文版的书,在京东,当当都有卖,但说实话,能看懂英文还是尽量看英文原版吧。
Rust 语言连续 5 年(2016、2017、2018、2019、2020)获得了 Stackoverflow 年度开发者调查中,“最受喜爱的编程语言”这一荣誉称号。
哪些大公司使用 Rust?
谷歌、微软、亚马逊、甲骨文、三星、Mozilla、Cloudflare、Dropbox 等等...
Rust 是什么?
Rust 作为一个编程语言,它可以在编译时就分析和防止无效数据访问。无需运行时开销,就可以保证程序的内存安全。而其他语言都是在运行时进行检查,所以运行较慢。
可以说 C 语言提供了强大的控制力和完全的访问级别,但是无法保证安全。
Python 提供了完整的内存安全,但是无法控制数据如何在内存中展现。
而 Rust 则提供了两者。
Rust 的口号变迁
2018年年底前,Rust 的口号是:
“Rust是一种运行速度极快,防止出现segaults 并保证线程安全的系统编程语言。”
而在此之后,Rust 的口号变成了:
“使每个人都可以构建可靠,高效的软件。”
安全性
Rust 程序免受以下影响:
悬空指针,已经失效但仍然存活的引用
数据竞争,由于外部因素变化,无法判断程序每次运行的行为
缓存溢出,例如访问长度为 6 的数组的第 250 个元素
迭代器失效,被迭代的内容中途被修改
而且在 Debug 模式下,Rust 也会防止整数溢出。
生产力
Rust 还是相对比较具有生产力的语言,这个很难用语言去描述。
而且 Rust 还提供了很多友好的特性,例如:泛型、各种成熟的数据类型、模式匹配、闭包等等。
Rust 还提供了强大的构建和包管理工具 cargo。
控制力
这个也不太好描述,以后再说。
但是 Rust 有三个原则:
数据默认是不可变的
安全是首要任务
安全性几乎都是在编译时提供的,并不会增加运行时的成本
Rust 最大特点
性能:Rust 把它的高级特性都交给了编译器,编译器会做大量的优化。而且 Rust 不需要 GC 来保证运行安全。
并发(ConCurrency):使用 Rust,可以说“无畏并行”。它的安全性已经跨越了独立的线程,也没有全局解释器锁(GIL)来限制线程的速度。
内存效率:Rust 让你创建出来的程序只需要最少的内存,可以用最小的开销创建对象等,并对其进行优化。
Rust 缺点
编译时间:Rust 的编译速度通常要比其它对等语言慢。它的编译器工具链非常复杂,包含多个中间表示层,并向 LLVM 发送大量的代码。
在 Rust 里,所谓的“单元编译”并不是只单个文件,而是一个完整的包(Rust 里叫做 crate)。而 crate 又包含很多模块,所以就可能是很大的编译单元。这就需要对整个 crate 进行整体优化,所以也需要整体的编译。
严格:在一切的一切正确之前,程序是无法编译通过的。程序员很难偷懒。
语言的大小:Rust 语言非常的大,也很全面。程序员同行要面对多种选择。
那么,Rust 最适用于哪个领域?
数据处理:Rust 非常善于文本和数据处理。在 2017 年中的时候,它的正则表达式引擎号称世界最快。Rust 可以让你使用很少且稳定的内存占用来创建高吞吐量的数据管道。
程序扩展:Rust非常适合扩展用动态语言编写的程序。可以为 Ruby、Python、Elixir 等语言编写的程序进行扩展。
适合于资源受限的环境中:物联网时代,数十亿的不安全设备将暴露于互联网中。Rust 可以为其通过增加一个安全层、而不增加运行成本。
应用程序:Rust 可以用来构建面向用户的应用程序。例如 Servo,这个浏览器引擎。
桌面应用:这个可能还需要一段时间才能成熟,但是 Rust 这种科学的部署方法,以及其严谨性,将会提供很大的帮助。
移动应用:如果说 Andorid 的 Java 和 iOS 的 Swift 是这些平台官方首选语言的话,那么这些平台也提供了,编写真正的原生应用这种能力,C++ 就被支持。同样的 Rust 也可以在不增加运行时成本的情况下使用同样的接口达到该目的。
Web 应用:WebAssembly,大家都应该知道,它将会成为一个很多语言的编译器,而 Rust 就是第一批被支持的语言。把 Rust 项目移植到浏览器里只需要两行命令就可以办到。
系统编程:从某种意义上说,系统编程是 Rust 存在的理由。许多大型程序已经在 Rust 中实现,包括编译器(Rust 本身)、视频游戏引擎和操作系统等等。
最后说一下 Rust 社区常提到的几个术语:
使能所有人,所有的程序员,无论背景,都可以学 Rust。
Rust 非常快,它编写的程序至少不慢于其它对等语言,而且拥有更多的安全保障
无惧并发,Rust 让你免受于很多其它语言中常见的并发编程错误。
没有 Rust 2.0,Rust 永远向下兼容。
零成本抽象,它的意思主要是说,Rust 所带来的特性不会带来运行时成本,并且安全性也不牺牲性能。
安装 Rust
去官网 https://www.rust-lang.org/learn/get-started按提示进行安装,这部分就不介绍了。
但是大多数人都是使用rustup 这个工具来安装 Rust 的,rustup 既是安装工具,同时也是版本管理工具。
使用 rustup 安装完之后,在命令行输入 rustup 命令,如果出现类似下列结果,就说明安装成功了:
如果想检验 Rust 是否安装成功,可以使用 rustc --version 这个命令:
其结果的格式是这样的:rustc x.y.z (abcabcabc yyyy-mm-dd)
x.y.z 是版本号,abcabcabc是提交的 Hash,后边跟着的是该版本的提交日期。
更新 Rust
如果你是通过 rustup 安装的 Rust,那么使用rustup update这个命令就可以将 Rust 更新到最新版。
上面我安装的版本并不是最新版,最新稳定版的日期是 2020年6月17日,所以我使用 rustup update 更新一下,更新后的结果如下:
卸载 Rust
想要卸载 Rust 和 rustup,使用rustup self uninstall这个命令即可。
运行本地文档
安装 Rust 的时候,同时也会把文档安装到本地,使用 rustup doc这个命令就可以在本地打开文档。
Hello World
创建一个文件夹 hello_world,在里面创建一个 main.rs 文件:
然后使用 rustc(Rust 的编译器)来编译本程序:
在 Windows 上,会生成一个 exe 和 pdb 文件:
这里 exe 是可执行文件,而 pdb 文件里包含调试相关的信息。
运行 exe 文件,就会得到以下结果:
所以编译和运行是分开的两步。
程序的解剖
关键字 fn 会定义一个函数。
而 main 函数很特殊,每个 Rust 的可执行程序都会先走main 函数里面的代码。
这里面 println! 是 Rust 的宏(macro),如果是函数的话就应该把 ! 去掉: println。
格式化
如果你的代码样式不规范,那么可以使用 rustfmt 工具来进行格式化。例如:
使用rustfmt main.rs:
然后代码就变成了:
注意:Rust 的代码样式是使用 4 个空格作为缩进,而不是 tab。
如果你使用 VSCode 的话,可以安装下面这个插件:
它里面已经提供了包括智能提示、格式化代码在内的很多功能。
注意:Rust 是一种预编译(Ahead-Of-Time,AOT)的程序语言。也就是说你可以把程序编译好,然后把可执行文件分发给别人,他们可以直接运行该可执行文件,而不需要安装 Rust。
另外,rustc 只适用于一些简单的程序,而实际的项目开发中,通常使用的是cargo 这个工具。
Hello,Cargo!
Cargo 是 Rust 的构建系统和包管理工具。它可以做很多工作,例如:它可以构建你的代码,下载代码里依赖的库,并构建那些库。
想查看 cargo 是否安装成功,可以使用 cargo --version 这个命令。如果输出了版本号,说明安装成功,否则就是没有安装 cargo 或安装失败。
使用 Cargo 创建项目
使用 cargo new 项目名这个命令来创建 Rust 项目。
例如:
这个命令会创建一个 hello_world 文件夹,我们的项目名也是 hello_world。
还可以看到,cargo 还生成了:
一个 Cargo.toml文件
一个 src 文件夹
里面有一个 main.rs 文件
并初始化了一个 git repository,还带有一个 .gitignore 文件
下图是 Cargo.toml 的内容:
该文件是 TOML (Tom’s Obvious, Minimal Language) 格式的,Cargo 采用该格式的文件作为配置文件。其中:
[package]表示一个配置块的头,接下来几个语句都是用来配置这个 package 的。
下面几行设置了 Cargo 为编译该项目所需要的配置:
名称
版本号
谁开发的
Rust 的版本号
最后一行 [dependencies],从这里开始将列出该项目所需要的依赖库。
在 Rust 里,代码的 package(包)叫做 crate。
使用 cargo 生成的项目的代码在 src 文件夹下,你的代码也应该放在src 文件夹下,里面的 main.rs 文件就是输出一个 hello world:
构建和运行 cargo 项目
构建项目使用 cargo build 命令:
这个命令会创建一个可执行文件:target/debug/hello_world.exe。
想要执行该文件,略麻烦:
第一次运行 cargo build 的时候,会让 Cargo 在项目顶层目录创建一个Cargo.lock文件。该文件会跟踪你项目依赖项的精确版本。该文件无需手动修改,Cargo 会为你做一切。
cargo run 这个命令会编译你的代码,然后执行生成的可执行文件,把两步操作合为一步:
这里没有体现 Compiling(编译)那部分输出,因为 cargo 知道文件没有变化,所以它只是运行了可执行文件而已。
如果修改了代码,再执行 cargo run:
可以看到 Compiling 的部分就有输出了。
cargo check,这个命令会检查你的代码,确保它可以编译成功,而不产生任何可执行文件:
为发布构建
可以使用cargo build --release 来构建发布的版本,该命令执行的时候会做很多优化。
该命令执行后会在 target/release 目录下生成可执行文件,这些优化也会让你的 Rust 程序跑的更快,但是编译的时间也会更长。
最后记住:Rust 项目基本都使用 cargo,只有特简单的项目才直接使用rustc。