ABI stands for application binary interface, and it represents how different precompiled components of a program interact. This can be a program calling out to an OS function or part of the language runtime, or even to a library if it’s dynamically linked.
In some languages, such as Swift, the standard library is ABI stable — that is, even source-breaking changes to the runtime or standard library must remain backwards-compatible with already-compiled programs. Additionally, programs compiled with a newer version of the compiler that don’t use new runtime components must continue to work with old versions of the runtime and standard library.
ABI stability causes challenges for language and library evolution. Some otherwise positively-received changes to Swift have been rejected since they can’t be implemented without breaking ABI. Other languages that aren’t ABI-stable don’t need to worry about this, and can change or remove existing features (though that may necessitate a major version bump).
With that background out of the way: When is ABI stability a net positive? What factors would cause a language to restrict itself in this way?