❝拖延,是对自我的孤立与放逐 ❞
大家好,我是「柒八九」。
在前端技术,如雨后春笋般破土而出的今天。其技术偏向性,不仅仅是搞一个新的技术框架,更多的是往高性能和底层技术发展。比方说,利用Rust
特性所编写的SWC
前端构建工具,目前核心功能相当于 Babel
;还有就在2022年10月26日
,Vercel
公司正式宣布推出新的打包工具 Turbopack
,他们用基于 Rust
的 SWC
替换基于 JavaScript
的转译器 Babel
,速度提升了 17 倍。他们还替换了 Terser
,压缩的速度提高了 6 倍,从而减少了加载时间和带宽的使用;还有在一些原本只能在客户端运行的程序,现在也被移植到浏览器中运行,例如AutoCAD
/Photoshop
等,而这些都依赖近期比较热门的WebAssembly
技术。
从上面的「最新」的技术上来看,前端后续的发展都慢慢的往「编译优化」,重度应用可移植等方向发展。而如果继续探究上面发生的事,其实在这些新技术风向标所显示的信息,都和一个技术语言相关,那就是Rust
。Rust
站在了前人的肩膀上,借助于最近几十年的语言研究成果,创造出了「所有权」与「生命周期」等新的概念。相对于C/C++
等传统语言,它具有「天生的安全性」;同时相对于C#/Java/JS
等带有垃圾回收的语言来讲,它遵循了零开销抽象Zero-Cost Abstraction规则,并为开发者保留了最大的底层控制能力。
俗话说,「站在风口上,猪都会飞」。既然,上面所说的是「大势所趋」,那我们为什么不尝试一下。
而针对已经在工作的人来说,Rust
也是有一定的诱惑力。将Rust
用生产环境并用它来处理各式各样的任务。这些任务包括「命令行工具开发」、「Web服务器」、「DevOps工具开发」、「嵌入式设备开发」、「音频图像分析转码」、「数字货币交易」、「搜索引擎开发」、以及将其转换成WebAssembly
在浏览器上发光发热。
所以今天,我们又准备开辟一个新的知识体系 --「Rust学习笔记」。老话说的好,「不想当将军的士兵不是好士兵」。但是,在你想成为将军的时候,你需要拥有成为将军的知识储备和能力。这也是我们常说的「未雨绸缪」。
该系列文章的第一篇文章,我们来讲讲「Rust环境配置和入门介绍」的常规知识。
好了,天不早了,干点正事哇。
❝
macOS
环境中安装Rust
「推荐阅读指数」 ⭐️⭐️⭐️⭐️⭐️❞
通过一个叫rustup
的命令行工具来完成Rust
的下载和安装,这个工具被用来管理不同的Rust
发行版本及其附带工具链。
❝由于本人电脑是
macOS
环境,所以我们后续的所有示例介绍和操作都基于macOS
。 ❞
打开命令行终端,并输入命令:
curl https://sh.rustup.rs --sSf |sh
这条命令会下载并执行一个脚本来安装rustup
工具,进而安装最新的Rust
稳定版本。上述的安装过程会「自动将Rust
工具链添加到环境变量PATH
中」,并在下一次登录「终端」时生效。
如果你想要立即开始使用Rust
而不用重新启动终端,可以在终端中运行如下所示的命令来让配置立即生效:
source $HOME/.cargo/env
或者也可以向~/.bash_profile
文件中添加下面的语句,「手动」将Rust
添加到环境变量PATH
中
export PATH="$HOME/.cargo/bin:$PATH"
为了正常编译执行Rust
程序,还需要一个链接器Linker。由于「C语言编译器」通常会附带运行正常的链接器,并且一部分常用的Rust
包会依赖于C
语言编写的代码,所以为了能正常编译运行Rust
,C语言编译器
是必要部分。
rustup update
:来更新Rust
版本rustup self uninstall
: 卸载rustup
及Rust
工具链rustc --version
:检查Rust
是否被正确安装,rustc 1.64.0 (a55dd71d5 2022-09-19)
rustup doc
: 在浏览器中打开在安装工具再执行过程中在本地生成的「离线文档」我们还是继续用最原始的方式,来了解一个新语言。用对应的语法写一个Hello,Rust
。
打开终端并输入相应的命令,来创建文件夹及第一个Hello,Rust
项目。
mkdir ~/projects
cd ~/projects
mkdir hello_rust
cd hello_rust
创建一个名为main.rs
的「源文件」。在命令规则上,Rust
文件总是以.rs
扩展名结尾。
fn main(){
println!("Hello,Rust");
}
然后保存文件并回到「终端窗口」。在macOS
环境下,可以通过如下的命令「编译并运行」对应的文件。
rustc main.rs
./main
输出为:Hello,Rust
。
第一个值得注意的部分如下所示
fn main(){
}
这部分代码定义了Rust
的一个函数。
❝这里的
main
函数比较特殊:当你运行一个「可执行」Rust
程序时,所有的代码都会从这个「入口函数」开始运行。 ❞
这段代码的第一行声明了一个名为main
的、没有任何参数和返回值的函数。
那对花括号{}
被用来标记「函数体」,Rust
要求所有的函数都要被花括号包裹起来。
再来看main
函数体中的代码
println!("Hello,Rust");
这一行代码的作用是:将字符串输出到终端上。这里我们调用了一个被叫住println!
的「宏」。针对宏
的解释,我们后面会有详细的分析。这里只要记住,「Rust中所有以!结尾的调用都意味着你正在使用一个宏而不是普通函数」。
在运行一段Rust
程序之前,必须输入rustc
命令及附带的源文件名参数来「编译」它:
rustc main.rs
这过程和C/C++
的gcc
或clang
编译非常相似。「一旦编译成功,就会获得一个二进制的可执行文件」。
上面的步骤,其实和我们平时使用js
是不一样的。js
是「动态语言」,在编译之后就会立即运行。
❝「而
Rust
是一种预编译语言」,这意味着当你编译完Rust
程序之后,便可以将可执行文件交付他人,并运行在没有安装Rust
的环境中。 ❞
每次运行rustc
都比较繁琐,项目小还可以忍受吗,但是如果随着项目增大,这无疑是一种折磨。所以,在实际运用中,我们用Rust
构建工具:Cargo
❝
Cargo
是Rust
工具链中「内置」的构建系统及「包管理器」。 ❞
由于它可以处理众多诸如构建代码、下载编译依赖库等繁琐但重要的任务,所以绝大部分的Rust
用户都选择它来管理自己的Rust
项目。
如果是通过curl https://sh.rustup.rs --sSf |sh
来安装Rust
,那么Cargo
就已经被附带在了当前的Rust
工具链里。
我们可以通过如下命令来检查Cargo
是否被安装妥当
cargo --version
我们还是在projects
文件夹下运行。
cargo new hello_cargo
cd hello_cargo
第一条命令会创建名为hello_cargo
项目。Cargo
会以hello_cargo
的名字来创建项目目录并放置它生成的文件。
当我们进入hello_cargo
文件夹,会看到Cargo
刚刚生成的「两个文件与一个目录」
用tree
命令查看目录
Cargo.toml
的文件main.rs
的源代码文件,该源代码文件被放置在src
目录下Cargo
还好初始化一个新的git
仓库并生成默认的.gitignore
文件使用一个文本编辑器打开Cargo.toml
Cargo
使用TOML
(TOM's Obvious,Minimal Language
)作为标准的配置格式。
首行文本中的[package]
是一个「区域标签」,它表明接下来的语句会被用于当前的程序包。紧随标签后的3行语句提供了Cargo
编译这个程序时需要的配置信息,它们分别是
hello_cargo
0.1.0
Rust
版本号 - 2021
最后一行文本中[dependencies]
同样是一个区域标签,它表明随后的区域会被用来声明项目的依赖。在Rust
中,把代码的集合称为包Crate。
❝
crate
是Rust
中最小的「编译单元」,package
是单个或多个crate
。 ❞
Cargo
为我们生成了一个输出Hello,Rust
的程序。并且源文件main.rs
被放置到了src
目录下,在项目目录下多了一个叫Cargo.toml
的配置文件。
❝
Cargo
会默认把「所有的源代码文件」保存到src
目录下,而「项目根目录」只被用来存储诸如README文档
/许可声明/配置文件等与源代码「无关」的文件。 ❞
在hello_cargo
项目目录下,Cargo
可以通过下面的命令来完成「构建任务」。
cargo build
并通过./target/debug/hello_cargo
完成程序运行。
继续使用tree
来查看文档目录
「首次使用」命令cargo build
构建的时候,它会在「项目根目录」下创建一个名为Cargo.lock
的新文件,这个文件记录了「当前项目所有依赖库的具体版本号」。「不要手动编辑其中的内容,Cargo
可以帮助你自动维护它」。
当然,我们可以把上述build
和手动查找并执行debug
目录下的可执行文件的两个操作合并成一个操作。
cargo run
cargo run
命令依次完成「编译」和「执行」任务。
此外,Cargo
提供了一个叫做cargo check
的命令,用来「快速检查当前代码是否可以通过编译」,而不需要花费额外的时间去真正生成可执行程序。
当准备好发布自己的项目时,可以使用命令cargo build --release
在「优化模式」构建并生成可执行程序。它生成的可执行文件会被放置在target/release
目录下,而不是之前的target/debug
目录下。
这种模式会以更长的编译时间为代价来优化代码,从而使代码拥有更好的「运行时性能」。
「分享是一种态度」。
参考资料:《Rust权威指南》
「全文完,既然看到这里了,如果觉得不错,随手点个赞和“在看”吧。」