国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Rust 的獨(dú)特之處不只內(nèi)存安全:來(lái)自自主機(jī)器人的啟示

0
分享至


作者 | Andy Brinkmeyer

譯者 | 平川

在過(guò)去的幾年里,我一直從事自主移動(dòng)機(jī)器人領(lǐng)域的研究,本文中的許多示例就源自該領(lǐng)域。我寫這篇文章是為了探討一下,除了眾所周知的內(nèi)存安全保障之外,Rust 還有哪些獨(dú)特之處。具體來(lái)說(shuō),就是該語(yǔ)言如何幫助開發(fā)者從一開始就編寫出更正確的軟件,不犯常見的錯(cuò)誤,使生成的代碼有更強(qiáng)的防錯(cuò)能力。

不只是內(nèi)存安全

在我與開發(fā)者們討論 Rust 時(shí),一個(gè)常見的情況是:那些沒(méi)有投入大量時(shí)間研究這門語(yǔ)言的人往往會(huì)對(duì)其嗤之以鼻,而這通常發(fā)生在短暫且不成功的首次嘗試之后。然而,根據(jù)我的經(jīng)驗(yàn),那些能夠克服初期學(xué)習(xí)曲線并將其應(yīng)用于實(shí)際項(xiàng)目的開發(fā)者,往往會(huì)對(duì) Rust 非常欣賞。我至今仍然記得,兩年半以前,當(dāng)我們要啟動(dòng)一個(gè)大型的新項(xiàng)目時(shí),將有不同編程語(yǔ)言背景的人聚集到一起在一個(gè)純 Rust 代碼庫(kù)上進(jìn)行開發(fā)的情景。

其中有一位 C++ 背景的同事,最初兩周每天都在向我抱怨。但大約三四周后,情況發(fā)生了轉(zhuǎn)變。他開始真正喜歡上了這門語(yǔ)言,現(xiàn)在甚至表示再也不想回頭了。

這個(gè)例子或許能說(shuō)明,為什么 Rust 在 Stack Overflow 的調(diào)查中始終名列最受歡迎的編程語(yǔ)言之首。雖然毫無(wú)疑問(wèn),內(nèi)存安全性非常重要,而且我在自己的項(xiàng)目中也受益匪淺,但這還不是全部原因。Rust 讓編寫從一開始就正確的軟件變得容易許多,它能有效降低開發(fā)者引入錯(cuò)誤的可能性,而且生成的代碼在出現(xiàn)故障時(shí)會(huì)表現(xiàn)出更強(qiáng)的韌性。

內(nèi)核簡(jiǎn)單

從本質(zhì)上講,Rust 是一種相對(duì)比較簡(jiǎn)單的語(yǔ)言。人們普遍認(rèn)為, Rust 極難,學(xué)習(xí)曲線非常陡峭。這種看法雖然有一定的道理,但仔細(xì)考察其基本概念就會(huì)發(fā)現(xiàn),該語(yǔ)言的核心在于數(shù)據(jù)類型以及操作這些數(shù)據(jù)類型的函數(shù)。其他語(yǔ)言中許多會(huì)增加復(fù)雜性的概念在 Rust 中根本不存在:沒(méi)有垃圾回收、沒(méi)有類、沒(méi)有繼承、沒(méi)有傳統(tǒng)的面向?qū)ο缶幊?、沒(méi)有空指針、沒(méi)有函數(shù)重載,也沒(méi)有類型強(qiáng)制轉(zhuǎn)換。這種極簡(jiǎn)主義的設(shè)計(jì)理念,使得一些開發(fā)者將 Rust 的使用體驗(yàn)比作 C 語(yǔ)言,或者更新的 Zig 語(yǔ)言。

枚舉:不只是整數(shù)

Rust 中的枚舉與其他語(yǔ)言中的枚舉有著根本性的區(qū)別,因?yàn)槊杜e變體可以存儲(chǔ)數(shù)據(jù)。枚舉的每個(gè)變體可以存儲(chǔ)與其他變體不同的特定數(shù)據(jù),也可以完全不存儲(chǔ)任何數(shù)據(jù)。這一概念類似于 TypeScript 中的帶標(biāo)簽聯(lián)合體,但在 Rust 中,它作為一項(xiàng)統(tǒng)一的一等語(yǔ)言特性而存在。

