当前位置: 首页 > news >正文

Rust语言入门教程(一) - 简介及Cargo使用

Rust编程入门

为什么学习Rust

我本人是一个DevOps工程师,并不是专职的开发人员,但需要了解各种各样的语言的基本知识和特性,以便在不同的项目中帮助开发人员设计软件架构,部署流程以及进行错误排查和调试。但是对任何新生的优秀事物保持足够的好奇心,往往会给我们更多的机会,并产生新的思想火花,让我们先走马观花的看一看Rust是什么样子,说不定你就会对它产生浓厚的兴趣。

如果你决定了要学习这门语言,那么至少应该运用你所学的知识进行一些小的练习,甚至用它来写一个自己的项目。由于Rust的学习曲线还是比较陡峭,因此在实践中总结并进步是十分重要的在学习了Rust的基础后,为了巩固知识并提高熟练度,我也用Rust写了一个轻量但功能完善的Webhook工具: Rusthook,供大家一起参考学习。请添加图片描述如上图所示,也许你的代码通过编译都需要花费很大的力气,而这就要求你对Rust的基础知识掌握牢固,否则这样陡峭的学习曲线很容易让初学者从入门到放弃。

Rust的简介及历史

Rust是一门系统编程语言,它提供了一些优秀的特性:

  • 内存安全: 在编译阶段就保证了内存的安全;
  • 无畏并发: 由于更优秀的安全性,所以在进行并发编程时更加无所畏惧,因为所有的不安全因素都会在编译时被发现;
  • 快速:由于零成本的抽象和其他优秀特性,Rust具有惊人的运行速度和性能;

相比之下, 一些高级语言如Ruby和Python虽然可以保证内存安全, 但是却很难做到高并发和高性能。 一些系统编程语言如C语言和C++, 虽然可以获得高性能,以及一定程度上的高并发,但是却总是被内存安全问题所困扰。

Rust起源于2006年,最初是Mozilla公司的一名雇员Graydon Hoare的个人项目。 Mozilla公司从2009年开始赞助Rust的开发, 并于2015年首次发布了Rust的1.0版本。因此, Rust至今(2023)已经有8年的历史了,并且还有9年的孵化期。相比之下, C++已经有38年的历史, 而C语言已经有48年的历史了。

Mozilla赞助Rust的原因正是因为受够了C++的内存安全问题,而想要寻找一种更好的语言来开发Firefox浏览器。 2017年发布的Firefox quantum就是用Rust重写的, 它的运行速度是以前版本的两倍多,而且使用中出现的bug大大的减少了。目前在Firefox的代码中约有150多万行的代码是Rust编写的。

Cargo

Cargo是一个非常好用的Rust工具,在我们学习并使用Rust的过程中,Cargo会贯穿始终。

  • Cargo = Package Manager。一门系统编程语言, Rust居然会有专门的包管理器,这不得不让人惊喜。Cargo可以用于查找,安装并管理我们需要使用的Rust包;
  • Cargo = Build System。没有什么Makefile, Cargo就是Rust的Build System;
  • Cargo = Test Runner. 直接使用Cargo运行测试;
  • Cargo = Doc Generator. 用Cargo生成文档;

Cargo集成了其他各种工具的优点和功能,如npm, pip, bundler, make.

创建第一个Rust项目

假设你已经安装好了Rust, 现在你就可以用Cargo命令来创建一个Rust项目。

cargo new hello

将会看到下面的输出和目录结构:
在这里插入图片描述
可以看到, Cargo为我们创建了一个名为hello的目录, 里面包含:

  • 一个toml格式(Tom’s obvious minimal language)的项目配置文件;
  • 源代码目录src, 里面包含main.rs文件,是程序运行的入口, 可见Rust的源代码文件后缀是.rs

现在我们来看一下Cargo.toml这个项目配置文件:

[Package]
name = "hello"      
version = "0.1.0"
authors = ["Nathan Stocks <nathan.stocks@gmail.com>"]
edition = "2018"[dependencies]

其中:

  • name: 项目的名称, 与目录名称和Git Repo的名称都无关;
  • version: 项目的当前版本号, 格式是Semantic Versioning
  • authors: 项目作者, 是一组名字加email地址, Cargo会自动从一些可能的位置查找这个值并自动填入, 比如在你的Git Config文件中就很可能有这个信息;
  • editipn: 应该是最新的版本(2018), 如果Cargo没有自动生成这一行的话,说明你的rust版本较低,你应该运行rustup update升级你的Rust版本;
  • dependencies: 项目所需的依赖包,后面的章节中再细说;

再来看一下main.rs的内容:

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

Cargo已经为我们编写了一个Hello world示例代码,我们可以直接运行。
在这里插入图片描述
可以看到, Cargo会先编译代码,并运行出执行结果,在终端打印出Hello, world! 如果我们再运行一次代码,将会出现下面的输出:请添加图片描述
由于我们的代码并没有变化,所以第二次运行的输出中可以看到Cargo并没有对代码进行重新编译。

当我们运行上述命令时,实际上Cargo已经构建了一个可执行文件并运行,它的位置是:

target/debug/hello

这个目录下会存放Cargo构建的所有产物,因此在.gitignore文件中应该加入这个目录,以防这些构建产物提交到git仓库中。我们可以直接运行这个可执行文件, 得到与cargo run同样的结果:
请添加图片描述
我们注意到, hello这个可执行文件在debug目录下, 这是因为默认情况下, Cargo会以debug模式编译我们的代码,如果想不以debug模式编译,则需要加上--release参数, 请添加图片描述
这样的话,大多数代码执行的速度会更快,但编译的时间可能会更长,构建产物会保存在target/release/目录下。

小结

本章介绍了Rust语言的历史和主要特性,以及如何用Cargo进行一个Demo项目的创建和运行。下节会介绍Rust语言的一些基础概念及使用,如变量,作用域等。

相关文章:

  • MySQL MHA高可用架构搭建
  • SELinux零知识学习三十二、SELinux策略语言之角色和用户(3)
  • 【C++干货铺】非类型模板 | 模板特化 | 模板分离编译
  • 【C4D如何将多个选集设置为一个选集】
  • 前端(HTML + CSS + JS)
  • 成品日志函数
  • Scrapy爬虫异步框架(一篇文章齐全)
  • 插入排序(形象类比)
  • ubuntu修改系统语言
  • Windows系统管理之备份与恢复
  • PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables
  • Hibernate 脏检查和刷新缓存机制
  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
  • EMG肌肉信号处理合集 (一)
  • 【DP】mobiusp正在创作乐曲
  • 【5+】跨webview多页面 触发事件(二)
  • 【面试系列】之二:关于js原型
  • js中forEach回调同异步问题
  • Vue 2.3、2.4 知识点小结
  • 技术发展面试
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 树莓派 - 使用须知
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 正则学习笔记
  • 走向全栈之MongoDB的使用
  • FaaS 的简单实践
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​低代码平台的核心价值与优势
  • #pragma once与条件编译
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)计算机毕业设计ssm电影分享网站
  • (转)Linux下编译安装log4cxx
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MVC之AOP
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 解决重复提交问题
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net反编译的九款神器
  • .NET与 java通用的3DES加密解密方法
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @EnableAsync和@Async开始异步任务支持
  • @JoinTable会自动删除关联表的数据
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [20190113]四校联考
  • [Android Pro] AndroidX重构和映射
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [cogs2652]秘术「天文密葬法」
  • [Foreman]解决Unable to find internal system admin account
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [leetcode]Flatten Binary Tree to Linked List