0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從Rustup出發(fā)看Rust編譯生態(tài)

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 2024-01-02 11:00 ? 次閱讀

從Rustup出發(fā)看Rust編譯生態(tài)

1. Rust和LLVM的關(guān)系是怎樣的?

2. Rustup中targets是什么,為什么可以安裝多個(gè)?

3. Rust在windows上為什么需要安裝Visual studio?

4. Rust工具鏈有哪些工具?

當(dāng)你心血來潮想學(xué)習(xí)Rust這門語言時(shí),一定會用到Rustup來安裝Rust。同時(shí)你可以會疑問toolchain是啥,target又是啥,為啥學(xué)其它編程語言沒有這些概念,下面我們就一一解答你的疑問。

rustup是什么

在這里不會事無巨細(xì)的嘮叨Rustup的細(xì)致末節(jié),我們會簡單的介紹它可以用來干什么,關(guān)于細(xì)節(jié)可以查看我的這篇文章【Rustup詳解】。說到Rustup你一定還想知道Cargo這個(gè)工具,如果你感興趣可以看這篇文檔【cargo入門】(先占位,呼聲高我再肝[斜眼])

接下來我們就來看看,Rustup為我們編寫Rust代碼提供那哪些便利。

Rustup是 Rust 的官方工具鏈管理器,它提供了一種方便的方式來安裝、管理和切換不同的Rust工具鏈版本??偟膩碚f有如下能力:

1.安裝 Rust:

?rustup允許你輕松地安裝最新版本的 Rust,包括穩(wěn)定版、beta 版和 nightly 版。rustup install stable

2.切換 Rust 工具鏈版本:

?你可以使用rustup default命令切換默認(rèn)的 Rust 版本。rustup default stable

?也可以在項(xiàng)目級別使用.rust-version文件指定特定的 Rust 版本。

3.管理目標(biāo)(Targets):

?rustup允許你安裝不同的目標(biāo),以支持交叉編譯和在不同的平臺上運(yùn)行 Rust 代碼。rustup target add

?列出已安裝的目標(biāo):rustup target list

4.升級 Rust 工具鏈版本:

?使用rustup update命令可以升級已安裝的 Rust 工具鏈版本。rustup update

5.卸載 Rust:

?rustup允許你卸載 Rust,并清理相關(guān)的工具鏈和組件。rustup self uninstall

6.組件管理:

?rustup允許你安裝和管理不同的 Rust 組件,如rust-src、rust-analysis等。rustup component add rust-src

7.查看工具鏈信息

?使用rustup show命令可以查看有關(guān)當(dāng)前 Rust 環(huán)境的詳細(xì)信息,包括已安裝的工具鏈、組件等。rustup show

通過上面的內(nèi)容我們知道了Rustup可以管理toolchain和target,那么toolchain和target究竟是什么呢?

Toolchain

toolchain指一組Rust工具,包括編譯器(rustc)、構(gòu)建工具(cargo)、文檔生成工具(rustdoc)以及其他與 Rust 相關(guān)的實(shí)用程序。Toolchain用于管理和構(gòu)建 Rust 代碼,并且可以包括一個(gè)特定版本的 Rust 編譯器和標(biāo)準(zhǔn)庫,還包含一個(gè)默認(rèn)是編譯到本機(jī)平臺的target。工具鏈的版本可以是 "stable"(穩(wěn)定版)、"beta"(測試版)或 "nightly"(每日構(gòu)建版),每個(gè)版本都對應(yīng)著不同的 Rust 編譯器和特性。

下面這些常用的命令可以操作工具鏈:

#安裝新的toolchain
rustupinstallstable
#設(shè)置默認(rèn)的toolchain
rustupdefaultstable
#列出已經(jīng)安裝的toolchain
rustuptoolchainlist
#更新到最新穩(wěn)定版
rustupupdatestable
#更新到指定版本
rustupupdate
#顯示toolchain和targets
rustupshow

下面這些就是工具鏈中的工具命令了,它們通常存儲在~/.cargo/bin這個(gè)目錄下。

1.rustc:Rust編譯器,負(fù)責(zé)將Rust源代碼編譯為機(jī)器碼。它是Rust的主要編譯器,也是構(gòu)建Rust程序的關(guān)鍵組件。

