用Rust for Windows構(gòu)建更安全的軟件
譯文【51CTO.com快譯】微軟對Rust感興趣有一段時(shí)日了,研究其在系統(tǒng)編程任務(wù)中作為一種替代C和C ++的類型安全和內(nèi)存安全語言。隨著越來越多的微軟業(yè)務(wù)依賴云服務(wù),Rust等工具對于構(gòu)建那些服務(wù)、提高可靠性和安全性將至關(guān)重要。
系統(tǒng)編程工具根源于操作系統(tǒng)開發(fā),您需要在代碼和硬件之間有很少的東西,而與運(yùn)行時(shí)環(huán)境和垃圾回收有關(guān)的開銷增加了不必要的延遲。這些特性不僅適用于操作系統(tǒng),對于構(gòu)建任何可靠的應(yīng)用程序都很重要:您希望代碼安全運(yùn)行,不會(huì)導(dǎo)致內(nèi)存泄漏,而且攻擊者很難脫離代碼在系統(tǒng)內(nèi)存中的自有部分。
通過用Rust來構(gòu)建,您可以使代碼更安全。這是第一道防線,內(nèi)置在用于構(gòu)建代碼的語言和工具中。也許您正在構(gòu)建驅(qū)動(dòng)程序或者銀行軟件,重要的是您的代碼要值得信賴,您還需要管理風(fēng)險(xiǎn)。因此,在您可能使用JavaScript的地方,可以使用在WebAssembly中運(yùn)行的Rust,在您使用C或C ++的地方,可以使用Windows或Linux版本。
微軟、Rust和Windows
微軟對Rust的承諾體現(xiàn)在它是Rust基金會(huì)的創(chuàng)始成員,以及近幾個(gè)月眾多語言和工具開發(fā)人員加入了微軟。微軟現(xiàn)在宣布了自己的一套工具,用于使用Rust構(gòu)建和開發(fā)Windows代碼,這些工具基于讓它得以交付C ++ / WinRT API投射的同樣的Windows功能。
Rust for Windows的核心是支持Windows API元數(shù)據(jù)動(dòng)態(tài)生成API代碼的Rust crate。您將需要開發(fā)環(huán)境中的C ++構(gòu)建工具,或使用Visual Studio Code中的獨(dú)立工具,或使用完整安裝的Visual Studio。這確實(shí)意味著它不是免費(fèi)軟件:您需要Visual Studio許可證才能使用C ++工具。(如果您在構(gòu)建開源項(xiàng)目或者是個(gè)人開發(fā)者,可以使用免費(fèi)的社區(qū)版。)
可以從Rust網(wǎng)站下載32位和64位版本的Rust for Windows編譯器。rustup工具為您的開發(fā)系統(tǒng)下載所有適當(dāng)?shù)慕M件,一個(gè)簡單的命令行工具幫助定制安裝。如果您使用Code,還要安裝另外幾個(gè)擴(kuò)展程序:添加Rust語言服務(wù)器以用于IntelliSense代碼高亮顯示和提示的rust-analyzer,以及用于調(diào)試的CodeLLDB或微軟的C/C ++擴(kuò)展。一旦安裝到位,您可以開始使用Rust for Windows了。
走近Rust for Windows crate
對Windows開發(fā)人員而言最重要的工具之一是它支持語言投射。這項(xiàng)技術(shù)讓開發(fā)工具可以從Windows為其SDK提供的元數(shù)據(jù)來生成針對特定語言的API。有了語言投射支持,微軟無需為每種受支持的語言編寫API,增添了越來越多的Windows SDK的復(fù)雜性,并使每種受支持的語言更難與Windows保持同步。
該技術(shù)確保Rust要獲得Windows支持,只需要適當(dāng)?shù)恼Z言投射,然后根據(jù)需要自動(dòng)生成API。微軟無需為受支持的語言提供SDK,任何新語言只需要自己的語言投射,即可獲得Windows的支持。這種開發(fā)任務(wù)的復(fù)雜性低得多;隨著新的Windows API發(fā)布(比如在Project Reunion中),API團(tuán)隊(duì)只需要元數(shù)據(jù)定義。
您可以使用Visual Studio和Visual Studio Code中的Rust工具,編寫可在任何地方運(yùn)行的Rust模塊,但是如果您打算將其用于Windows開發(fā),需要安裝Rust for Windows工具才能訪問Windows API。微軟的Rust服務(wù)是GitHub上的一個(gè)開源項(xiàng)目。當(dāng)前版本以Rust crate的形式出現(xiàn),可以從Rust crate代碼庫來安裝。
使用Rust for Windows
Windows Rust crate使用標(biāo)準(zhǔn)Rust功能,從Rust的Cargo作為一個(gè)軟件包來安裝。安裝后,您可以使用Rust的構(gòu)建工具為要在項(xiàng)目中使用的Windows API創(chuàng)建適當(dāng)?shù)慕壎?。這種方法僅為您要使用的API提供代碼。你可以在添加API時(shí)添加新的綁定,刪除不需要支持的任何綁定。僅在需要時(shí)提供API支持為您的代碼增添了額外的安全性。它無法調(diào)用不受支持的API,盡量減小了任何攻擊面。
Windows上的Rust開發(fā)仍在開發(fā)中,因此您有時(shí)需要跳出平常的開發(fā)環(huán)境。需要使用命令行從Cargo創(chuàng)建新項(xiàng)目。一旦您創(chuàng)建了項(xiàng)目,創(chuàng)建一個(gè)綁定crate以托管Rust for Windows API。這是在您項(xiàng)目的cargo.toml文件中創(chuàng)建的,為Windows crate添加依賴項(xiàng)。這將會(huì)安裝適合您代碼的版本。需要手動(dòng)更新新版本的版本號(hào)(當(dāng)前版本號(hào)為0.8.0)。
Rust for Windows如何生成API綁定方面有意思的地方在于,您可以專注于想要使用的API命名空間部分。一旦選擇了命名空間,將其添加到綁定文件夾中的build.rs文件。微軟提供了一個(gè)宏來創(chuàng)建API綁定,使用它會(huì)自動(dòng)創(chuàng)建所需的任何依賴項(xiàng),而許多關(guān)鍵的API內(nèi)置在Windows crate中,無需為Windows.Foundation之類的標(biāo)準(zhǔn)API構(gòu)建綁定就可以使用。Windows API的說明文檔可幫助您入門。
然后,您可以在代碼中添加指向綁定文件的鏈接,可以隨時(shí)開始使用它們。這個(gè)過程的真正重要之處在于,您可以混合搭配所使用的API,在同一應(yīng)用程序中使用用于GPU計(jì)算的Direct3D和用于UI的XAML工具。它還為新的API做好了準(zhǔn)備,一旦新API發(fā)布即可利用它們的元數(shù)據(jù)。隨著微軟通過將Windows SDK與Windows發(fā)布周期相脫離以加快API開發(fā),這種方法會(huì)越來越重要。
結(jié)果是可以用Rust構(gòu)建完整的Windows應(yīng)用程序,這種方法靈活而強(qiáng)大。通過使用Rust for Windows來處理API調(diào)用,您的代碼將更安全,并為Windows API將來的變化做好了準(zhǔn)備,新的和更新后的API發(fā)布后,只需要重新構(gòu)建和重新編譯。
原文標(biāo)題:Build more secure software with Rust for Windows,作者:Simon Bisson
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】