I believe the best way to appreciate Ada is finding a job in avionics, so you see where and why Ada helps.
how do you train them if its not accesible? (direct memory access). higher level language boundary check comes at a price of degraded memory access speed by boundary check on every access call. .
Ada is not only a pure language, it's a process with a *mind approach*. We have sections called "unsafe". These sections require special handling when you manage them, and they propagate constraints to the whole project. If a constraints is not respected, Ada doesn't compile!
You can have low level sections in Ada, which directly access memory without any check, but you must define it as "unsafe", therefore the module propagate the information to the builder which is now aware of it as well as everybody, including those who are in the testing team. Everybody are aware it's a weakness! You must define modules through interfaces! And it's a must! C doesn't care about it, it's so wild that you can just use cpp to includes headers file, and who cares? When you access a module define "unsafe" in Ada there are a lot of checks at compile time.
These tricks help to catch mistakes, especially during the "system integration" process, when sources from different teams are merged together!
You can also ask the compiler to inject testing modules into the "unsafe" module, this helps during the testing activity, as the module is "unsafe" it MUST be tested more carefully, and then approved, and since it's interface is also "unsafe" then there are restrictions in the usage.
Ada, in first place, teaches you how you have to organize your work! Ada is fab team working process because it teaches how people has to manage the "source life cycle", from the prototype, to the testing, to the production, when you can progressively remove construction constraints.
C is a wild language, full of #ifdef branches, you can put assembly inline in the middle of a C file, and nobody cares. C requires external tools like "Code Purify" (shitty tool) which injects a lot of shit in order to provide a limited "unit test" capability. C doesn't care on what you do when you pass information between two modules, and doesn't suggest neither helps you to design test-modules.
Ada cares on boundaries at compile time, or at run time if you can allow it. It helps to assure "you are not out by one" when you implement a loop which needs to use an index to point to an array.
And all of these are native features! You don't need any shitty external tool.
Ada requires *fifty times* the effort you need to learn a wild language like C, but once learned it shows how C requires *ten times* the effort you need with Ada to achieve the same purpose!
At the end, it's a gain