Rust語言和C/C++區(qū)別對比,Rust和C語言哪個好
初接觸到Rust這門語言,主要是看中了它的性能和語法。發(fā)現(xiàn)Rust速度甚至在某些地方超過了C/C++,我就對這門語言比較感興趣。
Rust具有與C語言相當(dāng)?shù)乃俣群蛢?nèi)存效率,但無需手動內(nèi)存管理或垃圾回收,它擁有出色的工具支持、友好的編譯器和不斷發(fā)展的開發(fā)者社區(qū),使用Rust能提升程序性能,最重要的是,對Python開發(fā)者而言,Rust比C語言更容易學(xué)習(xí)。
接下來說說我對這門語言優(yōu)點的看法:
一、多范式
Rust是一門多范式的語言,能夠很好地支持函數(shù)式和面向?qū)ο蟆F洫毺氐暮瘮?shù)聲明方式
??fn 函數(shù)名(參數(shù)列表) -> 返回類型??
這種簡捷的聲明方式就能夠讓人一眼看出這是一個函數(shù)。
在面向?qū)ο蠓矫妫琑ust加入了很多新鮮的概念和思路。比如Trait和Enum類型,其中最吸引我的是Rust中的Enum類型。不管是處理空指針的Opition(Some/None)還是處理錯誤的Result(Ok/Err),這種處理方式都非常的人性化,非常地好讀。而且這種Enum類型對泛型的支持非常好,也真正地能夠解決經(jīng)常出現(xiàn)的內(nèi)存安全問題:如解引用空指針等。
在面向?qū)ο蠓矫孢€必須要提的是基于Trait的Impl體系,這個體系完全取消了構(gòu)造函數(shù),轉(zhuǎn)而使用戶自定義。在這種情況下,一些之前傳統(tǒng)的構(gòu)造函數(shù)難以表達的意思,就很好地在函數(shù)名中體現(xiàn)出來。比如一個TimeDuration類,應(yīng)該會有許許多多的構(gòu)造函數(shù),例如from_ms,from_us等,但僅用一個構(gòu)造函數(shù)不僅難以實現(xiàn),更難以讓用戶感知構(gòu)造函數(shù)到底在做什么。
Trait系統(tǒng)我認為是一個類似于標簽的東西。這個類有了某種標簽,它就必須定義這種標簽的行為。比如Add Trait,非常常用。就相當(dāng)于告訴編譯器,這個東西可以去使用+號。在我們寫泛型的函數(shù)或者其他類的時候,就可以很輕松地使用這個Trait去限定參數(shù)的類型,如果沒有Impl Add Trait,編譯器就不允許將其作為參數(shù)。這樣就可以將錯誤暴露在編譯器的檢查之下。
二、錯誤處理
錯誤處理我認為也是非常好的一個環(huán)節(jié)。在沒有定義錯誤處理的行為時,一個函數(shù)會拋出panic。這個panic就相當(dāng)于是沒有被捕獲的錯誤。一般語言中會用??try/catch??這種表達式來捕獲錯誤,但其實可讀性不僅很差,而且完全沒法對錯誤發(fā)生的地方進行預(yù)知。
在Rust中,所有可能出現(xiàn)的函數(shù)都會被打上Result返回值的標簽。這個Result也是一個枚舉泛型類型,但其功能實在是太多了,既能作為正確的返回值,也能承載錯誤信息向上傳遞。這個設(shè)計使得整個Rust中的錯誤查找和處理變得非常舒適。在Rust中,只要一個函數(shù)的返回值是Result,就可以在其中使用??????操作符。?????操作符的作用主要是將Result<T,E>解包成T(也就是默認為正確值),在錯誤傳遞鏈中具有幾乎不可替代的作用。他不僅不會影響整體代碼的可讀性,更是將可能發(fā)生錯誤的位點清晰地標注在代碼之中。
三、強大且規(guī)范的標準庫
C++總是被人詬病的就是其巨大的標準庫。而Rust作為一門新語言,沒有C++承載的那么多歷史使命,自然也就能夠保證其標準庫的設(shè)計風(fēng)格始終一致。
Rust的標準庫幾乎全部按照面向?qū)ο蟮娘L(fēng)格進行設(shè)計。其中使用較多的主要有Vec/Deque/(Hash/BTree)(Set/Map)等等。這些的聲明非常規(guī)范。且都符合同一套API,也就是可以通過同一套成員函數(shù)進行操作。就算是對于內(nèi)置類型,也就是primitive types,標準庫都有非常多數(shù)學(xué)和二進制函數(shù)的支持,比如count_ones()就可以計算一個數(shù)二進制位中所有的1的個數(shù),a.max(b)就可以取兩個數(shù)中的最大值。這種全部面向?qū)ο蟮牟僮饕矠殒準秸{(diào)用提供了空間。
如果想在C/C++中求三個數(shù)字的最大值,一般都會如下寫
res = max(max(a, b), c);
但在Rust中,一般如下寫
res = a
.max(b)
.max(c);
這樣在長的時候就非常易讀。采用這種設(shè)計的還有Iterator Trait,也就是基本上所有容器都聲明了該Trait。配合Lambda表達式和map函數(shù)能夠很好地處理鏈式操作。
四、宏
作為一個偏底層的語言,宏是必不可少的一項。但例如C/C++這種基于簡單字符串替換的宏就帶來了很多不安全不穩(wěn)定的因素。Rust推出了過程宏作為解決方案,使得宏可以按照值和表達式來進行捕獲,大大提高了宏的能力。在Rust中,宏一般具有特殊的使用標記——感嘆號,可以讓調(diào)用者明確該出調(diào)用的是一個宏而不是一個普通的函數(shù)。
過程宏分為屬性宏派生宏和函數(shù)式宏。函數(shù)式宏表現(xiàn)得像普通的函數(shù),并且可以具有可變參數(shù),派生宏和屬性宏則可以作用在過程和類之前,表現(xiàn)得像python里的裝飾器。
// 函數(shù)式宏的用法
let v = vec![1, 2, 3];
println!("{}", 3);
dbg!(v);
五、現(xiàn)代的包管理體系cargo
cargo基本上是Rust工具鏈中不是必要但不可替代的一員。雖然其只是rustc的一層封裝,但是在包管理上,Rust基本上是我目前使用過所有語言的第一梯隊。C/C++幾乎沒有包管理可言,大家的工具都不成熟,裝庫更是只能靠手動make,非常原始。Rust作為新生代語言當(dāng)然接入了網(wǎng)絡(luò)庫,只需要在Cargo.toml里寫配置就可以自動下載自動編譯,非常地高效和便捷。還有rustup作為工具鏈管理,可以非常方便地跨平臺編譯。
六、總結(jié)
到此這篇關(guān)于Rust語言和C/C++區(qū)別對比,Rust和C語言哪個好的文章就介紹到這了,更多相關(guān)Rust語言和C/C++區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust并發(fā)編程之使用消息傳遞進行線程間數(shù)據(jù)共享方式
文章介紹了Rust中的通道(channel)概念,包括通道的基本概念、創(chuàng)建并使用通道、通道與所有權(quán)、發(fā)送多個消息以及多發(fā)送端,通道提供了一種線程間安全的通信機制,通過所有權(quán)規(guī)則確保數(shù)據(jù)安全,并且支持多生產(chǎn)者單消費者架構(gòu)2025-02-02