rust 手动关闭子线程_Rust 教程 01. 准备开始

本系列文章,大约 100 多篇 ...

该系列文章是对官方在线教程的精华提炼:https://doc.rust-lang.org/book/

官方教程也有中文版的书,在京东,当当都有卖,但说实话,能看懂英文还是尽量看英文原版吧。

Rust 语言连续 5 年(2016、2017、2018、2019、2020)获得了 Stackoverflow 年度开发者调查中,“最受喜爱的编程语言”这一荣誉称号。

哪些大公司使用 Rust?

谷歌、微软、亚马逊、甲骨文、三星、Mozilla、Cloudflare、Dropbox 等等...

Rust 是什么?

Rust 作为一个编程语言,它可以在编译时就分析和防止无效数据访问。无需运行时开销,就可以保证程序的内存安全。而其他语言都是在运行时进行检查,所以运行较慢。

可以说 C 语言提供了强大的控制力和完全的访问级别,但是无法保证安全。

Python 提供了完整的内存安全,但是无法控制数据如何在内存中展现。

而 Rust 则提供了两者。

b49ed5cd3c4f981d4ae203c0e0d1fe34.png

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 命令,如果出现类似下列结果,就说明安装成功了:

474bde6953483c11067310bcc619ad96.png

如果想检验 Rust 是否安装成功,可以使用 rustc --version 这个命令:

2b2f1341a667a949e356f107d2ae0bd5.png

其结果的格式是这样的:rustc x.y.z (abcabcabc yyyy-mm-dd)

x.y.z 是版本号,abcabcabc是提交的 Hash,后边跟着的是该版本的提交日期。

更新 Rust

如果你是通过 rustup 安装的 Rust,那么使用rustup update这个命令就可以将 Rust 更新到最新版。

上面我安装的版本并不是最新版,最新稳定版的日期是 2020年6月17日,所以我使用 rustup update 更新一下,更新后的结果如下:

fedee71c5b1a317f892ff9198f6df00c.png

卸载 Rust

想要卸载 Rust 和 rustup,使用rustup self uninstall这个命令即可。

运行本地文档

安装 Rust 的时候,同时也会把文档安装到本地,使用 rustup doc这个命令就可以在本地打开文档。

4659a2ae5997e4140c6c88f4b527e9e0.png

Hello World

创建一个文件夹 hello_world,在里面创建一个 main.rs 文件:

bc523dcb6c4e20dcd2a701839f48128f.png

然后使用 rustc(Rust 的编译器)来编译本程序:

94b790ac24472e55cd0d9a0130fc7857.png

在 Windows 上,会生成一个 exe 和 pdb 文件:

3714e96373e62d8b8279769d6252ebbd.png

这里 exe 是可执行文件,而 pdb 文件里包含调试相关的信息。

运行 exe 文件,就会得到以下结果:

7f9f2cb14959b3ac6a3ca84412e7ea55.png

所以编译和运行是分开的两步。

程序的解剖

关键字 fn 会定义一个函数。

而 main 函数很特殊,每个 Rust 的可执行程序都会先走main 函数里面的代码。

这里面 println! 是 Rust 的宏(macro),如果是函数的话就应该把 ! 去掉: println。

格式化

如果你的代码样式不规范,那么可以使用 rustfmt 工具来进行格式化。例如:

f213f5ee6e2ec17ebed481500b241803.png

使用rustfmt main.rs

cd7c79283bb64789850435b17bbbb06e.png

然后代码就变成了:

818596ecb8b8e63643d8a1d0db1b1742.png

注意:Rust 的代码样式是使用 4 个空格作为缩进,而不是 tab。

如果你使用 VSCode 的话,可以安装下面这个插件:

dfeca747c6106bd0fa87afdd25abb2c6.png

它里面已经提供了包括智能提示、格式化代码在内的很多功能。

注意:Rust 是一种预编译(Ahead-Of-Time,AOT)的程序语言。也就是说你可以把程序编译好,然后把可执行文件分发给别人,他们可以直接运行该可执行文件,而不需要安装 Rust。

另外,rustc 只适用于一些简单的程序,而实际的项目开发中,通常使用的是cargo 这个工具

HelloCargo

Cargo 是 Rust 的构建系统和包管理工具。它可以做很多工作,例如:它可以构建你的代码,下载代码里依赖的库,并构建那些库。

想查看 cargo 是否安装成功,可以使用 cargo --version 这个命令。如果输出了版本号,说明安装成功,否则就是没有安装 cargo 或安装失败。

使用 Cargo 创建项目

使用 cargo new 项目名这个命令来创建 Rust 项目。

例如:

92f32650c52bc443ef3074d902a20b90.png

这个命令会创建一个 hello_world 文件夹,我们的项目名也是 hello_world。

c927951af2183c61c4e5c14d64688b8a.png

还可以看到,cargo 还生成了:

  • 一个 Cargo.toml文件

  • 一个 src 文件夹

    • 里面有一个 main.rs 文件

  • 并初始化了一个 git repository,还带有一个 .gitignore 文件

下图是 Cargo.toml 的内容:

60349b6a167b0204204e04f467c5413c.png

该文件是 TOML (Tom’s Obvious, Minimal Language) 格式的,Cargo 采用该格式的文件作为配置文件。其中:

  • [package]表示一个配置块的头,接下来几个语句都是用来配置这个 package 的。

  • 下面几行设置了 Cargo 为编译该项目所需要的配置:

    • 名称

    • 版本号

    • 谁开发的

    • Rust 的版本号

  • 最后一行 [dependencies],从这里开始将列出该项目所需要的依赖库。

    • 在 Rust 里,代码的 package(包)叫做 crate

使用 cargo 生成的项目的代码在 src 文件夹下,你的代码也应该放在src 文件夹下,里面的 main.rs 文件就是输出一个 hello world:

42b3c266ed30911bb62f13cc05ad655d.png

构建和运行 cargo 项目

构建项目使用 cargo build 命令:

6a2e0a290b4ee04f550f68fd761ba898.png

这个命令会创建一个可执行文件:target/debug/hello_world.exe。

想要执行该文件,略麻烦:

d0b0b7739c991b5f15190bd6efb200d5.png

第一次运行 cargo build 的时候,会让 Cargo 在项目顶层目录创建一个Cargo.lock文件。该文件会跟踪你项目依赖项的精确版本。该文件无需手动修改,Cargo 会为你做一切。

cargo run 这个命令会编译你的代码,然后执行生成的可执行文件,把两步操作合为一步:

33d4c891b2aa6e022d93a422018ba905.png

这里没有体现 Compiling(编译)那部分输出,因为 cargo 知道文件没有变化,所以它只是运行了可执行文件而已。

如果修改了代码,再执行 cargo run:

fd10cd9a80d42695e01bd302eac12237.png

可以看到 Compiling 的部分就有输出了。

cargo check,这个命令会检查你的代码,确保它可以编译成功,而不产生任何可执行文件:

5081c2e022d075f1a0f53a9d877455e7.png

为发布构建

可以使用cargo build --release 来构建发布的版本,该命令执行的时候会做很多优化。

该命令执行后会在 target/release 目录下生成可执行文件,这些优化也会让你的 Rust 程序跑的更快,但是编译的时间也会更长。

最后记住:Rust 项目基本都使用 cargo,只有特简单的项目才直接使用rustc。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值