Scala is another language that doesn’t promise bytecode compatibility across different versions. The 2.7 to 2.8 migration didn’t even maintain compatibility across milestone builds of a single release – the entire tool chain had to be rebuilt for each new milestone build, including libraries. 2.9 wasn’t much better. We abandoned Scala at work at that point.
I’m sure there are other examples even on the JVM. If anything, Java is the odd one out since they have tried to promise this compatibility (they haven’t always been successful but they do pretty well).
Clojure tries very hard to provide source compatibility but not bytecode compatibility across versions.
Clojure’s compiler is part of its runtime – even in production with a fully AOT’d application you can still run a REPL and add new code, which is compiled on-the-fly from source as you enter it. In 1.12, as long as you have the CLI installed, your can even add new dependencies on-the-fly and it will fetch them from Maven/Clojars and load them into the running JVM (and compile them from source if necessary).