There are two kinds of #systems #programming: small and large. By "small", I mean real-time control system, embedded software, or a device driver, the kind that people smarter and ballsier than I would happily write in hexadecimal. By "large", I mean operating system, communications protocol, compiler, database engine, and so on.
It is a fool's errand to design a new language that might replace C in the "small" space. For this type of software, assembly is too craggy, and C++ is too lumpy. Only Forth comes close to C, here.
And it is a herculean task to design a new language that might displace C++ in the "large" space. Countless new languages have tried, and only a few saw some success: Go and Rust, and perhaps Swift, Zig, Nim, and Odin.
This duopoly of the C family is both good and bad. This dominance is good, because it engenders stability. But stability in IT is an illusion. On the other hand, this dominance is bad, because it locks in the adopters and locks out the contenders. And there have been countless examples in IT of this lock-in/lock-out, duo-face problem, over the past 70 years.
What are the alternatives? Well, many arguments could be made in favour of every compiled language in existence. But the two simple choices are these:
• For the "small" space, there are plenty of cases where Forth is a good choice.
• For the "large" space, where safety and security are paramount, the ML family of languages—Standard ML, OCaml (including F# and Reason), and Rust—offer significant advantages over the C family.
Every modern compiled language is an admixture of the C and the ML families—like Rust. Yet, "new" languages keep cropping up, daily.