2.Cargo:Rust的構(gòu)建系統(tǒng)和包管理器。Cargo簡化了項(xiàng)目的創(chuàng)建、依賴管理和構(gòu)建過程。它還提供了一組命令用于構(gòu)建、運(yùn)行測試、發(fā)布和安裝Rust程序。

3.rustdoc:Rust的文檔生成工具。通過使用特定的注釋格式,rustdoc能夠生成漂亮的文檔,幫助開發(fā)者編寫和維護(hù)文檔。

4.rustfmt:代碼格式化工具,用于保持Rust代碼的一致性和可讀性。它能夠格式化代碼,使其符合Rust語言的約定。

5.rustup:Rust的工具鏈管理器,用于安裝、升級和管理Rust的不同版本。它還允許你切換默認(rèn)的Rust版本,以適應(yīng)項(xiàng)目的需求。

6.rls (Rust Language Server):提供了與IDE(集成開發(fā)環(huán)境)集成所需的功能,例如代碼補(bǔ)全、跳轉(zhuǎn)到定義、查找引用等。支持的IDE包括Visual Studio Code、Atom等。

7.cargo-make:用于創(chuàng)建和運(yùn)行自定義構(gòu)建任務(wù)的工具。它允許開發(fā)者在構(gòu)建過程中執(zhí)行自定義的命令和腳本。

8.miri:Rust的Mir Interpreter,用于執(zhí)行和測試Rust程序在MIR(Mid-level Intermediate Representation)級別的代碼。Miri有助于檢測一些可能的內(nèi)存安全問題。

這只是Rust工具鏈中的一部分工具。Rust社區(qū)積極發(fā)展和維護(hù)工具鏈,以提高開發(fā)者的工作效率,并確保Rust代碼的質(zhì)量和安全性。你可以通過查閱Rust官方文檔或使用cargo --list命令查看完整的工具列表。

Rustc target介紹

Rust 中的target概念主要是為了支持跨平臺開發(fā)和交叉編譯,以確保 Rust 代碼可以在不同的操作系統(tǒng)和架構(gòu)上正確運(yùn)行。Rustc target指的是編譯和構(gòu)建目標(biāo)平臺Rust代碼時(shí)需要的組件。不要混淆為Rust項(xiàng)目編譯后產(chǎn)生的target文件夾。它的格式表示為:---。其中:

?表示架構(gòu)(例如,x86_64 表示 64 位的 x86 架構(gòu))。

?表示供應(yīng)商(一般為空)。

?表示操作系統(tǒng)(例如,linux、windows、macos 等)。

?表示二進(jìn)制接口(例如,默認(rèn)的是 "gnu",也可以是 "musl"、"msvc" 等)。

示例:

?x86_64-unknown-linux-gnu: 64位 x86 架構(gòu),Linux 操作系統(tǒng)。

?i686-pc-windows-msvc: 32位 x86 架構(gòu),Windows 操作系統(tǒng),使用 MSVC 編譯器。

?aarch64-apple-ios: 64位 ARM 架構(gòu),iOS 操作系統(tǒng)。

?wasm32-unknown-unknown: WebAssembly 目標(biāo)。

一般來說只需要rustup target add命令安裝某個(gè)目標(biāo)平臺組件即可,但對于一些特殊平臺,可能需要手動安裝相關(guān)的交叉編譯工具鏈,例如windows msvc或者android NDK

下面是操作Target常用的命令:

#列出可用的target
rustuptargetlist
#安裝一個(gè)新的rustuptargetadd
rustuptargetaddx86_64-unknown-linux-gnu
#把代碼編譯到指定平臺
cargobuild--targetx86_64-unknown-linux-gnu

?安裝新目標(biāo):rustup target add

?列出已安裝的目標(biāo):rustup target list

我在初學(xué)rust時(shí),就經(jīng)?;煜齮oolchain和target。現(xiàn)在我們知道了target是toolchain的一部分,編譯到特定目標(biāo)平臺要使用對應(yīng)目標(biāo)平臺的target。

Rust編譯器中的LLVM、MSVC、GNU

你可能聽說過Rust編譯器后端使用了LLVM,那為何還需要msvc和gnu呢,為啥Go和Java這些語言不需要呢?那我們來理一下Rust編譯過程你就清楚了。

Rust編譯器實(shí)際上是由多個(gè)組件組成的,其中之一是“rustc”做為前端編譯器,而編譯器的后端使用了LLVM。

