從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文件夾。它的格式表示為:
?
?
?
?
示例:
?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è)新的rustuptargetaddrustuptargetaddx86_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é)束了。
審核編輯:黃飛
-
操作系統(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)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論