电竞比分网-中国电竞赛事及体育赛事平台

分享

Rust學(xué)習(xí)筆記 | 01

 芥子c1yw3tb42g 2024-04-03 發(fā)布于陜西
系列文章目錄 一、允許我先扯一扯

在解釋原因之前,先允許博主來介紹一下自己目前所掌握的編程語言。

C++是我接觸的第一門編程語言,剛上大學(xué)那會上課所學(xué),后來因為沒有從事相關(guān)工作,現(xiàn)在還依稀記得一點基礎(chǔ)知識,比如C++中的namespace,類和對象中的構(gòu)造函數(shù)與析構(gòu)函數(shù)、訪問控制、重載,別的忘的一干二凈了。

C是我接觸的第二門編程語言,是因為自己喜歡玩嵌入式所以自學(xué)的,當(dāng)初跟著郝斌老師的教程學(xué)的非常開心,第一次知道了程序運行的基本原理、變量的本質(zhì)、指針的本質(zhì),后來學(xué)會了結(jié)構(gòu)體、共用體、枚舉這些復(fù)合數(shù)據(jù)類型,用指針+復(fù)合數(shù)據(jù)類型也能玩一些比較騷的操作,比如結(jié)構(gòu)體無差異化遍歷,函數(shù)指針實現(xiàn)抽象層使得設(shè)計與實現(xiàn)分離等。

C的靈魂在于指針,指針給了我們很大的編程自由,想指哪指哪,在這樣極其自由的環(huán)境下,也造成編寫的程序經(jīng)常會存在一些玄學(xué)bug,這幾年玩嵌入式也寫了不少的C語言代碼,如果出現(xiàn)玄學(xué)問題,那么可能的情況只有兩種:指針的問題、malloc來的內(nèi)存沒有free掉造成內(nèi)存泄漏。

Java是我接觸的第三門編程語言,因為這是當(dāng)時學(xué)校的一門課,當(dāng)時C語言已經(jīng)掌握了不錯的基礎(chǔ)知識,所以學(xué)Java的時候?qū)W的很舒服。一是Java語法比較常規(guī),從C過渡到Java很容易(在學(xué)習(xí)理解層面沒有太大差異);二是Java具備非常高的安全性,函數(shù)中的成員變量如果不賦初始值,編譯器會直接報錯,所以更別想寫什么騷操作了,老老實實的按照J(rèn)ava語法寫代碼,這也就使得Java程序一旦編譯通過,幾乎不會在運行時崩潰掉;三是因為Java的可以使用package封裝類,所以別人封起來的類庫可以拿來調(diào)用玩,并且Java自身就提供了一些好玩的庫,比如網(wǎng)絡(luò)通信、界面庫,所以學(xué)Java在很大程度上是學(xué)這些類庫怎么使用。

Java的優(yōu)勢在于安全、常規(guī)、可以用包共享類庫、編譯器檢查嚴(yán)格,所以Java的代碼寫起來是最舒服的,但是Java程序是跑在JVM之上的,所以去掉了指針,不給程序員直接訪問內(nèi)存空間的機會,這也導(dǎo)致了Java不會應(yīng)用在嵌入式領(lǐng)域開發(fā)中直接應(yīng)用。在動態(tài)內(nèi)存管理方面,JVM提供了內(nèi)存回收機制,雖然避免了內(nèi)存泄漏問題,但也加大了Java程序運行的開銷。

C#是我接觸的第四門編程語言,是因為在嵌入式開發(fā)中需要編寫一些上位機軟件,比如串口助手之類的小工具,所以自學(xué)了這門語言。C#和Java非常類似,再配上VS這樣強大的IDE,只要你有面向思想的思想,直接擼代碼就OK,誰編程還不是靠自動提示呢~

Python是我接觸的第五門編程語言,當(dāng)時python正火,所以選了學(xué)校開設(shè)的一門公選課來學(xué)習(xí)。它的特性就是相比起C和Java,語法非常簡潔,不用聲明變量數(shù)據(jù)類型,內(nèi)部提供了非常多的方法供你調(diào)用,外部有更多的python包供你調(diào)用,一些常規(guī)功能根本不用自己去動腦實現(xiàn),先導(dǎo)入包,然后調(diào)用包里的方法,搞定。

