RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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的關系是怎樣的?

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

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

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

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

rustup是什么

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

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

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

1.安裝 Rust:

?rustup允許你輕松地安裝最新版本的 Rust,包括穩(wěn)定版、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 環(huán)境的詳細信息,包括已安裝的工具鏈、組件等。rustup show

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

Toolchain

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

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

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

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

1.rustc:Rust編譯器,負責將Rust源代碼編譯為機器碼。它是Rust的主要編譯器,也是構建Rust程序的關鍵組件。

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

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

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

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

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

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

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

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

Rustc target介紹

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

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

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

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

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

示例:

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

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

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

?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時,就經(jīng)?;煜齮oolchain和target?,F(xiàn)在我們知道了target是toolchain的一部分,編譯到特定目標平臺要使用對應目標平臺的target。

Rust編譯器中的LLVM、MSVC、GNU

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

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

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

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

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

整個編譯過程大致如下:

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

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

審核編輯:黃飛

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

    關注

    37

    文章

    6801

    瀏覽量

    123280
  • 編譯器
    +關注

    關注

    1

    文章

    1623

    瀏覽量

    49107
  • Rust
    +關注

    關注

    1

    文章

    228

    瀏覽量

    6598

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

    會安裝RUST??蛇\行$ rustc --version命令查看安裝是否成功。因為要交叉編譯程序到開發(fā)中, 還需要對應目標的標準庫,可用$ rustup add
    發(fā)表于 03-27 16:46

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

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

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

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

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

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

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

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

    rust-analyzer Rust編譯器前端實現(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>器前端實現(xiàn)

    使用rustup來管理所有和Rust相關的工具鏈

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

    以調(diào)試Rust的方式來學習Rust

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

    Chromium正式開始支持Rust

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

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

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

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

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

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

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

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

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