rust入门

借鉴大佬:rust语言初识-CSDN博客

rust作为一名新兴语言,与go又有些许不同,因为它的目标是对标系统级开发,也就是C、C++这两位在编程界的位置。比如我们最常用的windows系统,就是用C/C++语言开发的,也正因如此,我们才能用C++在VS中非常方便的调用win API函数。

涉及到底层,需要控制的细节就会越多,rust试图通过简便语法、便利包管理、安全可靠等良好特性脱颖而出。

目前rust语言最大的缺点是生态还不够完善。

比如当你想要用rust写GUI程序,就很麻烦,因为官方目前还没有推出GUI库,但这并非是无法解决的,rust同样意识到了这个问题,所以它提供了简便的方式让你可以直接在代码中调用C语言开发的库。

这意味着只要是用C语言开发的库,你就能用rust语言调用它进行开发。

比如你可以使用rust绑定C开发的FLTK、GTK等GUI库就可以进行开发GUI程序了,当然也有正在发展的库,比如egui、iced、tauri等等。个人目前最推荐的是Tauri,前提需要会web前端:初识Tauri。

而rust带来的代码安全、便捷的开发又是C语言所无法比拟的,随着Rust生态的不断完善,会取代很大一部分C/C++的份额,不过想要彻底将C/C++取代段时间来看还是有点不现实的,比如windows、linux、mac三大操作系统以及各种C/C++开源库的代码量巨大。

先学C/C++语言,再来学rust:初识C++。

Rust简介

Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目。第一个有版本号的 Rust 编译器于2012 年 1 月发布。Rust 1.0 是第一个稳定版本,于 2015年5月15日发布。

为什么要学Rust

Rust是一种令人兴奋的新编程语言,它可以让每个人编写可靠且高效的软件。

它可以用来替换C/C++,Rust和它们具有相同的性能,但是很多常见的bug在编译是就可以被消灭。

Rust是一种通用的编程语言,但是它更善于以下场景

--需要运行时的素的

--需要内存安全

--更好的利用多处理器

与其他语言比较

C/C++性能非常好,但类型系统和内存都不太安全。

Java/C#,拥有GC,能保证内存安全,也有很多优秀特性,但是性能不行。

Rust:

内存安全:

Rust 中的所有内存访问都经过了编译器的严格检查,并且在运行时不会出现空指针异常或数据竞争等问题。这意味着 Rust代码具有更高的可靠性和安全性,可以避免常见的安全漏洞。而C语言则时常需要担心指针、内存问题,尤其是在大型项目中,非常容易因此出现各种各样的Bug。

高效性能:

Rust具有与 C 和 C++ 相当的性能,并采用了现代语言的特性和设计理念,如智能指针、闭包和模式匹配等。这使得 Rust很适合编写高性能、低延迟的系统级应用程序和库。

并发性:

Rust的所有权系统和借用规则使其易于编写线程安全的代码,即使在多线程环境下也可以保持高效率和可靠性。C/C++中则完全需要自己进行控制。

社区支持:

Rust拥有活跃的社区,在crates上提供了许多开源库、工具和框架,可以大幅度提升开发效率。

C/C++虽然学习的人很多,但却几乎没有官方的、活跃的社区可以供大家交流,都是在各搞各的。

统一包管理

C/C++中,最让人诟病的便是包管理了,想要用一个包,还需要自己下载、安装、配置等等。

而Rust则直接提供了一个统一的包管理程序,只需要写一行代码,就能自动为你下载配置好你所需要的一切,并且还提供对应的文档,使用起来非常方便!

综上,能看出Rust的优势。

Python有一个统一的包管理程序pip,可以很方便的下载各种第三方包,而不需要像C++那样自己配置。而一旦学会了Rust,即使是作为较为底层的开发人员,我们同样也能享受到这种便利了。

这是学习C/C++所无法想象的,虽然目前有一个vcpkg包管理库很不错,但这毕竟不是标准委员会推出的,而是微软带头组织的一个开源项目,如果不会科学上网,中国几乎也无法使用。

也无法使用。

Rust特别擅长的领域

高性能Web Service

WevAssembly

命令行工具

网络编程

嵌入式设备

系统编程

Rust的用户和案例

Google:新操作系统Fuschia,其中Rust代码量大约占30%

Amazon:基于Linux开发的可以直接在裸机、虚拟机运行容器的操作系统

System76:纯Rust开发了下一代安全操作系统Redox

蚂蚁金服:库操作系统Occlum

