If you add up all the JavaScript, C#, Java, Python, and PHP being written every year, that’s a lot of code.
Are we sure that all that combined isn’t more than C/C++? Or at least somewhat close?
So while not technically "requiring" C/C++, if your language cannot map exactly to C/C++ data structs & type definitions - it won't work.
Alternative is to, y'know, write a kernel in your language of choice and choose your own syscall specification suiting that language, and gain mass adoption. Easy!
It is like complaining a bullet vest doesn't protect against heavy machine gun bullets.
And all practical Pascal clones (e.g. Object Pascal) had to grow constructor/destructor systems to cleanup the memory on de-allocation (or they went the garbage collection route). So they were on-par with C++ for safety.
Ada is similar. It provided safety only for static allocations with bounds known at the compile-time. Their version of safe dynamic allocations basically borrowed Rust's borrow checker: https://blog.adacore.com/using-pointers-in-spark
We are beyond Ada 83, Controlled Types and SPARK exist, and Rust also does runtime bounds checking, so what.
ESPOL is one of the first recorded uses of unsafe code blocks, 1961.