從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-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 #安裝一個新的rustuptargetaddrustuptargetaddx86_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é)束了。
審核編輯:黃飛
-
操作系統(tǒng)
+關注
關注
37文章
6801瀏覽量
123280 -
編譯器
+關注
關注
1文章
1623瀏覽量
49107 -
Rust
+關注
關注
1文章
228瀏覽量
6598
原文標題:從Rustup出發(fā)看Rust編譯生態(tài)
文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論