rust中的c語言,c++和rust

本文目錄一覽:

北大青鳥設計培訓:C語言編程技術的優勢和劣勢?

隨著互聯網編程技術的不斷發展,現在大多數的軟體開發都是通過編程語言來實現的,今天我們就一起來了解一下C語言編程開發技術都有哪些優勢和劣勢。

C語言的一些好的體驗一次通過閱讀POV-Ray源代碼學會如何在C語言中實現面向對象編程。

通過閱讀GTK+源代碼了解C語言代碼的清晰、乾淨和可維護性。

通過閱讀SIOD和Guile的源代碼,知道如何使用C語言實現Scheme解析器。

使用C語言寫出GNOMEEye的初始版本,並對MicroTile渲染進行調優。

C語言的一些不好的體驗在Evolution團隊時,很多東西老是崩潰。

那個時候還沒有Valgrind,為了得到Purify這個軟體,需要購買一台Solaris機器。

調試gnome-vfs線程死鎖問題。

調試Mesa,卻無果。

接手Nautilus-share的初始版本,卻發現代碼裡面居然沒有使用free()。

想要重構代碼,卻不知道該如何管理好內存。

想要打包代碼,卻發現到處是全局變數,而且沒有靜態函數。

但不管怎樣,還是來說說那些Rust里有但C語言里沒有的東西吧。

自動資源管理Rust從C++那裡借鑒了一些想法,如RAII(ResourceAcquisitionIsInitialization,資源獲取即初始化)和智能指針,並加入了值的單一所有權原則,還提供了自動化的決策性資源管理機制。

自動化:不需要手動調用free()。

內存使用完後會自動釋放,文件使用完後會自動關閉,互斥鎖在作用域之外會自動釋放。

如果要封裝外部資源,基本上只要實現Drop這個trait就可以了。

封裝過的資源就像是編程語言的一部分,因為你不需要去管理它的生命周期。

決策性:資源被創建(內存分配、初始化、打開文件等),然後在作用域之外被銷毀。

根本不存在垃圾收集這回事:代碼執行完就都結束了。

程序數據的生命周期看起來就像是函數調用樹。

如果在寫代碼時老是忘記調用這些方法(free/close/destroy),或者發現以前寫的代碼已經忘記調用,甚至錯誤地調用,那麼以後我再也不想使用這些方法了。

泛型Vec真的就是元素T的vector,而不只是對象指針的數組。

在經過編譯之後,它只能用來存放類型T的對象。

在C語言里需要些很多代碼才能實現類似的功能,所以我不想再這麼幹了。

trait不只是interfaceRust並不是一門類似那樣的面向對象編程語言,它有trait,看起來就像是里的interface——可以用來實現動態綁定。

如果一個對象實現了Drawable,那麼就可以肯定該對象帶有draw()方法。

不過不管怎樣,trait的威力可不止這些。

依賴管理以前實現依賴管理需要:手動調用或通過自動化工具宏來調用g-config。

指定頭文件和庫文件路徑。

基本上需要人為確保安裝了正確版本的庫文件。

而在Rust里,只需要編寫一個Cargo.toml文件,然後在文件里指明依賴庫的版本。

這些依賴庫會被自動下載下來,或者從某個指定的地方獲取。

測試C語言的單元測試非常困難,原因如下:內部函數通常都是靜態的。

也就是說,它們無法被外部文件調用。

測試程序需要使用#include指令把源文件包含進來,或者使用#ifdefs在測試過程中移除這些靜態函數。

需要編寫Makefile文件將測試程序鏈接到其中的部分依賴庫或部分代碼。

需要使用測試框架,並把測試用例註冊到框架上,還要學會如何使用這些框架。

衛生宏(HygienicMacro)Rust的衛生宏避免了C語言宏可能存在的問題,比如宏中的一些東西會掩蓋掉代碼里的標識符。

Rust並不要求宏中所有的符號都必須使用括弧,比如max(5+3,4)。

沒有自動轉型在C語言里,杭州北大青鳥發現很多bug都是因為在無意中將int轉成short或char而導致,而在Rust里就不會出現這種情況,因為它要求顯示轉型。

不會出現整型溢出這個就不用再多作解釋了。

rust是前端還是後端

後端。

Rust是一款高級通用語言,而且屬於少有的一款兼顧開發和執行效率的編程語言。Rust結合了腳本語言的語法結構和C語言編譯執行效率,並且具有類似垃圾回收和數據類型及所有權系統等功能,所以可靠性和高性能運行都屬於Rust的特色。

雖然是一個非常年輕的編程語言,但是Rust可以算是最近幾年最流行的編程語言。5月發布的Stack Overflow 2020開發者調查中,Rust被86.1%開發者選擇為「最喜歡」的編程語言,比第二名TypeScript高出近20%。