模式匹配與窮盡性

要訪問(wèn)枚舉中的數(shù)據(jù),開發(fā)者必須使用和其他語(yǔ)言中 switch 語(yǔ)句類似的結(jié)構(gòu)來(lái)匹配該枚舉。通過(guò)匹配表達(dá)式,可以檢查枚舉值實(shí)際屬于哪個(gè)變體,并執(zhí)行相應(yīng)的邏輯。關(guān)鍵在于,在特定的匹配分支內(nèi),編譯器僅允許訪問(wèn)該變體關(guān)聯(lián)的數(shù)據(jù)。匹配必須窮盡,也就是說(shuō)必須顯式處理每個(gè)變體,或者通過(guò)通配模式進(jìn)行處理,以防止開發(fā)者無(wú)意中遺漏了某個(gè)情況的處理。

可選數(shù)據(jù)建模

在軟件系統(tǒng)中,可選數(shù)據(jù)無(wú)處不在。許多編程語(yǔ)言通過(guò)空指針、nil 值或?qū)iT的標(biāo)準(zhǔn)庫(kù)類型來(lái)實(shí)現(xiàn)這一概念。在 Rust 中,可選數(shù)據(jù)通過(guò) Option 類型來(lái)實(shí)現(xiàn),這是一個(gè)定義在標(biāo)準(zhǔn)庫(kù)中的簡(jiǎn)單枚舉類型,任何開發(fā)者都能在一分鐘內(nèi)實(shí)現(xiàn)它。Option 枚舉有兩種變體:None(不包含數(shù)據(jù))和 Some(T)(封裝一個(gè)泛型值)。

}

得益于枚舉的數(shù)據(jù)訪問(wèn)規(guī)則,可選數(shù)據(jù)被保護(hù)了起來(lái),避免了意外訪問(wèn)。例如,在我的機(jī)器人研究工作中,機(jī)器人可能處于執(zhí)行任務(wù)狀態(tài),也可能處于空閑狀態(tài)。若使用 Option 來(lái)建模這種行為,則在訪問(wèn)任務(wù)數(shù)據(jù)之前必須對(duì)值進(jìn)行匹配,以確保代碼僅對(duì)實(shí)際存在的任務(wù)進(jìn)行操作。

使用枚舉實(shí)現(xiàn)狀態(tài)機(jī)

狀態(tài)管理在軟件開發(fā)中無(wú)處不在。Rust 提供了一種直觀的方法,即使用枚舉來(lái)進(jìn)行狀態(tài)建模,其中每個(gè)變體代表一種狀態(tài),并封裝了與該狀態(tài)相關(guān)的數(shù)據(jù)。對(duì)于機(jī)器人而言,其狀態(tài)可能包括 Uninitialized(意識(shí)到機(jī)器人的存在)、Initialized(已知位置)以及 ExecutingJob(同時(shí)擁有位置和任務(wù)信息)。

}

這種方法提供了雙向保護(hù):數(shù)據(jù)處于錯(cuò)誤狀態(tài)時(shí)受到保護(hù),可防止意外訪問(wèn);而要轉(zhuǎn)換到新狀態(tài)時(shí),必須提供必要的數(shù)據(jù),這樣就不會(huì)構(gòu)建出無(wú)效的狀態(tài)。編譯器會(huì)自動(dòng)強(qiáng)制執(zhí)行這些約束。

所有權(quán):只能有一個(gè)

所有權(quán)是 Rust 中的一個(gè)核心概念,在其他主流語(yǔ)言中沒(méi)有與之直接對(duì)應(yīng)的概念。其規(guī)則非常簡(jiǎn)單:在任何時(shí)候,Rust 中的每個(gè)值都只有一個(gè)所有者,不多也不少。編譯器會(huì)在編譯時(shí)通過(guò)靜態(tài)分析來(lái)強(qiáng)制執(zhí)行這條規(guī)則。

生命周期管理

