0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从Rustup出发看Rust编译生态

jf_wN0SrCdH 来源:Rust语言中文社区 2024-01-02 11:00 次阅读

从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 编译器和特性。

下面这些常用的命令可以操作工具链:

#安装新的toolchain
rustupinstallstable
#设置默认的toolchain
rustupdefaultstable
#列出已经安装的toolchain
rustuptoolchainlist
#更新到最新稳定版
rustupupdatestable
#更新到指定版本
rustupupdate
#显示toolchain和targets
rustupshow

下面这些就是工具链中的工具命令了,它们通常存储在~/.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常用的命令:

#列出可用的target
rustuptargetlist
#安装一个新的rustuptargetadd
rustuptargetaddx86_64-unknown-linux-gnu
#把代码编译到指定平台
cargobuild--targetx86_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字节码就结束了。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6287

    浏览量

    121886
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48618
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

原文标题:从Rustup出发看Rust编译生态

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【MYD-Y6ULX试用体验】建立开发环境

    会安装RUST。可运行$ rustc --version命令查看安装是否成功。因为要交叉编译程序到开发中, 还需要对应目标的标准库,可用$ rustup add
    发表于 03-27 16:46

    使用rust开发stm32系列教程

    本文为使用 rust 开发 stm32 系列教程前言。Why RustRust 特性就不用多介绍了,有个编译器管着有时候比用C到处浪把自己整没了好。ST官方逐渐停止对C固件库的更新,使用MX感觉没
    发表于 08-20 07:18

    介绍golang和rust语言在openwrt系统、mips架构下的交叉编译

    本文简单的介绍了golang和rust语言在openwrt系统、mips架构下的交叉编译。环境主机系统内核架构host主机Centos 7.2linux 3.10.0-327x86_64target
    发表于 11-05 09:11

    RUST在嵌入式开发中的应用是什么

    Rust是一种编程语言,它使用户能够构建可靠、高效的软件,尤其是用于嵌入式开发的软件。它的特点是:高性能:Rust具有惊人的速度和高内存利用率。可靠性:在编译过程中可以消除内存错误。生产效率:优秀
    发表于 12-24 08:34

    如何利用C语言去调用rust静态库呢

    感觉比较合适。但如果把主要工作切过来,感觉Rust目前又太荒芜了,而且上面的问题也同样存在。尝试了解到Rust可以编译成静态库,于是动了只用Rust实现其中一小部分功能的想法。随手一搜
    发表于 06-21 10:27

    如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust开发

    安装 Rust 的时候暂且跳过 Visual Studio 也是完全没有问题的 ;)如果安装好 Rust 的开发环境,重启一下控制台,应当能运行 rustup (工具链管理),rustc (
    发表于 06-21 10:38

    【沁恒微CH32V307评估板试用体验】探索Rust编程语言的嵌入式开发——基于CH32V307【1】

    1 总述Rust语言的运行效率高、开发效率好、适用范围广。作为一门编译型语言,它直接编译输出到汇编代码,通常公认裸机的Rust语言性能在C语言级别,拥有较高的运行效率。
    发表于 07-18 00:37

    为什么要用Rust进行嵌入式开发

      Rust 是什么 Rust 是一门赋予每个人构建可靠且高效软件能力的语言。 高性能:速度惊人且内存利用率极高 可靠性:在编译期就能消除各种内存错误 生产力:出色的文档,友好的编译
    的头像 发表于 11-06 10:04 2577次阅读

    rust-analyzer Rust编译器前端实现

    ./oschina_soft/rust-analyzer.zip
    发表于 05-19 09:23 2次下载
    <b class='flag-5'>rust</b>-analyzer <b class='flag-5'>Rust</b><b class='flag-5'>编译</b>器前端实现

    使用rustup来管理所有和Rust相关的工具链

    在前端开发中,经常会使用 nvm[2](或 nvm-windows[3])来管理系统上的 Node.js 版本。而在 Rust 中则是使用 rustup[4] 来管理所有和 Rust 相关的工具链,而且它们具有很多相似性
    的头像 发表于 11-23 09:45 2244次阅读

    以调试Rust的方式来学习Rust

    在我上一篇 关于 Rustup 的文章 中,我向你们展示了如何安装 Rust 工具链。但是,如果不能上手操作一下 Rust 的话下载工具链又有什么用?学习任何语言都包括阅读现有的代码和写很多的示例程序,这是精通一门语言的好方法。
    的头像 发表于 01-03 14:56 661次阅读

    Rust 1.68.1发布修复了回归问题

    rustup安装了Rust,可以使用以下命令更新到1.68.1版本: rustup update stable 如何在2023年3月加速 Rust
    的头像 发表于 03-27 14:43 286次阅读

    rust语言基础学习: rust中的错误处理

    错误是软件中不可避免的,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。
    的头像 发表于 05-22 16:28 1404次阅读

    最大化Rust性能:编译器优化的比较分析

    Rust以其独特的安全性、速度和并发性组合而迅速流行。但是与其它任何语言一样,要充分利用Rust需要的不仅仅是理解它的语法和习惯用法——还需要深入了解如何有效地利用和优化它的编译器。
    的头像 发表于 05-29 16:17 1468次阅读
    最大化<b class='flag-5'>Rust</b>性能:<b class='flag-5'>编译</b>器优化的比较分析

    [鸿蒙]OpenHarmony4.0的Rust开发

    背景 Rust 是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust 官方也使用 Cargo 工具来专门为 Rust 代码创建工程和构建编译
    的头像 发表于 02-26 17:28 310次阅读
    [鸿蒙]OpenHarmony4.0的<b class='flag-5'>Rust</b>开发