A C compiler is relatively easy to implement and it's easy to follow its output if you care about the assembly. For tasks like that, where you want just a lightweight structured programming language on top of assembly, C is very good in principle.
I just want to leave out idiosyncrasies like its automatic type conversions, Rust is way way overkill (and difficult to implement).
Rust is meant to be a replacement for C++, and even then, even if we acknowledge its many merits and C++'s horrible disadvantages, it will always have the handicap of being "different". You can organically grow your abstractions by moving from Assembly, to C, to C++, all in small steps. Writing something in Rust requires somewhat a bigger, discontinuous, step. Not their fault, but that's the state of the ecosystem.
By the way, GCC will be adding Modula-2 to their frontend mainline.
https://www.phoronix.com/scan.php?page=news_item&px=Modula-2...
It’s always good to hear others experience.
Also, Rust doesn't let you do all of the same things C does without using "unsafe", even if they're perfectly safe. Even with all of that syntax, you're still incapable of telling the rust compiler enough information to allow you to compile certain programs.
For example, in a single threaded Tokio application, shared state across coroutines still requires a 1) heal allocated 2) reference counted 3) mutex protected reference to the state, otherwise Rust won't let you compile even though it would be completely safe to pass around a single stack-allocated reference.
Perhaps I was missing something simple but it was the only way the compiler was happy and seemed to be the only way anyone has gotten it to work.
All my point was that Rust is not a substitute for C, too heavy and complex and not enough liberating for low level "assembly-wrapping" stuff.
As for C being low level "assembly-wrapping" stuff, yeah when all you have is a PDP-11 clone.