Rust 能夠精確追蹤值的生命周期,因?yàn)樗袡?quán)明確標(biāo)識(shí)了每個(gè)值的所有者,以及所有權(quán)何時(shí)超出作用域。當(dāng)所有者超出作用域時(shí),它所擁有的值會(huì)被丟棄,內(nèi)存會(huì)被釋放,其他資源也會(huì)被釋放。

所有權(quán)轉(zhuǎn)移

所有權(quán)可以通過(guò)賦值或函數(shù)調(diào)用進(jìn)行轉(zhuǎn)移或“移動(dòng)”。當(dāng)數(shù)據(jù)被移動(dòng)時(shí),所有權(quán)會(huì)從原始所有者轉(zhuǎn)移到新所有者。原始所有者將無(wú)法再訪問(wèn)該值。這種機(jī)制可以防止我所說(shuō)的“雙重使用”情況,即本應(yīng)唯一存在的實(shí)體被意外地多次使用。

let x = y // 所有權(quán)從 y 移動(dòng)到 x

在機(jī)器人系統(tǒng)中,一個(gè)任務(wù)每次只能由一個(gè)機(jī)器人執(zhí)行一次。假設(shè)有一個(gè)函數(shù)簽名,其中有一個(gè) job 參數(shù)按值傳遞一個(gè) Job 對(duì)象;換言之,該函數(shù)獲得了該任務(wù)的所有權(quán)。當(dāng)把任務(wù)分配給機(jī)器人時(shí),所有權(quán)便從調(diào)用代碼轉(zhuǎn)移到了函數(shù)中。

嘗試將同一個(gè)任務(wù)分配給兩個(gè)不同的機(jī)器人會(huì)引發(fā)編譯時(shí)錯(cuò)誤,因?yàn)榈谝淮钨x值操作已將所有權(quán)從原始變量轉(zhuǎn)移了出去。所有權(quán)轉(zhuǎn)移就是這樣在編譯時(shí)優(yōu)雅地防止了重復(fù)使用。

error[E0382]: use of moved value: `new_job`

資源管理不限于內(nèi)存

值的生命周期不僅能管理內(nèi)存。通過(guò) Drop trait 掛接 drop 事件,可以為超出作用域的值編寫自定義行為。在機(jī)器人領(lǐng)域,像狹窄的走廊這樣的物理空間可能一次只允許存在一臺(tái)機(jī)器人。ZoneAccess 令牌類型可以表示進(jìn)入此類區(qū)域的權(quán)限。由于 ZoneAccess 既不能被復(fù)制也不能被克隆,因此同一時(shí)間只能存在一個(gè)令牌。

}

通過(guò)為 ZoneAccess 實(shí)現(xiàn) Drop 來(lái)自動(dòng)釋放該區(qū)域,便無(wú)需手動(dòng)處理所有可能需要釋放該區(qū)域的代碼路徑,例如機(jī)器人斷開連接、狀態(tài)變更或其他任何場(chǎng)景。當(dāng)擁有 ZoneAccess 的機(jī)器人超出作用域時(shí),令牌也會(huì)隨之超出作用域,資源隨之釋放。這種模式能夠自動(dòng)防止所有代碼路徑中的資源泄漏,從而極大地簡(jiǎn)化除內(nèi)存之外的實(shí)際資源的管理。

借用:安全地引用數(shù)據(jù)

如果數(shù)據(jù)只能被擁有,那么語(yǔ)言的功能將受到極大的限制。借用提供了一種在不擁有數(shù)據(jù)所有權(quán)的情況下安全地引用數(shù)據(jù)的方式。借用規(guī)則規(guī)定,在任何給定的時(shí)刻,一個(gè)值可以存在一個(gè)可變引用,或者存在任意數(shù)量的不可變引用,但不能同時(shí)存在這兩種引用。

let x = &y;

這條規(guī)則對(duì)于內(nèi)存安全來(lái)說(shuō)至關(guān)重要,因?yàn)樗硕鄠€(gè)代碼位置訪問(wèn)同一變量時(shí)可能引發(fā)的數(shù)據(jù)競(jìng)爭(zhēng)??勺兘栌迷试S修改底層數(shù)據(jù);不可變借用僅允許讀取它。重要的是,借用不會(huì)轉(zhuǎn)移所有權(quán):只要引用存在,原始所有者仍保留所有權(quán)。

