从rustup出发看rust编译生态
1. rust和llvm的关系是怎样的?
2. rustup中targets是什么,为什么可以安装多个?
3. rust在windows上为什么需要安装visual studio?
4. rust工具链有哪些工具?
当你心血来潮想学习rust这门语言时,一定会用到rustup来安装rust。同时你可以会疑问toolchain是啥,target又是啥,为啥学其它编程语言没有这些概念,下面我们就一一解答你的疑问。
rustup是什么
在这里不会事无巨细的唠叨rustup的细致末节,我们会简单的介绍它可以用来干什么,关于细节可以查看我的这篇文章【rustup详解】。说到rustup你一定还想知道cargo这个工具,如果你感兴趣可以看这篇文档【cargo入门】(先占位,呼声高我再肝[斜眼])
接下来我们就来看看,rustup为我们编写rust代码提供那哪些便利。
rustup是 rust 的官方工具链管理器,它提供了一种方便的方式来安装、管理和切换不同的rust工具链版本。总的来说有如下能力:
1. 安装 rust:
• rustup 允许你轻松地安装最新版本的 rust,包括稳定版、beta 版和 nightly 版。 rustup install stable
2. 切换 rust 工具链版本:
• 你可以使用 rustup default 命令切换默认的 rust 版本。 rustup default stable
• 也可以在项目级别使用 .rust-version 文件指定特定的 rust 版本。
3. 管理目标(targets):
• rustup 允许你安装不同的目标,以支持交叉编译和在不同的平台上运行 rust 代码。 rustup target add
• 列出已安装的目标: rustup target list
4. 升级 rust 工具链版本:
• 使用 rustup update 命令可以升级已安装的 rust 工具链版本。 rustup update
5. 卸载 rust:
• rustup 允许你卸载 rust,并清理相关的工具链和组件。 rustup self uninstall
6. 组件管理:
• rustup 允许你安装和管理不同的 rust 组件,如 rust-src、rust-analysis 等。 rustup component add rust-src
7. 查看工具链信息:
• 使用 rustup show 命令可以查看有关当前 rust 环境的详细信息,包括已安装的工具链、组件等。 rustup show
通过上面的内容我们知道了rustup可以管理toolchain和target,那么toolchain和target究竟是什么呢?
toolchain
toolchain指一组rust工具,包括编译器(rustc)、构建工具(cargo)、文档生成工具(rustdoc)以及其他与 rust 相关的实用程序。toolchain用于管理和构建 rust 代码,并且可以包括一个特定版本的 rust 编译器和标准库,还包含一个默认是编译到本机平台的target。工具链的版本可以是 stable(稳定版)、beta(测试版)或 nightly(每日构建版),每个版本都对应着不同的 rust 编译器和特性。
下面这些常用的命令可以操作工具链:
# 安装新的toolchainrustup install stable# 设置默认的toolchainrustup default stable# 列出已经安装的toolchainrustup toolchain list# 更新到最新稳定版rustup update stable# 更新到指定版本rustup update # 显示toolchain和targetsrustup show 下面这些就是工具链中的工具命令了,它们通常存储在~/.cargo/bin这个目录下。
1. rustc: rust编译器,负责将rust源代码编译为机器码。它是rust的主要编译器,也是构建rust程序的关键组件。
2. cargo: rust的构建系统和包管理器。cargo简化了项目的创建、依赖管理和构建过程。它还提供了一组命令用于构建、运行测试、发布和安装rust程序。
3. rustdoc: rust的文档生成工具。通过使用特定的注释格式,rustdoc能够生成漂亮的文档,帮助开发者编写和维护文档。
4. rustfmt: 代码格式化工具,用于保持rust代码的一致性和可读性。它能够格式化代码,使其符合rust语言的约定。
5. rustup: rust的工具链管理器,用于安装、升级和管理rust的不同版本。它还允许你切换默认的rust版本,以适应项目的需求。
6. rls (rust language server): 提供了与ide(集成开发环境)集成所需的功能,例如代码补全、跳转到定义、查找引用等。支持的ide包括visual studio code、atom等。
7. cargo-make: 用于创建和运行自定义构建任务的工具。它允许开发者在构建过程中执行自定义的命令和脚本。
8. miri: rust的mir interpreter,用于执行和测试rust程序在mir(mid-level intermediate representation)级别的代码。miri有助于检测一些可能的内存安全问题。
这只是rust工具链中的一部分工具。rust社区积极发展和维护工具链,以提高开发者的工作效率,并确保rust代码的质量和安全性。你可以通过查阅rust官方文档或使用cargo --list命令查看完整的工具列表。
rustc target介绍
rust 中的target概念主要是为了支持跨平台开发和交叉编译,以确保 rust 代码可以在不同的操作系统和架构上正确运行。rustc target指的是编译和构建目标平台rust代码时需要的组件。不要混淆为rust项目编译后产生的target文件夹。它的格式表示为:---。其中:
• 表示架构(例如,x86_64 表示 64 位的 x86 架构)。
• 表示供应商(一般为空)。
• 表示操作系统(例如,linux、windows、macos 等)。
• 表示二进制接口(例如,默认的是 gnu,也可以是 musl、msvc 等)。
示例:
• x86_64-unknown-linux-gnu: 64位 x86 架构,linux 操作系统。
• i686-pc-windows-msvc: 32位 x86 架构,windows 操作系统,使用 msvc 编译器。
• aarch64-apple-ios: 64位 arm 架构,ios 操作系统。
• wasm32-unknown-unknown: webassembly 目标。
一般来说只需要rustup target add 命令安装某个目标平台组件即可,但对于一些特殊平台,可能需要手动安装相关的交叉编译工具链,例如windows msvc或者android ndk。
下面是操作target常用的命令:
# 列出可用的targetrustup target list# 安装一个新的rustup target add rustup target add x86_64-unknown-linux-gnu# 把代码编译到指定平台cargo build --target x86_64-unknown-linux-gnu • 安装新目标:rustup target add
• 列出已安装的目标:rustup target list
我在初学rust时,就经常混淆toolchain和target。现在我们知道了target是toolchain的一部分,编译到特定目标平台要使用对应目标平台的target。
rust编译器中的llvm、msvc、gnu
你可能听说过rust编译器后端使用了llvm,那为何还需要msvc和gnu呢,为啥go和java这些语言不需要呢?那我们来理一下rust编译过程你就清楚了。
rust编译器实际上是由多个组件组成的,其中之一是“rustc”做为前端编译器,而编译器的后端使用了llvm。
1. 前端编译器(rustc): 这一部分负责将rust源代码转换为中间表示(intermediate representation,ir),该表示形式在rust中称为“mir”(mid-level intermediate representation)。
2. 后端编译器(llvm): mir然后被传递给llvm,llvm是一个开源的编译器基础设施,提供了许多通用的优化和代码生成工具。llvm将mir转换为目标机器的机器码,并执行一系列优化,以生成最终的可执行文件。
以windows平台为例,rust编译器就是rustc.exe,它首先会把源码编译为mir,然后交给llvm处理,llvm继续把mir先编译成llvm ir进而编译为目标平台的机器码(此时还不是执行文件,只是一堆机器码)。往后就是target发挥作用了,target调用msvc或gnu来完成链接步骤,主要是链接目标平台库文件并生成可执行文件。这里整个编译过程几乎都是由rustc.exe完成的,因为它包含了llvm和调用target的代码,跟目标平台相关的工作则是由msvc或gnu来完成。msvc和gnu是c/c++的编译工具链,编译后的最终产物就是可执行文件或库,rustc在编译后期用到了它们提供的功能。
整个编译过程大致如下:
source code -> mir -> llvm ir -> 机器码 -> target链接 -> 可执行文件或库
go编译器是自己实现了链接目标平台的工作,因此不需要msvc或gnu。java也是类似,所有的底层工作都是java虚拟机实现的,javac仅仅是把源码编译成class字节码就结束了。
详细解析滤波器的定义,滤波器的特性,滤波器的工作原理,滤波器的分类,滤波器的典型电路原理图
G60卫星工厂正式启用,格思航天首颗商业卫星发射升空
Metalenz和纵慧芯光联合推出新的结构光传感解决方案
图书馆的智能化怎样用人工智能来实现
人工智能的实现方式有哪些 ai发展现状及趋势
从Rustup出发看Rust编译生态
有关新的Google地图功能的详细信息已经出现
爱芯元智CEO仇肖莘出席CISES:AI赋能传统技术,加速智能化转型
曙光亮相中国CAE工程分析技术年会
ASML***的最新进展
安捷伦DSA91304A高性能示波器13Ghz带宽4通道40G采样
光栅耦合器学习笔记
微软GitHub Copilot付费用户突破百万,AI助力罕见癌症诊断
想让无人驾驶更靠谱,先把公路修得更智能
剖析京东方Mini LED战略布局:两大技术处于领先
HarmonyOS后台任务管理开发指南上线!
鉴向倍频线路图
AMD处理器型号的SurfaceLaptop或在10月2日亮相
ChatGPT加速大内存机型普及,VERTU上新1TB WEB3手机
Mastercam后处理机器定义说明