>>29641As i said, Ada actively forces you to write maintainable code. Packages are kind of like classes, but they're "static" by default, and you can only instantiate them as generics if the data types of the fields are known in advance. There are statements that can only appear in the package spec, not the package body, and vice-versa. Declarations can only appear in designated blocks. Integers are also restricted to arithmetic operations, so you can only do bit twiddling with modular types.
Access types, the pointer stand-in, really are the only tool you can make a mess with, they're restricted in many context though. Everything except access types uses call-by-value semantics and is allocated on the stack. Dynamic allocations need to come from a pool, therefore it's often easier to use handles as indexes into an array (whose size needs to be known at compile-time).
Personally i also think ada can be pleasant to program in, because it has proper subprograms (with multiple output values) and assignments to and from array slices, obsoleting memcpy or Arraycopy type calls. The standard library is so-so, yet generally well thought out.