雖然Rust並不是一個專屬的網路應用開發語言,但是作為一個以安全著稱的編輯語言,實際上是非常適合網路開發的。而且因為是編譯型語言,編譯器也能在過程中就安全穩定的問題作出提醒,作為後端網路開發還是不錯的一個優勢。

Rust的通用庫中已經包含了類似TcpListener這樣的網路通訊庫,可以直接通過調用std : : net 下面的TcpListener來直接監聽Tcp埠,然後再處理Request。這點上與一些腳本型的編程語言比要自由得很多。

Rust作為比較流行的編程語言,也有不少第三方HTTP庫來支持Web開發,可以不用再花時間從底層開發,比較熱門的庫像Hyper或者Tide都是被不少Web開發框架用到的。Rust下Web開發框架也不少,比較熱門的有Rocket、Actix-Web、Tower-web、Warp等等框架。

我們為什麼用Rust?

Rust 是一門系統級編程語言,被設計為保證內存和線程安全,防止段錯誤產生。作為系統級編程語言,它的基本理念是 「零開銷抽象」。理論上來說,它的速度與 C/C++ 同級。Rust 可以被歸為通用的、多範式、編譯型的編程語言,類似 C/C++。與這兩門編程語言不同的是,Rust 是線程安全的!Rust 編程語言的目標是,創建一個安全和並發的軟體系統。它強調安全性、並發和內存控制。儘管 Rust 借用了 C/C++ 的語法,卻杜絕了空指針和懸掛指針,而這二者是 C/C++ 中系統崩潰、內存泄露和不安全代碼的根源。

雖然 Rust 是一門系統級編程語言,但並不意味著它只能寫底層程序(操作系統、驅動、工具、資料庫、搜索引擎等),它的抽象層次之高完全給人驚艷的感覺,實踐證明它對問題建模的能力和方便性不比 C++/Java/Python/Ruby 差。但 Haskell 這類超高抽象語言,也不是 Rust 的發展方向。Rust 力求在抽象與現實世界中找到一個平衡。

在向SCRY 項目研發負責人Peace交流時,他說到,當時選擇Rust,主要有兩個原因:一是有高性能要求時,原來好多人會選擇C/C++,現在多了一個Rust選擇,還解決了C/C++許多不足;二是Rust應用在區塊鏈有成熟的參考。最後Peace給了未來使用SCRY項目開源部分的學習者一些建議,「快速的學習能力,快樂地把小事做好,正確合理定義一個函數。」

Rust到底有多受歡迎呢?目前,Rust 已經在 StackOverflow 的年度語言評選中,連續 4 年榮獲「程序員最喜愛語言」第一名(2016, 2017, 2018, 2019)。以下是 2019 年調查的截圖:

但比起Python、C、C++ 等,Rust還只是個小年輕。調查顯示,更多的人不去學習 Rust 還是因為 Rust 沒有足夠的活躍商業項目讓它成為企業的一部分。

不過,Rust 在工作中的佔比也越來越高。過去一年間,Rust 在商業應用上有著令人驚訝的成長。下面是部分人們熟知的公司:

國內的百度,阿里,也已經在內部小範圍的使用上了Rust。

就在本月初,微軟還推出了基於 Rust 的 Windows 運行時項目 Rust/WinRT。該項目和 C++/WinRT 一脈相承,用標準語言和編譯器為 Windows 運行時構建語言投影,從而方便 Rust 開發人員調用 Windows API,更輕鬆地使用 Rust 構建各類 Windows 應用和組件。

()

2015年下半年,Gavin Wood 博士創立了 Parity Technologies,推出以太坊(Ethereum)客戶端 parity,而這個 parity 客戶端就是使用Rust寫的。實際在 parity 出現之前,MaidSafe項目就已經出現了。MaidSafe用 Rust 語言嘗試了很多東西。Rust語言本身強調的安全性以及MaidSafe這些前沿項目,可能給了 Gavin 充分的理由選擇 Rust 作為 parity 開發語言。

寫一個有效率的、符合習慣的Rust程序比寫一個有潛在危險的程序容易得多。下面是Linux內核在2018年一月到四月期間發現的bug:

而對於Rust而言,上圖右側佔比 51% 的部分,從語言層面就可以避免。也就是說,對Rust來說,根本不存在上圖右邊這些問題。

Rust在實現內存安全和並發安全的同時,並沒有以損失性能為代價。更牛逼的是,它甚至是用同一套抽象解決了內存安全和數據競爭這兩個不同領域的問題。

Rust的零開銷抽象讓你在享受安全性的同時,又不損失性能。這正是傳統的程序員夢寐以求的。