斯坦福和密歇根大学:嵌入式实时操作系统,应用于Google的加密产品

微软:正在使用Rust重写Windows系统中的一些低级组件

微软:WinPT/Rust项目

Dropbox、Yelp、Coursera、LINE、Cloudflare、Atlassian、npm、Ceph、百度、华为、Senty、Deno...

安装Rust编译器

与C/C++一样,Rust也是一门编译型语言,也就是说,Rust的代码必须要先编译成为二进制程序之后才能运行。比如window系统中我们最常看到的.exe二进制可执行程序,而python则是解释性语言,无需编译,只要有python的解释器,就能一行一行的解释代码然后执行,这同样也是影响python速度的一大原因。

一般在浏览器中直接搜索Rust,出现的第一个就是Rust的官网了,不过我这里也还是放一下它的官网地址,可以直接点击查看:Rust

然后点击"马上开始":

之后就是下载Rust的安装器,由于目前一般都是64位的电脑,所以选择第二个即可:

下载后,点击运行这个程序,等待其安装完毕。

由于我原本就安装了VS2022,所以它并没有提示我安装任何东西,如果你没有安装VS,则可能要你安装上方提示的Microsoft C++生成工具,确认安装即可。

安装完成后,进入控制台运行命令:cargo --version

能打印出版本则说明安装成功了,不会进入控制台的可以参考文章:推荐文章-3.程序员常识-酷程网 (kucoding.com)

第一次使用你可能就会觉得有些疑惑,明明安装的是Rust,这里怎么是Cargo命令呢?

这一点可以看官网说明:

简单来说就是Cargo是Rust语言的包管理软件,后面我们开发Rust时,使用的也基本都是这个命令。

更新与卸载Rust

更新Rust

--rustup updata

卸载Rust

--rustup self uninstall

安装验证

rustc --version

--结果格式:rust x.y.z(abcabcabc uuuu-mm-dd)

--会显示最新稳定版的:版本号、commit hash、commit日期

本地文档

安装Rust的时候,还会在本地安装文档,可离线浏览

运行rustup doc可在浏览器打开本地文档

编写Rust文件

程序文件后缀名:rs

文件命名规范:hello_world.rs

编译和运行是单独的两步

运行Rust程序之前必须先编译,命令位rustc源文件名

--rustc main.rs

编译成功后,会生成一个二进制文件

--在Windows上还会生成一个.pdb文件,里面包含调试信息

Rust是ahead-of-time编译的语言

--可以先编译程序,然后把可执行文件交给别人运行(无需安装Rust)

rustc只适合简单的Rust程序

第一个Rust程序

我们可以通过命令cargo new projectName来创建一个Rust项目。

比如运行cargo new hello-world:

然后它就会为我们在当前目录中生成一个项目文件夹:

这里简单对其介绍一下:

.git:这是一个隐藏文件夹,用于git软件实现版本管理,学习rust期间一般用不着,不用管。

src:这是存放代码的地方,以后我们写的rust代码就放在这个文件夹里面。

.gitignore:这同样是git使用的,用于忽略哪些类型文件,不进行版本管理,一般同样不用管

Cargo.toml :这个文件就很重要了,cargo作为rust的包管理程序,就是通过这个文件知道你这个项目中需要哪些依赖库的

注意:git并不是rust的一部分,而是一个所有语言通用的版本控制工具,比如知名的github,便是用的git进行版本管理,不会的可以参考通用知识-19.git详解-酷程网 (kucoding.com)

用记事本打开Cargo.toml,就能看到下面这样的内容:

对于你想要用到的库,直接写在[dependencies]项的下面即可,后面我会再对其进行详细介绍。

然后来到src这个存放rust代码的目录里面:

这里面默认有一个main.rs文件,其中后缀.rs便是rust的简写,这个文件是rust项目中不可或缺的,因为它将作为整个项目的入口文件。

注意:不可更改这个文件的名称!否则后面的编译将会直接失败!

同样的,我们仍然可以用记事本打开它:

这里写的是一个函数:

fn:rust中的关键字,即为function的简写,代表后面跟着的是一个函数。

main: 这个函数的名称,这里不可更改!因为这是程序的入口函数,程序将从这个函数开始顺序执行内部的代码。

():与前面的函数名、fn关键字、后面紧跟的{}组成一个完整的函数签名,最简单的函数就是:fn name(){}

{}:函数体,即这个函数要执行的代码,比如这里填写的是println!("Hello, world!");,就是说要打印出 "hello world"这个字符串。