1.前端編譯器(rustc):這一部分負(fù)責(zé)將Rust源代碼轉(zhuǎn)換為中間表示(Intermediate Representation,IR),該表示形式在Rust中稱為“MIR”(Mid-level Intermediate Representation)。

2.后端編譯器(LLVM):MIR然后被傳遞給LLVM,LLVM是一個(gè)開源的編譯器基礎(chǔ)設(shè)施,提供了許多通用的優(yōu)化和代碼生成工具。LLVM將MIR轉(zhuǎn)換為目標(biāo)機(jī)器的機(jī)器碼,并執(zhí)行一系列優(yōu)化,以生成最終的可執(zhí)行文件。

以Windows平臺為例,Rust編譯器就是rustc.exe,它首先會把源碼編譯為MIR,然后交給LLVM處理,LLVM繼續(xù)把MIR先編譯成LLVM IR進(jìn)而編譯為目標(biāo)平臺的機(jī)器碼(此時(shí)還不是執(zhí)行文件,只是一堆機(jī)器碼)。往后就是target發(fā)揮作用了,target調(diào)用msvc或gnu來完成鏈接步驟,主要是鏈接目標(biāo)平臺庫文件并生成可執(zhí)行文件。這里整個(gè)編譯過程幾乎都是由rustc.exe完成的,因?yàn)樗薼lvm和調(diào)用target的代碼,跟目標(biāo)平臺相關(guān)的工作則是由msvc或gnu來完成。msvc和gnu是c/c++的編譯工具鏈,編譯后的最終產(chǎn)物就是可執(zhí)行文件或庫,rustc在編譯后期用到了它們提供的功能。

整個(gè)編譯過程大致如下:

Source code -> MIR -> LLVM IR -> 機(jī)器碼 -> Target鏈接 -> 可執(zhí)行文件或庫

Go編譯器是自己實(shí)現(xiàn)了鏈接目標(biāo)平臺的工作,因此不需要msvc或gnu。Java也是類似,所有的底層工作都是Java虛擬機(jī)實(shí)現(xiàn)的,javac僅僅是把源碼編譯成class字節(jié)碼就結(jié)束了。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6684

    瀏覽量

    123140
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49015
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6542

