It’s also worth saying that with cars vs transit the incentives flip. With cars I don’t want to make things too far away, but like in my previous comment I have to space things out some, and cars are good at going distances, so it’s not too bad for business to sprawl. Also, because I need parking for everyone, density of my building (like a multi-story building) requires an even greater density of parking. But parking garages are expensive, so it’s easier for me to build a bunch of single story buildings with big surface parking lots.
On the other hand, with transit and pedestrians distances are much more significant. The goal now is to try and get as many things as possible to where the people already are. In this mode, building up is much more sensible because the more housing or offices or businesses you can put on this plot, the less people will have to walk to get there and the closer they are to prominent transit stops, etc. And if I don’t need parking, then I’m incentivized to put another building right next to this one to try and hit those same people without them taking more than 20 steps.
I get what you’re saying, but I think the issue with optional memory safety features is that it’s hard to be sure you’re using it in all the places and hard to maintain that when someone can add a new allocation in the future, etc. It’s certainly doable, and maybe some static analysis tools out there can prove it’s all okay.
Whereas with Rust, it’s built from the ground up to prove exactly that, plus other things like no memory being shared between threads by accident etc. Rust makes it difficult and obvious to do the wrong thing, rather than that being the default.