Python的優(yōu)勢在于編寫的代碼簡潔,但是Python是解釋型語言,一方面導(dǎo)致執(zhí)行慢且性能低,另一方面導(dǎo)致錯誤代碼在運行時才會出錯。目前在嵌入式開發(fā)中有MicroPython,供用戶去使用python編寫簡單的代碼,但我覺得都這東西沒有什么意義,玩玩還行,做項目或者做產(chǎn)品,還是打擾了。

二、為什么是Rust?

如果你同樣了解C/C++,推薦看這個視頻:好玩兒的Rust語言。

當(dāng)我第一次了解到Rust的優(yōu)勢時,就深深的被它吸引了。

Rust的設(shè)計沒有去除指針,可以直接訪問內(nèi)存地址,所以可以應(yīng)用到嵌入式開發(fā)中。

Rust的所有權(quán)設(shè)計使的程序在編譯階段進(jìn)行嚴(yán)格的代碼審查,不會造成內(nèi)存泄漏(內(nèi)存安全)。

Rust的設(shè)計將所有安全相關(guān)的開銷放在了編譯階段,不會影響程序執(zhí)行的效率,這也正是Rust所吸引我這個嵌入式老玩家的魅力所在。

Rust擁有cargo這樣非常好用的構(gòu)建系統(tǒng)和包管理系統(tǒng),可以非常方便的使用其他開發(fā)者貢獻(xiàn)的包。

三、搭建Rust開發(fā)環(huán)境

參考官方教程:Install Rust

Windows環(huán)境

1. 下載安裝工具rustup

Rust開發(fā)環(huán)境由工具rustup安裝和管理,在官網(wǎng)下載該工具。
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_java
下載之后運行開始安裝。

2. Rust安裝需求

Rust需要VS中Microsoft C++ build工具的支持,VS2013版本或者更新的版本都可以

① 確保安裝了VS2013或者之后版本;

② 確保安裝了C++工具鏈:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_rust_02

3. Rust安裝

選擇繼續(xù)安裝:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_環(huán)境變量_03

安裝完成:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_其他_04

4. 檢查環(huán)境變量是否正常

Rust開發(fā)環(huán)境會將所有工具都安裝在用戶目錄/.cargo/bin目錄中,包括rustc、cargo、rustup在內(nèi)的rust工具鏈。

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_環(huán)境變量_05
安裝過程中rustup工具會將該路徑自動添加到環(huán)境變量中,可以在命令行中運行該命令查看版本,如圖:

rustc --version

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_python_06
如果不能查看,則需要手動添加該路徑到環(huán)境變量中。

5. 升級rust開發(fā)環(huán)境

rustup update

6. 卸載rust開發(fā)環(huán)境

rustup self uninstall

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_其他_07

Linux環(huán)境

使用下面這行命令安裝即可:

curl --proto '=https' --tlsv1.2 -sSf https://sh. | sh

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_其他_08
因為rust安裝過程中修改了環(huán)境變量,所以需要使環(huán)境變量生效:

source ~/.cargo/env

檢查是否可以查看版本:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_rust_09

MAC下安裝

使用下面這行命令安裝:

curl --proto '=https' --tlsv1.2 -sSf https://sh. | sh

更新當(dāng)前終端環(huán)境變量:

source $HOME/.cargo/env
四、Cargo的使用

cargo是Rust的構(gòu)建工具和包管理器,常用的cargo命令如下。

查看cargo版本

通過查看版本可以檢查cargo是否可以正常使用:

cargo --version

構(gòu)建項目

cargo build

運行項目

cargo run

編譯檢查

cargo check

測試項目

cargo test

為項目構(gòu)建文檔

cargo doc

發(fā)布庫

將庫發(fā)布到

cargo publish
五、HelloWorld

接下來所有操作都在powershell命令行中完成。