生命周期:這個(gè)數(shù)據(jù)是否還可以安全地使用?

生命周期與借用機(jī)制協(xié)同工作,用于判斷在程序執(zhí)行的某個(gè)特定時(shí)刻,借用是否仍然有效。引用的生命周期不能超過(guò)其所引用的值的生命周期;這條規(guī)則對(duì)于內(nèi)存安全來(lái)說(shuō)至關(guān)重要,因?yàn)樗芊乐怪当会尫藕笕詫?duì)其進(jìn)行引用。

可變生命周期從創(chuàng)建時(shí)開始,到銷毀時(shí)結(jié)束。編譯器利用這些信息進(jìn)行生命周期檢查。大多數(shù)情況下,無(wú)需顯式標(biāo)注生命周期,因?yàn)榫幾g器會(huì)自動(dòng)推斷出來(lái)。但在某些情況下,則需要顯式標(biāo)注,例如使用 'a 這樣的語(yǔ)法來(lái)表示命名生命周期。

將協(xié)議嵌入類型

將所有權(quán)、借用和生命周期結(jié)合使用,可以實(shí)現(xiàn)一種特別有趣的功能:在編譯時(shí)將運(yùn)行時(shí)協(xié)議嵌入到類型中。Rust 的主要序列化庫(kù) Serde 便是一個(gè)極具說(shuō)服力的例子。

}

序列化器模式

假設(shè)有一個(gè)用于序列化單個(gè)值的序列化器類型。該 Serializer 實(shí)現(xiàn)了針對(duì)各種值類型(整數(shù)、浮點(diǎn)數(shù)、枚舉和結(jié)構(gòu)體)的方法。serialize_struct 函數(shù)接受按值傳遞的 self,這意味著它會(huì)消耗該序列化器實(shí)例。調(diào)用此函數(shù)后,原始序列化器將無(wú)法再次訪問(wèn)。該函數(shù)返回一個(gè) SerializeStruct,它是從通用序列化器轉(zhuǎn)換而來(lái)的一個(gè)序列化器,專門用于結(jié)構(gòu)體序列化。

}

