從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-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 #安裝一個新的rustuptargetaddrustuptargetaddx86_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文章
6892瀏覽量
123742 -
編譯器
+關注
關注
1文章
1642瀏覽量
49284 -
Rust
+關注
關注
1文章
230瀏覽量
6664
原文標題:從Rustup出發看Rust編譯生態
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論