println!是一个rust中的宏,用于简化我们输出一个字符串到控制台的步骤。

如果你学过C/C++、python、java等等其它语言,前期学习过程中可以直接把它当作一个print函数即可,只是要注意它的后面先有一个!、然后才是()。

这里同样注意,每一个语句的结尾用的;,不用则会报错。

现在回到控制台,进入这个文件夹,然后来运行这段代码试一试,运行代码的命令为cargo run:

然后就可以看到它成功运行并打印出了Hello World!字符串。

前面我们说了,rust是一个编译型的语言,所以会编译成二进制后次才能运行,我们可以在下面的目录中找到这个生成的exe程序:

不过直接点击它运行是不行的,因为前面的代码中我们只写了一个打印字符串的代码,打印完程序就结束了,所以你只能看到一个黑影闪过,后面我们会想办法解决这个问题。

上面提到的这个cargo run命令即为编译并运行当前项目的意思

可如果我只想编译,不运行

使用命令cargo build,其默认构建的是Debug版本,即可调试版本

直观的来说就是生成的exe程序会稍微比较大。

也可以构建Release版本,使用命令:cargo build --release

这个命令生成的可执行文件会较小:

如果你还是觉得它比较大,那么我们还可以使用一些工具来进一步压缩它,可以让它只有几十kb

开发工具: IDE环境

从上面我们可以看到,即使是只用记事本,也是可以开发的,但那实在是太麻烦了,所以我们需要一个IDE环境,就像VS那样,有代码提示,可以极大提高我们的开发效率。

个人推荐VSCode这款编辑器,它也是目前最受欢迎的一个编辑器。

在插件搜rust,下载下面这个

这样就完成了rust的开发环境的配置,现在当你输出前几个字符时,就会自动弹出代码提示:

这时,你只需要按Enter键就可以自动帮你填充代码。

并且运行代码的方式也变简单了,只需要点击main函数上面的按钮,就可以直接运行:

同时你也可以直接点击Debug进入调试状态:

不会调试的可以参考文章:

初识包管理

配置好IDE后,我们再来试一下rust官网提供的一个示例,来看看rust的包管理有多好用。

比如我们想要在终端打印出下面这个图案:

这里就用到了ferris-says这个库,首先来到前面提到的Cargo.toml文件,然后在[dependencies]项添加一下这个库:

后面的数字是这个库的版本号,Ctrl+S保存后,vscode就会自动给我们拉取这个库包到本地。

你可能也注意到了不知道什么时候,项目文件夹中多了一个Cargo.lock文件。

这个文件用于记录我们当前项目用到的所有库以及依赖,是由cargo自动管理的,我们无需操心。

现在来到代码中,让我们来使用一下这个库

rust 复制代码
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};
 
fn main() {
    let stdout = stdout();
    let message = String::from("Hello https://www.kucoding.com");
    let width = message.chars().count();
 
    let mut writer = BufWriter::new(stdout.lock());
    say(message.as_bytes(), width, &mut writer).unwrap();
}

这一小段代码就涉及到了rust中相当多的概念,先不看这段代码的逻辑,你可以自己随意更改这段代码里面的字符串:"Hello https://www.kucoding.com"

然后运行上面这段代码,就能在终端看到输出的图案了。

而这个库的下载安装位置默认为当前用户文件夹的.Cargo文件夹中

至于库代码上层的这个文件夹,则是代表着仓库名,你的可能是github之类的,这个不一定相同。

以下几个命令需要记忆:

cargo new:新建一个rust项目

cargo run :直接运行代码

cargo build :只编译代码,不运行,默认编译的为debug版本

cargo build --release:编译为release版本

相关推荐
哈里谢顿5 分钟前
Rust 语言入门博客
rust
JaguarJack1 小时前
PHP 的异步编程 该怎么选择
后端·php·服务端
风象南1 小时前
AI 写代码效果差?大多数人第一步就错了
人工智能·后端
BingoGo1 小时前
PHP 的异步编程 该怎么选择
后端·php
焗猪扒饭11 小时前
redis stream用作消息队列极速入门
redis·后端·go
树獭非懒11 小时前
AI大模型小白手册|Embedding 与向量数据库
后端·python·llm
IT_陈寒14 小时前
SpringBoot实战:5个让你的API性能翻倍的隐藏技巧
前端·人工智能·后端
梦想很大很大14 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
唐叔在学习15 小时前
就算没有服务器,我照样能够同步数据
后端·python·程序员