Recs.
Updated
SpecsUpdate
Pros
Pro Highly tunable error checking
There are many error conditions. There can be tampering with containers, there can be integer overflow, there can be contract violation. Other programming languages suffer from "one size fits all" choice. You need checks - you pick one language, you want performance - you pick another language. Whatever language you pick, having written 1M LoC, you cannot undo your decision.
Not in Ada. Ada is not only appealing by being able to check many conditions but also being able not to check them if requested so. Ada can be safe, Ada can be fast. No need to have multiple languages. Investments in Ada code are secure.
Pro Catches integer overflows and range errors, but they don't start an apocalypse
Some "system" programming languages make it hard to catch integer overflows and range errors. Another ones advertise catching them, but what they forget to mention is that catching such error starts an apocalypse. A condition that is either impossible or hard to handle properly. Ada is designed by sane people. In Ada these ones are usual exceptions. Let us show 500 error, but please don't shutdown the whole webserver. No apocalypse today, thanks.
Pro Excellent module system
Ada is not a basketball game where any player can come and put ball into basket. Modules cannot go and put entities (constants, functions, types) into arbitrary namespaces. And there is no "root" namespace polluted by non-namespace aware "modules". No games here. Everything is well defined. Modules (packages) only put everything into their own namespace. Every entity is easily traced to its origin.
Also, unlike some other system programming languages, "." is not for beauty. Packages have hierarchy. For instance, Ada.Text_IO.Stream_IO is allowed to provide stream interface to Ada.Text_IO because private part of Ada.Text_IO is accessible to children packages. This is more convenient access granting system than ones found in other programming languages.
Pro Really hermetic type system
In some other programming languages Boolean(5) is an easy way to make Boolean value that is neither strictly True nor strictly False. Some programming languages don't even have this concept defined properly. Booleans, characters, numbers, everything is blurred, everything is shaking. Nothing shakes in Ada. In practice one is almost guaranteed to not ever stumble across invalid value. One is almost guaranteed that "Positive" value will indeed be positive and "Natural" value won't be negative. And it does not take much effort to support it, Ada programs are fast and slim, notably more efficient than some other programming languages pretending for safety, but failing to at least deliver strictly positive numbers.
Pro Almost any target is reachable using C/C++ compiler
There is a certified (ACATS validated) Ada compiler on top of C or C++ (actually 4 switches for fine tuning). It knows how to check integer overflow even if C/C++ compiler does not know. It can provide symbolic backtrace on almost any platform. With a special key generated C/C++ code whistleblows about entering and leaving functions.
Just think about it. Your target may only have C compiler available. Yet if you get Ada, all integer operations are checked, and if exception happens, you have symbolic backtrace. RAII also works on top of C compilers.
Pro Traditional OOP
One does not have to figure out how to map familiar classes to haskellish traits or arithmetic types in Rust. One does not have to learn to put box into box, like in Go. Good or bad, comparably conservative OOP is here. Class hierarchies, abstract interfaces, they just exist when one does not want to experiment with alien technologies.
Ada's OOP innovation is synchronized interfaces for tasks and Hoare monitors, but that is another story.
Cons
Con Different libraries use different basic types
Is it possible for anyone to write custom string type? Yes, so let's do this. Is it possible for anyone to write custom container? Yes, so let's do this.
This democracy comes at a cost. In some another programming language "a list of string" may virtually always be the same thing for mutually unaware developers, so you get two programming libraries and put them together, toll-free. In Ada this is very likely to not be true. Ada Web Server introduces custom containers, GNATCOLL introduces custom strings. Both libraries are maintained by same vendor. Writing glue conversion code is unfortunately required.
Con Smart pointers are not built-in
ARC is indeed possible in a programming language having RAII and finalization, but programming language does not further assist to implement ARC. You got the tools, now you are on your own.
Every programming language has an economic foundation. For C++, it's C compatibility, so problems arising from it are not going to leave. For Ada economic foundation is SPARK. What can be verified, is going to thrive. What cannot be verified, lacks attention. In SPARK until recently there were no pointers. Now they are going to be introduced, but they will be unique. Unique pointers means nothing to count, no reference counting.
Implementing references (smart pointers) is verbose. Someone does it by hand, someone uses code generator from UML.
Con C/C++ transpiler is stuck to Ada 95 revision
There are many developers still using Ada 95 compilers because there was no update for their hardware. They maintain libraries to be Ada 95 compatible. The hardware that can usually make one be locked to Ada 95 choice is rare (usually military) and has alternatives, but one special case is very notable. Current seller of Ada->C/C++ does almost nothing to improve compiler, so it's not moving anywhere. It stays on Ada 95 edition. This vendor is not known in Ada community, they are seemingly only collecting money from rent (they are not original developers). Better than nothing, but that's what we've got so far.
Ada 95 is still very great, even compared to C++20. C++20 only recently got std::span, Ada's array parameters were like that since Ada 95. But all the hype stuff, all the list comprehensions will not be for you if you want to secure your time investments by making sure all your code can be compiled to C/C++ to run on any target.