如果Rust有unsafe那麼C 能不能有safe呢?

時間 2021-05-12 21:59:13

1樓:比巴卜是泡泡糖

@神楽阪深海

1、很早 ISO/IEC 9899:1990 Programming languages — C 中對 lifetime 只提到一次,可以得知 lifetime 是什麼。這裡簡單的資源管理設計,不涉及更高的抽象設計。

3、Region-based Memory Management in Cyclone 是於 2002 年 6 月在德國柏林關於程式語言設計和實現的 ACM 會議上發表的;大量提到 lifetime 概念,給出具體的實踐;

4、Rust 的設計元素源自 C++ 的有: references, RAII, smart pointers, move semantics, monomorphization, memory model;源自 ML Kit, Cyclone 的有: region based memory management;

5、Rust 中 lifetime 語義最終對映成靜態的借用檢查語法,其原理也是來自《region based memory management》。這和廣義的生命週期不是一件事;

6、C++ 中 references, RAII, smart pointers, move semantics, memory model 都是涉及廣義生命週期範疇的。

7、廣義的生命週期是執行時的依賴關係;顯然可能有一些正確的生命週期無法或者難以用 safe Rust code 表達,有部分是其天生的複雜性,還有一部分則是 Rust 相關原語的缺失。

8、那麼 unsafe 真正的用處來了,用來標註那些正確生命週期但又原語缺失的內容——肯定存在危險,可能設計的生命週期本身就是不正確的。並且標註本身就有警示作用。加強注意力劃分。

9、C++ 的 safe:首先要定義什麼是 safe,有哪些內容,什麼是 unsafe,有哪些內容。簡單舉例,假設:

無指標/引用懸空和併發安全為 safe。A 程式用到開發的 B 庫,B 庫實現保證了 safe,B 庫用到了 C 庫也是 safe 的;現在 B 庫依賴的 C 庫更換成 F 庫。這時如果 F 庫是非 safe 就很難受了;這裡的 C++ safe 的傳染性就是指這個——逆向傳染;這時的你要麼放棄歷史財富自行實現一版 safe F 庫。

大量修改 B 內使用 F 的邏輯且不一定完全能保證 safe;

2樓:我變成了一條魚

比如一片100格仔的雷區,rust在其中乙個格仔標註了unsafe,那麼我們走的時候只要仔細繞過就好了。

但是你讓c++在其中乙個格仔標註safe,好像沒什麼用?走過去該boom還是要boom呀。

3樓:狂徒歸來

std::optional出來多久了?你看stl到現在支援嗎?

有幾個寫cpp的知道還有這麼個東西?rust預設safe是建立在一套推斷機制上,cpp當然可以搞,但是肯定要大改。那搞完了跟rust有什麼區別了嗎?

為什麼不直接用rust?cpp已經夠複雜了,rust已經被吐槽學習曲線陡峭,這麼一搞讓cpp難上加難

為什麼Rust寫個鍊錶都那麼難?

傳統的幻想書屋 Rust寫個使用unsafe的鍊錶還是蠻簡單的,跟C 難度差不多。鍊錶這個東西天生就跟Rust的借用規則衝突,乙個鍊錶節點在操作的時候同時被多個指標擁有和修改是很常見的事,更別說雙向鍊錶這種自帶迴圈引用的資料結構了。如果不使用unsafe和指標,會有很多不必要的開銷,而且也很難寫。所...

對比 Go 語言,Rust 有什麼優勢和劣勢?

何志斌 Rust的優勢很多帖子提到了,劣勢我覺得有二 遠不如Go簡單。不要低估這一點,簡單的東西不容易犯錯。Rust背後的Mozilla,比Google差遠了。 茹姐 go定位是雲計算時代的C語言,主要是面向雲計算領域。而rust是系統級語言,更Low level一些 都是強型別語言,go有GC而r...

Rust 語法很醜陋嗎?如果是,為什麼醜陋呢?為什麼設計成這樣呢?

shine st 我實在是不明白說Rust語法醜陋的人是怎麼想的。就拿Rust對分號的處理來說吧。在其他類C語言中,要麼強制每行結尾加分號 要麼強制每行結尾不加分號 要麼讓分號變為可選。而Rust是怎麼處理的呢?在Rust中,如果乙個語句不以分號結尾,那麼他就是乙個表示式 expression 有返...