The compilers (and linker -- the toolchain) do a lot of work to make C work as a shorthand for assembly. You have to write some assembly, anyways, for something like the Linux kernel, but you avoid a lot of it by taking advantage of properties of C like the calling convention and struct packing. I routinely need compiler extensions to make low level C code work.
C has kind of a dated syntax, but I suspect for low level usage, no other programming language is going to be effectively different. It's just writing the same story using different words.
The compilers (and linker -- the toolchain) do a lot of work to make C work as a shorthand for assembly. You have to write some assembly, anyways, for something like the Linux kernel, but you avoid a lot of it by taking advantage of properties of C like the calling convention and struct packing. I routinely need compiler extensions to make low level C code work.
C has kind of a dated syntax, but I suspect for low level usage, no other programming language is going to be effectively different. It's just writing the same story using different words.