1. 使用cargo創(chuàng)建新項目

使用cargo創(chuàng)建hello-rust項目:

cargo new hello-rust

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_java_10
這會生成一個名為hello-rust的新項目,其中包含以下文件:

hello-rust
|- .git
|- .gitignore
|- Cargo.toml
|- src
  |- main.rs
  • .git:git存儲倉庫
  • .gitignore:git忽略文件
  • Cargo.tomlRust的清單文件,包含了項目的元數(shù)據(jù)和依賴庫
  • src/main.rsRust源碼文件

2. Rust源碼

Rust源碼為.rs格式,main.rs內(nèi)容如下:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_python_11

3. toml構(gòu)建文件

[package] name = 'hello-rust' version = '0.1.0' edition = '2018' # See more keys and their definitions at https://doc./cargo/reference/manifest.html [dependencies]

cargo使用TOML作為配置的標(biāo)準(zhǔn)格式:

  • [package]:區(qū)域標(biāo)簽,表示接下來的語句用于配置當(dāng)前的程序包;
  • name:程序名
  • version:程序版本
  • edition:作者信息
  • [dependencies]:區(qū)域標(biāo)簽,表示接下來的區(qū)域用來聲明項目的依賴(creat)。

4. 編譯工程

進(jìn)入剛剛生成的rust工程,然后執(zhí)行cargo編譯命令:

cd .\hello-rust
cargo build

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_環(huán)境變量_12

5. 運行工程

若沒有編譯,該命令在運行前也會先進(jìn)行編譯。

cargo run

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_python_13

6. rustc和cargo的關(guān)系

這里需要注意,cargo是rust的構(gòu)建工具和包管理工具,而rustc才是rust的編譯器。

同樣在C語言中,gcc是編譯器,而make是在gcc之上的構(gòu)建工具。

這里我們當(dāng)然可以直接用rustc來編譯,直接在main.rs文件所在位置打開編譯器,使用rustc編譯:

rustc .\main.rs

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_其他_14

7. 在本地構(gòu)建一份關(guān)于工程中所有依賴的文檔

cargo doc --open
六、Rust依賴包crates

1. 什么是crates

Rust中的包稱為crates,可以在Rust包的倉庫中找到所有類別的庫: 。

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_python_15

2. 如何安裝crates包及其依賴

接下來通過 ferris-says 庫學(xué)習(xí)如何安裝crates包。

首先在上找到該包的說明,有非常詳細(xì)的使用說明。
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_rust_16
添加該包到項目的Cargo.toml文件中:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_python_17
運行編譯命令,Cargo會自動安裝該包及其依賴包:

cargo build

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_環(huán)境變量_18
安裝之后,Cargo會創(chuàng)建一個新文件 Cargo.lock,該文件記錄了本地所用依賴庫的精確版本

3. 如何使用crates包

導(dǎo)入依賴包:

extern crate ferris_says;

使用依賴包的say函數(shù):

use ferris_says::say;

使用示例:

extern crate ferris_says; use ferris_says::say; use std::io::{ stdout, BufWriter }; fn main() { let out = b'Hello fellow Rustaceans!'; let width = 24; let mut writer = BufWriter::new(stdout()); say(out, width, &mut writer).unwrap(); }

運行該項目:

cargo run

Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_python_19
Ferris 是 Rust 社區(qū)的非官方吉祥物,很多 Rust 程序員自稱“Rustaceans”:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_環(huán)境變量_20

七、使用VScode開發(fā)Rust

VScode只需要安裝rust擴展即可愉快的進(jìn)行Rust開發(fā)了:
Rust學(xué)習(xí)筆記 | 01 - Rust快速入門(為什么是Rust、開發(fā)環(huán)境搭建、Cargo的使用、HelloWorld、Rust依賴包crates)_rust_21
當(dāng)我們再次使用VScode打開之前的HelloWorld項目時,VScode Rust擴展會自動啟動,并安裝一些額外的組件。

安裝完成后,就可以在VScode中愉快的編寫Rust代碼啦!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多