原文標(biāo)題:從Rustup出發(fā)看Rust編譯生態(tài)

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    未來嵌入式系統(tǒng)的黃金搭檔 MCX N947遇上Rust

    ? Rust 介紹 Rust 是一門注重安全的語言,相比于 C/C++/ASM 有著更高級的抽象能力、編譯器帶來的安全特性與廣泛友好的社區(qū)支持。 Linux 與 Windows 內(nèi)核也都
    的頭像 發(fā)表于 07-25 09:14 ?1253次閱讀
    未來嵌入式系統(tǒng)的黃金搭檔 MCX N947遇上<b class='flag-5'>Rust</b>

    esp32s3開發(fā)時(shí),每次改動,rust編譯的時(shí)間都很長為什么?

    esp32s3 開發(fā)時(shí),每次改動,rust編譯時(shí)間太長
    發(fā)表于 06-05 06:36

    【MYD-Y6ULX試用體驗(yàn)】建立開發(fā)環(huán)境

    會安裝RUST??蛇\(yùn)行$ rustc --version命令查看安裝是否成功。因?yàn)橐徊?b class='flag-5'>編譯程序到開發(fā)中, 還需要對應(yīng)目標(biāo)的標(biāo)準(zhǔn)庫,可用$ rustup add
    發(fā)表于 03-27 16:46

    使用rust開發(fā)stm32系列教程

    本文為使用 rust 開發(fā) stm32 系列教程前言。Why RustRust 特性就不用多介紹了,有個(gè)編譯器管著有時(shí)候比用C到處浪把自己整沒了好。ST官方逐漸停止對C固件庫的更新,使用MX感覺沒
    發(fā)表于 08-20 07:18

    如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust開發(fā)

    安裝 Rust 的時(shí)候暫且跳過 Visual Studio 也是完全沒有問題的 ;)如果安裝好 Rust 的開發(fā)環(huán)境,重啟一下控制臺,應(yīng)當(dāng)能運(yùn)行 rustup (工具鏈管理),rustc (
    發(fā)表于 06-21 10:38

    【沁恒微CH32V307評估板試用體驗(yàn)】探索Rust編程語言的嵌入式開發(fā)——基于CH32V307【1】

    1 總述Rust語言的運(yùn)行效率高、開發(fā)效率好、適用范圍廣。作為一門編譯型語言,它直接編譯輸出到匯編代碼,通常公認(rèn)裸機(jī)的Rust語言性能在C語言級別,擁有較高的運(yùn)行效率。
    發(fā)表于 07-18 00:37

    編譯原理的角度C語言如何轉(zhuǎn)換成匯編語言的?

    編譯原理的角度C語言是如何轉(zhuǎn)換成匯編語言的?
    的頭像 發(fā)表于 02-25 15:52 ?2576次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>編譯</b>原理的角度<b class='flag-5'>看</b>C語言如何轉(zhuǎn)換成匯編語言的?

    rust-analyzer Rust編譯器前端實(shí)現(xiàn)

    ./oschina_soft/rust-analyzer.zip
    發(fā)表于 05-19 09:23 ?2次下載
    <b class='flag-5'>rust</b>-analyzer <b class='flag-5'>Rust</b><b class='flag-5'>編譯</b>器前端實(shí)現(xiàn)

    使用rustup來管理所有和Rust相關(guān)的工具鏈

    在前端開發(fā)中,經(jīng)常會使用 nvm[2](或 nvm-windows[3])來管理系統(tǒng)上的 Node.js 版本。而在 Rust 中則是使用 rustup[4] 來管理所有和 Rust 相關(guān)的工具鏈,而且它們具有很多相似性
    的頭像 發(fā)表于 11-23 09:45 ?2767次閱讀

    以調(diào)試Rust的方式來學(xué)習(xí)Rust

    在我上一篇 關(guān)于 Rustup 的文章 中,我向你們展示了如何安裝 Rust 工具鏈。但是,如果不能上手操作一下 Rust 的話下載工具鏈又有什么用?學(xué)習(xí)任何語言都包括閱讀現(xiàn)有的代碼和寫很多的示例程序,這是精通一門語言的好方法。
    的頭像 發(fā)表于 01-03 14:56 ?876次閱讀

    Chromium正式開始支持Rust

    ? Chromium 正式開始支持 Rust 目前的支持只是第一階段,在C++代碼中使用Rust寫的第三方庫(編譯成.so)。估計(jì)明年Chromium的二進(jìn)制發(fā)行文件中會包含rust
    的頭像 發(fā)表于 01-14 10:04 ?932次閱讀

    為什么我們C++語言轉(zhuǎn)向Rust語言呢?

    gtk4-rs代碼庫包含GTK4的Rust crates。還有個(gè)龐大的GObject庫生態(tài)系統(tǒng),其中許多庫基于gtk-rs中包含的Rust綁定工具。
    的頭像 發(fā)表于 02-17 17:45 ?1049次閱讀

    Rust 1.68.1發(fā)布修復(fù)了回歸問題

    rustup安裝了Rust,可以使用以下命令更新到1.68.1版本: rustup update stable 如何在2023年3月加速 Rust
    的頭像 發(fā)表于 03-27 14:43 ?453次閱讀

    最大化Rust性能:編譯器優(yōu)化的比較分析

    Rust以其獨(dú)特的安全性、速度和并發(fā)性組合而迅速流行。但是與其它任何語言一樣,要充分利用Rust需要的不僅僅是理解它的語法和習(xí)慣用法——還需要深入了解如何有效地利用和優(yōu)化它的編譯器。
    的頭像 發(fā)表于 05-29 16:17 ?1917次閱讀
    最大化<b class='flag-5'>Rust</b>性能:<b class='flag-5'>編譯</b>器優(yōu)化的比較分析

    [鴻蒙]OpenHarmony4.0的Rust開發(fā)

    背景 Rust 是一門靜態(tài)強(qiáng)類型語言,具有更安全的內(nèi)存管理、更好的運(yùn)行性能、原生支持多線程開發(fā)等優(yōu)勢。Rust 官方也使用 Cargo 工具來專門為 Rust 代碼創(chuàng)建工程和構(gòu)建編譯
    的頭像 發(fā)表于 02-26 17:28 ?782次閱讀
    [鴻蒙]OpenHarmony4.0的<b class='flag-5'>Rust</b>開發(fā)