SerializeStruct 類型實(shí)現(xiàn)了兩個(gè)方法:erialize_field 方法接受 self 的不可變引用,可針對(duì)多個(gè)字段反復(fù)調(diào)用;end 方法則用于結(jié)束序列化過(guò)程。end 函數(shù)承擔(dān)著重要的職責(zé),它可能會(huì)在 JSON 中寫入一個(gè)閉合大括號(hào),或計(jì)算包含結(jié)構(gòu)體字節(jié)大小的文件頭。許多序列化庫(kù)的文檔都會(huì)警告用戶,不要在調(diào)用 end 之后再調(diào)用其他序列化函數(shù),因?yàn)榇祟愡`規(guī)操作可能會(huì)導(dǎo)致程序崩潰或運(yùn)行時(shí)錯(cuò)誤。

在 Rust 中,這個(gè)警告是多余的,因?yàn)?end 函數(shù)會(huì)消耗 self。結(jié)構(gòu)體序列化器的所有權(quán)會(huì)轉(zhuǎn)移到 end 函數(shù)中,在那里它會(huì)被釋放且無(wú)法再次被使用。在 end 之后,嘗試調(diào)用序列化器的方法會(huì)引發(fā)編譯時(shí)錯(cuò)誤:“借用了已移動(dòng)的值”。這一特性在編譯時(shí)就消除了一整類的開發(fā)錯(cuò)誤,從而節(jié)省了原本必須進(jìn)行的大量的錯(cuò)誤處理工作。

通過(guò) Mutex 實(shí)現(xiàn)真正的受保護(hù)訪問(wèn)

另一個(gè)強(qiáng)有力的例子涉及通過(guò)互斥鎖(mutex)對(duì)共享數(shù)據(jù)訪問(wèn)進(jìn)行建模。傳統(tǒng)方法將受保護(hù)的數(shù)據(jù)和互斥鎖視為互相獨(dú)立的實(shí)體,依賴開發(fā)者的自律,需要他們?cè)谠L問(wèn)數(shù)據(jù)前先鎖定互斥鎖。Rust 則采取了一種更穩(wěn)健的方法。

基于所有權(quán)的保護(hù)

Mutex::new 方法按值傳遞數(shù)據(jù),這意味著數(shù)據(jù)會(huì)被移入互斥鎖中。數(shù)據(jù)的所有權(quán)發(fā)生轉(zhuǎn)移,在互斥鎖外部將無(wú)法再訪問(wèn)該數(shù)據(jù)。加鎖成功時(shí),它會(huì)返回一個(gè) MutexGuard,其生命周期與互斥鎖本身綁定;該鎖守衛(wèi)的生命周期不會(huì)超過(guò)互斥鎖。

pub struct MutexGuard<'a, T: ?Sized + 'a> {}

訪問(wèn)受保護(hù)的數(shù)據(jù)需要解引用鎖守衛(wèi),該操作會(huì)返回一個(gè)引用。其生命周期與鎖守衛(wèi)的生命周期綁定,而鎖守衛(wèi)的生命周期又與互斥鎖的生命周期綁定。當(dāng) MutexGuard 被釋放時(shí),它會(huì)解鎖互斥鎖。

drop(guard);

這些特性相結(jié)合可以提供一個(gè)強(qiáng)有力的保證:在移除鎖守衛(wèi)之后,對(duì)受保護(hù)數(shù)據(jù)的引用將不復(fù)存在;而且,由于移除鎖守衛(wèi)會(huì)解鎖互斥鎖,所以在未持有鎖的情況下,將無(wú)法持有或使用對(duì)受保護(hù)數(shù)據(jù)的引用。

根據(jù)我處理重度多線程代碼的經(jīng)驗(yàn),我見過(guò)許多這樣的情況:開發(fā)者無(wú)意中持有引用,在代碼中傳遞這些引用,隨后卻將其遺忘,然后解鎖互斥鎖,從而引發(fā)難以察覺的并發(fā)錯(cuò)誤。Rust 的設(shè)計(jì)方法徹底消除了這類錯(cuò)誤。

泛型:強(qiáng)大的占位符

Rust 中的泛型是“占位符”,不同的具體類型可以重復(fù)使用其定義。Option 類型和類似 Vec 這樣的集合都體現(xiàn)了這種模式,即只需實(shí)現(xiàn)一次邏輯,就可以用于任何類型。泛型會(huì)在編譯時(shí)通過(guò)單態(tài)化進(jìn)行替換,針對(duì)每種類型特化生成特定的代碼。這種代碼消除了運(yùn)行時(shí)開銷,使得泛型代碼與為具體類型編寫的代碼一樣快。

泛型可以通過(guò) trait(定義必需的行為)和生命周期進(jìn)行約束,從而支持復(fù)雜的類型級(jí)編程。

結(jié)合泛型與類型安全的狀態(tài)機(jī)

雖然枚舉提供了一種直觀的狀態(tài)建模方式,但在某些情況下,另一種模式會(huì)更實(shí)用,例如“類型狀態(tài)”模式,它能在編譯時(shí)將狀態(tài)信息編碼到類型系統(tǒng)中。

將狀態(tài)編碼為類型

考慮三種表示機(jī)器人狀態(tài)類型:Uninit(空的、大小為零的標(biāo)記類型)、Init(包含位置數(shù)據(jù))和 ExecutingJob(包含位置和任務(wù)數(shù)據(jù))。這些類型與之前的枚舉變體相對(duì)應(yīng),不過(guò)現(xiàn)在是作為獨(dú)立的類型存在。

一個(gè)針對(duì)狀態(tài) S 的 Robot 類型的泛型,既能嵌入特定于狀態(tài)的數(shù)據(jù),又能保留機(jī)器人名稱等通用數(shù)據(jù)。實(shí)現(xiàn)塊可以針對(duì)泛型機(jī)器人(用于訪問(wèn)名稱等與狀態(tài)無(wú)關(guān)的功能),也可以針對(duì)特定的類型,例如 Robot 。

}

類型安全的狀態(tài)轉(zhuǎn)換

狀態(tài)轉(zhuǎn)換在具體類型上表現(xiàn)為方法實(shí)現(xiàn)。Robot 上的 init 函數(shù)獲取 self 的所有權(quán),接收位置數(shù)據(jù),并返回 Robot 。同樣,Robot 可以轉(zhuǎn)換為 Robot 。

位置訪問(wèn)僅可針對(duì)保證位置可用的狀態(tài) Robot 和 Robot 實(shí)現(xiàn)。若在 Robot 上調(diào)用 position() 方法,將導(dǎo)致編譯時(shí)錯(cuò)誤,并顯示一條提示信息,說(shuō)明哪些類型支持該方法。通過(guò)這種方式進(jìn)行狀態(tài)建模,在訪問(wèn)狀態(tài)相關(guān)的數(shù)據(jù)時(shí)就無(wú)需運(yùn)行時(shí)檢查和錯(cuò)誤處理了。

類型安全的構(gòu)建器

這種模式可以優(yōu)雅地?cái)U(kuò)展到構(gòu)建器上。以需要初始位置和地圖數(shù)據(jù)的 RobotSimulationBuilder 為例。使用 NoPosition、PositionSet、NoMap 和 MapSet 等標(biāo)記類型作為泛型參數(shù),可以實(shí)現(xiàn)構(gòu)建協(xié)議的編譯時(shí)強(qiáng)制檢查。

}

set_position 方法將 RobotSimulationBuilder 轉(zhuǎn)換為 RobotSimulationBuilder 。在這個(gè)類型上,set_position 方法沒(méi)有實(shí)現(xiàn),因此無(wú)法再次調(diào)用。build 方法僅存在于完全配置好的類型上。

這種設(shè)計(jì)避免了耗時(shí)的重復(fù)操作,強(qiáng)制執(zhí)行了必需的配置,并消除了因構(gòu)建器配置不完整而導(dǎo)致的運(yùn)行時(shí)錯(cuò)誤,所有這些驗(yàn)證都是在編譯時(shí)完成的。

健壯性并不一定難以實(shí)現(xiàn)

要實(shí)現(xiàn)讓人充滿信心的軟件仍然是一項(xiàng)富有挑戰(zhàn)性的問(wèn)題,需要嚴(yán)格的流程和昂貴的工具。然而,從實(shí)踐角度來(lái)看,大多數(shù)開發(fā)人員并非在構(gòu)建安全關(guān)鍵型應(yīng)用程序,而只是在開發(fā)那些因用戶依賴而必須可靠的應(yīng)用程序。

Rust 通過(guò)其類型系統(tǒng)實(shí)現(xiàn)了其他語(yǔ)言難以企及的健壯性。所有權(quán)系統(tǒng)、借用規(guī)則、生命周期和泛型相互配合,能夠在編譯時(shí)而非運(yùn)行時(shí)捕獲整類的錯(cuò)誤。

小 結(jié)

我認(rèn)為,Rust 所提供的價(jià)值主張遠(yuǎn)不止于其廣為人知的內(nèi)存安全特性。通過(guò)所有權(quán)、借用、生命周期以及強(qiáng)大的泛型系統(tǒng),開發(fā)者能夠?qū)⒉蛔兞?、協(xié)議和約束直接編碼到類型系統(tǒng)中。在其他語(yǔ)言中可能導(dǎo)致運(yùn)行時(shí)錯(cuò)誤或隱蔽漏洞的問(wèn)題,在 Rust 中會(huì)直接轉(zhuǎn)化為編譯時(shí)錯(cuò)誤,從而使問(wèn)題代碼無(wú)法部署到生產(chǎn)環(huán)境。

機(jī)器人和自主系統(tǒng)示例展示了這些技術(shù)的實(shí)際應(yīng)用:防止對(duì)獨(dú)有資源的雙重使用,在機(jī)器人斷開連接時(shí)自動(dòng)釋放物理區(qū)域,確保正確遵循序列化協(xié)議,以及保證共享數(shù)據(jù)的線程安全訪問(wèn)。

盡管學(xué)習(xí)曲線確實(shí)比較陡峭,但堅(jiān)持下來(lái)的開發(fā)者會(huì)發(fā)現(xiàn),這門語(yǔ)言從根本上改變了他們與正確性之間的關(guān)系。健壯性并不一定難以實(shí)現(xiàn)。根據(jù)我的經(jīng)驗(yàn),Rust 證明了一個(gè)設(shè)計(jì)良好的類型系統(tǒng)能夠捕獲僅靠測(cè)試難以發(fā)現(xiàn)的錯(cuò)誤,從而使那些無(wú)力承擔(dān)形式驗(yàn)證、卻因用戶依賴而必須確保正確運(yùn)行的項(xiàng)目,也能更輕松地開發(fā)出可靠的軟件。

https://www.infoq.com/articles/practical-robustness-going-beyond-memory-safety-rust/

聲明:本文為 InfoQ 翻譯,未經(jīng)許可禁止轉(zhuǎn)載。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
國(guó)乒出征倫敦!新隊(duì)服亮相“三大主父”穿旗袍一程,國(guó)乒再次出發(fā)

國(guó)乒出征倫敦!新隊(duì)服亮相“三大主父”穿旗袍一程,國(guó)乒再次出發(fā)

暖心萌阿菇?jīng)?/span>
2026-04-27 23:52:52
伊朗外長(zhǎng)呼吁建立“不受美國(guó)干預(yù)”的集體安全機(jī)制

伊朗外長(zhǎng)呼吁建立“不受美國(guó)干預(yù)”的集體安全機(jī)制

新京報(bào)
2026-04-26 20:33:09
沒(méi)有俞敏洪東方甄選,他們只值月薪2萬(wàn),一切都是慣的!

沒(méi)有俞敏洪東方甄選,他們只值月薪2萬(wàn),一切都是慣的!

孫洪鶴
2026-04-26 10:16:05
狗仔曝楊子去年和李雋子已結(jié)婚生子,和黃圣依去年一月才官宣離婚

狗仔曝楊子去年和李雋子已結(jié)婚生子,和黃圣依去年一月才官宣離婚

童叔不飆車
2026-04-28 00:55:07
俄羅斯為什么刪除20年法院數(shù)據(jù):審判記錄一夜清空

俄羅斯為什么刪除20年法院數(shù)據(jù):審判記錄一夜清空

律法刑道
2026-04-22 08:53:34
執(zhí)行董事被曝“在美疑涉性侵指控”,知名公司緊急公告

執(zhí)行董事被曝“在美疑涉性侵指控”,知名公司緊急公告

南方都市報(bào)
2026-04-27 14:57:10
華國(guó)鋒題字“為人民服務(wù)”,顏楷風(fēng)格引發(fā)熱議!

華國(guó)鋒題字“為人民服務(wù)”,顏楷風(fēng)格引發(fā)熱議!

書畫相約
2026-04-27 08:26:50
臺(tái)灣女生考上同濟(jì)大學(xué),瞞著家人偷偷來(lái)上海上學(xué),剛下飛機(jī)就落淚

臺(tái)灣女生考上同濟(jì)大學(xué),瞞著家人偷偷來(lái)上海上學(xué),剛下飛機(jī)就落淚

白云故事
2025-07-30 21:25:03
加拿大總理卡尼:國(guó)家主權(quán)財(cái)富基金初始資金為250億加元

加拿大總理卡尼:國(guó)家主權(quán)財(cái)富基金初始資金為250億加元

財(cái)聯(lián)社
2026-04-27 21:23:57
沈伯洋是民進(jìn)黨“最強(qiáng)王牌”?柯文哲諷:是沒(méi)其他人可以派嗎

沈伯洋是民進(jìn)黨“最強(qiáng)王牌”?柯文哲諷:是沒(méi)其他人可以派嗎

海峽導(dǎo)報(bào)社
2026-04-26 16:53:02
故事:聶磊稱霸青島十幾年,最后因惹上一個(gè)女人,踢到鐵板就此滅亡

故事:聶磊稱霸青島十幾年,最后因惹上一個(gè)女人,踢到鐵板就此滅亡

紅豆講堂
2024-12-17 10:54:23
76歲的萬(wàn)科創(chuàng)始人王石,最近徹底成了全網(wǎng)焦點(diǎn)。

76歲的萬(wàn)科創(chuàng)始人王石,最近徹底成了全網(wǎng)焦點(diǎn)。

夢(mèng)錄的西方史話
2026-04-23 14:36:39
一點(diǎn)別同情她!被教練性侵27次,卻在奧運(yùn)賽場(chǎng)上,把隊(duì)友撞出賽道

一點(diǎn)別同情她!被教練性侵27次,卻在奧運(yùn)賽場(chǎng)上,把隊(duì)友撞出賽道

來(lái)科點(diǎn)譜
2026-02-27 07:42:10
大量諾基亞N9流入閑魚!3.9寸觸摸屏+米狗系統(tǒng),95新賣95塊

大量諾基亞N9流入閑魚!3.9寸觸摸屏+米狗系統(tǒng),95新賣95塊

數(shù)碼瞇瞇眼
2026-04-04 11:10:03
114-93!文班亞馬復(fù)出27+11+7封蓋,馬刺19分逆轉(zhuǎn)大勝開拓者

114-93!文班亞馬復(fù)出27+11+7封蓋,馬刺19分逆轉(zhuǎn)大勝開拓者

全景體育V
2026-04-27 06:21:57
倫敦世乒賽開戰(zhàn),CCTV直播!國(guó)乒2日首秀,24小時(shí)打3場(chǎng),賽程公布

倫敦世乒賽開戰(zhàn),CCTV直播!國(guó)乒2日首秀,24小時(shí)打3場(chǎng),賽程公布

老王大話體育
2026-04-28 01:46:37
一碗勝過(guò)十只雞!補(bǔ)氣養(yǎng)血,堅(jiān)持一周兩次,女人要多吃!

一碗勝過(guò)十只雞!補(bǔ)氣養(yǎng)血,堅(jiān)持一周兩次,女人要多吃!

江江食研社
2026-04-27 13:30:14
楊冪懷二胎了?。?>
    </a>
        <h3>
      <a href=八卦瘋叔
2026-04-27 10:49:40
超級(jí)大買家,突然開始賣了。

超級(jí)大買家,突然開始賣了。

格隆匯
2026-04-26 12:14:02
6個(gè)降壓藥,3個(gè)影響性功能,3個(gè)提高性功能,您一定要知道

6個(gè)降壓藥,3個(gè)影響性功能,3個(gè)提高性功能,您一定要知道

健康科普365
2026-04-24 09:19:57
2026-04-28 05:27:00
InfoQ incentive-icons
InfoQ
有內(nèi)容的技術(shù)社區(qū)媒體
12309文章數(shù) 51863關(guān)注度
往期回顧 全部

科技要聞

DeepSeek V4上線三天,第一批實(shí)測(cè)出來(lái)了

頭條要聞

坐在特朗普身邊親歷槍擊案的女記者 身份非常不一般

頭條要聞

坐在特朗普身邊親歷槍擊案的女記者 身份非常不一般

體育要聞

人類馬拉松"破二"新紀(jì)元,一場(chǎng)跑鞋軍備競(jìng)賽

娛樂(lè)要聞

黃楊鈿甜為“耳環(huán)風(fēng)波”出鏡道歉:謠言已澄清

財(cái)經(jīng)要聞

Meta 140億收購(gòu)Manus遭中國(guó)發(fā)改委否決

汽車要聞

不那么小眾也可以 smart的路會(huì)越走越寬

態(tài)度原創(chuàng)

健康
房產(chǎn)
數(shù)碼
本地
家居

干細(xì)胞如何讓燒燙傷皮膚"再生"?

房產(chǎn)要聞

信號(hào)!海南商業(yè)版圖,迎來(lái)大變局!

數(shù)碼要聞

6K/3K雙模切換!三星這款顯示器什么水平?

本地新聞

云游中國(guó)|逛世界風(fēng)箏都 留學(xué)生探秘中國(guó)傳統(tǒng)文化

家居要聞

江景風(fēng)格 流動(dòng)的秩序

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版