The entire point is that we tried that for fifty years and it didn't work.
Agree, but with a small correction: Programming in C or C++ and having memory safety and absence of race conditions / deadlocks can be done. But it is very difficult and tedious. You need very good people, budgeting time for detailed design, reviews, and testing (by intelligent human testers), and a central authority for architecture decisions. You can only use external libraries that are vetted to the same high standards. I worked for about 10 years in a group that produces a large and complex piece of system-level software (a cluster / distributed file system for HPC), and our bugs that got out to customers were not the simple C++ stuff like using freed memory, clobbering memory, race conditions or mistakes in parallelism. They were instead bad design choices, overlooking edge cases, or simply typing the code wrong. One of my favorite bugs (which causes large data loss, and had foreign policy consequences) was roughly this bit of code, correctly commented:
Code:
B();
// Do A() before B(), because if multiple nodes perform B() in
// parallel, at least one has to have done A() before. This only
// matters in the rare race condition that one node crashes
// between A() and B(), while another node is restarting during
// that moment.
A();
The comment explained exactly what needed to be done and why, and was absolutely correct; the code was literally two lines (one function call each), and blatantly wrong. This code was written by someone with a PhD in theoretical computer science, one of the greatest practitioners in distributed computing, and it was reviewed by about a half dozen senior engineers and PhDs, and nobody noticed and A and B were out of order. It was tested by a group of about 20 very evil testers, who read source code and tried to engineer specific tests for edge cases, and they never hit the bug. Yet this was shipped to a large government customer, and crashed there. No amount of converting this code from C++ to Rust would have helped here, and it shows that humans can occasionally make mistakes.
I don't like rust. Spec too big.
The C++ spec is much bigger.
My current Rust gripe (after less than 1K lines of code): The standard library is far too small. For many relatively simple functions, you have to use open source crates. There are often multiple crates that sort of do similar things, and it is hard to pick which one to use. Many of the crates that contain basic functionality (like tree walking, argument parsing, queues for implementing parallelism) feel like they were not thoroughly designed and tested; the feel more like someone's weekend hack. But don't take this as gospel, before I pass judgement, I need to write another few thousand lines.