A comparison of Rust’s borrow checker to the one in C#
nie czytałem całości jakoś uważnie, ale odnosząc się do https://em-tg.github.io/csborrow/#why-does-nobody-seem-to-be-talking-about-this
Why does nobody seem to be talking about this?
Maybe I’m bad at searching for these things, but these changes to C# seem to have gone completely under the radar in places where you read about memory safety and performance. Maybe it’s just because the language additions have happened super slowly, or maybe the C# and Rust communities have so little overlap that there aren’t enough people who program in both languages to notice the similarities. Maybe there’s something that makes C#’s ref subset so unusable that people just ignore it (I’ll admit to only having played around with it a bit, so far).
Here’s my theory: C# already had an equivalent to all of these things in its “unsafe” subset, so when introduced, ref-safety changes were typically framed as “bringing the performance of safe code closer to that of unsafe code,” which is arguably the opposite perspective of Rust’s “bringing the safety of high-performance code closer to that of high-level languages.” Perhaps that framing makes people miss that although the two languages are pushing in opposite directions, they might actually be getting closer together.
jak z samego artykułu wynika, refy z c# są biedne w porównaniu do rusta jeśli chodzi o możliwość wyrażania lifetime'ów. borrow checker w ruście jest po to, żeby móc całkowicie zrezygnować z gc, a tymczasem w c# refy mają ustawione lifetime'y na sztywno (co je mocno ogranicza) i integrują się z gc, co zwiększa ich możliwości (przybliża do możliwości rusta). ograniczeniem refów w c# jest np. to, że nie da się ich użyć w kodzie typu async.
największą praktyczną różnicą między refami z c#, a borrow checkerem z rusta jest to, że refy w c# to nisza, a borrow checker w ruście to podstawa całego kodu. jedynym sposobem, żeby wyłączyć borrow checkera w ruście jest kod unsafe. tak czy siak, mimo niszowości, refy z c# wyglądają na ciekawy bajer.