Solana的首席執行官Anatoly Yakovenko在一段採訪中提到剛開始項目的時候,他用了兩周時間使用C語言,但是當用到一些外部庫的時候,還得寫makefile,手動下載這些庫,比較麻煩。所以,他決定嘗試一下Rust。就在那一刻,「Holy shit, this is amazing.」「我才覺醒到,這是一個和C語言一樣快的語言,並且還給了我Haskell般的類型安全。Rust擊中了我,這真的很酷。」

今天Rust滿5歲了(2020年5月15日,是Rust語言正式發布5年生日)。Rust語言正在IT工業各個領域快速發展,而由於區塊鏈本身的特質,區塊鏈領域是較早接納Rust的領域之一。在區塊鏈領域,Rust正以勢如破竹之勢佔領區塊鏈新興項目市場,很多著名的老項目也在考慮轉向使用Rust重寫。

祝Rust 5周年生日快樂!

參考:

1. Why Rust?

2. Meetup with Solana, Zcash, Parity — Why Rust Is Ideal For Blockchain Development?

3. Rust 2017 Survey Results

4. 微軟開源 Rust/WinRT,方便使用 Rust 構建 Windows 應用

5. Stack Overflow』s Developer Survey Results 2019

6. 當區塊鏈遇上Rust

Rust標準庫之——&str類型

str類型是rust中最基本的字元串類型,聲明一個str類型的變數很簡單:

我們可以列印出上述定義中變數 s 的類型:

在 rust-playground 中使用nightly版本編譯:

關於 str和str標準庫文檔是如此說明的:

通俗理解, str 類型是字元串切片類型,是rust中最基本的字元串類型,但是我們見的更多的是它的借用類型(引用值),也就是 str ,最直觀的例子就是擁有靜態生命周期 ‘static 的字元串字面量。

另有 《Why Rust?》中給出的示例:

即:

因此在rust中 str 類型為: 靜態內存分配字元串的引用

Rust中切片類型表示為 [T] ,它表示無法在編譯期確定大小的同一種類型數據的連續內存序列 [T] 的 視圖 ,它在內存中的管理是基於 Repr union 來實現的, [T] 即指向 [T] 類型的指針,這個指針在最底層是通過稱為胖指針( FatPtr )的結構體來模擬的:

在內存布局(memory layout)上, 切片變數和 FatPtr 類型的變數共享同一片內存空間,而FatPtr中則保存了”切片”的必要特徵:

而藉助於Rust類型系統的優勢,標準庫在 [T] 類型上定義的方法和trait則完全封裝了底層負責解釋指針含義的工作(這部分解釋工作需要依賴unsafe rust來實現)。

如標準庫實現的len方法:

查看標準庫對於 str 類型的實現:

我們知道, str 類型變數可以通過調用 len 方法獲取字元串中的位元組個數,查看 len 函數的定義可以發現,其內部是調用了 as_bytes 方法實現的; as_bytes 方法中定義了一個union類型 Slices ,並且聲明為和C語言的內存布局一致( #[repr(C)] ):

熟悉union的同學不難發現, str 和 [u8] 的內存布局是一樣的,從而 str 是 [T] 當 T=u8 時的特例!而 len 方法不過是調用了 [u8] 的 len 方法而已。

字元串切片類型總是合法的 utf-8 位元組序列。

其中 run_utf8_validation(v) 做了必要的utf-8位元組序列的合法性檢測,若不符合utf-8規範,則拋出Error。

思考下面的例子:

其中 s的類型是 str ,那麼s是怎麼調用定義在 str 類型上的方法 len 的呢?

是因為標準庫已經為我們對任意類型 T 實現了 Deref trait:

而實現了Deref trait的類型,編譯器會在適當的地方對變數進行足夠多的解引用以使變數的類型轉變為 T 。

由於 deref 函數獲取的變數 self 是不可變引用:

因此保證了由編譯器來進行解引用總是安全的。

rust為什麼在中國不火

rust在中國不火的原因有以下幾點:

1、Rust的學習曲線和互操作性有待提高。對於用戶來說,生產力是工作的重要目標,成熟度決定了Rust的吸引力。rust顯然還不夠成熟。

2、Rust在安全性、可靠性和性能上碾壓所有C語言,唯一的缺點就是門檻高。圈內只有B族飛書被互聯網用於工業生產。可以說,能通過編譯的c++運行異常率取決於編寫人員的水平,但是可以通過編譯的,新手寫的rust基本可以保證運行流暢(設計上可能會有缺陷,但這和語言水平無關)。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/272186.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 00:08
下一篇 2024-12-17 13:55

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Rust面試指南

    本篇文章將圍繞Rust面試的熱點問題,從多個方面展開詳細解答。 一、Rust語言的基礎 Rust是一門系統編程語言,主要關注安全、並發和性能。下面將就Rust語言的基本知識點展開解…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論