So I can deny that most development becomes easier with GC. At least if you also intend to actually run the thing. Running Java means forever fighting the GC, needing to do runtime and development to reduce impact of inherent GC problems.
At the end of the day I find languages like Java much harder to reason about and actually a bit harder to write.
Move semantics and borrow checker shine when you don't want your data structure to be shared and when you want to control mutation. In some domains, that brings you an unequaled level of safety and Rust is the obvious choice.
Move semantics and borrow checker slow you down when you sharing and mutation are properties you don't care about (or at least not enough to prove them to the compiler). In such cases, I'd rather code in OCaml (or Haskell, or TypeScript, ...)
I hope that one day we'll be able to have the best of both worlds, but I don't see a path forward at the moment.
Smalltalk, Interlip-D, Mesa/Cedar, Oberon, Oberon-2, Active Oberon
Source code is available for some of them, many home made OSes in non GC enabled languages are far from meeting the capabilities of any of those systems.
"Eric Bier Demonstrates Cedar" - Computer History Museum
https://www.youtube.com/watch?v=z_dt7NG38V4
https://people.inf.ethz.ch/wirth/ProjectOberon/Sources/Kerne...
Do these include subsystems with fairly high-performance requirements (GUIs, high-volume network services, etc.)?
Likewise ETHZ IT department during the late 1990's used several Oberon workstations.
GC is easy if you don't have to worry about those problems.
But that doesn't help with today's devices. Even $10 boards are multicore now and come with hundreds megs of RAM.
At least in garbage collected OS design, the lessons from 1970's and 1980's are interesting, but do not directly apply to modern systems.