Making C++ safe without borrow checking, reference counting, or tracing GC
&gt; Tracing GC is the simplest model for the user, and helps with time management and development velocity, two very important aspects of software engineering.<p>&gt; Borrow checking is very fast, and helps avoid data races.<p>One thing many people seem to assume is that not having to care about memory means you can program faster and get to your goal faster. As the author here seems to do. However as it turns out, if your program is more complex than a ~100-1000 lines of code, explaining in a explicit way who owns what and who gets to change state when, is a very useful way to avoid bugs.<p>Saoirse Shipwreckt aka withoutboats mentioned this a while ago in <a href="https:&#x2F;&#x2F;without.boats&#x2F;hire-me&#x2F;" rel="nofollow noreferrer">https:&#x2F;&#x2F;without.boats&#x2F;hire-me&#x2F;</a><p>&gt; Rust works because it enables users to write in an imperative programming style, which is the mainstream style of programming that most users are familiar with, while avoiding to an impressive degree the kinds of bugs that imperative programming is notorious for. As I said once, pure functional programming is an ingenious trick to show you can code without mutation, but Rust is an even cleverer trick to show you can just have mutation.<p>and later follows up on this in <a href="https:&#x2F;&#x2F;without.boats&#x2F;blog&#x2F;revisiting-a-smaller-rust&#x2F;" rel="nofollow noreferrer">https:&#x2F;&#x2F;without.boats&#x2F;blog&#x2F;revisiting-a-smaller-rust&#x2F;</a><p>&gt; I still think this is Rust’s “secret sauce” and it does mean what I said: the language would have to have ownership and borrowing. But what I’ve realized since is that there’s a very important distinction between the cases in which users want these semantics and the cases where they largely get in the way. This distinction is between types which represent resources and types which represent data.