title: What is Scala runtime, binary compatibility and how are Scala applications deployed?
body: <p>These are three questions actually, but for me they are tightly connected.</p>
  
  <ul>
  <li><p><strong>What is Scala runtime?</strong> Is it just a regular JVM and a classpath to java-lang library? Can I run Scala applications on a plain JVM? Should I always deploy <code>scala-lang.jar</code> along with my own code?</p></li>
  <li><p><strong>Where does that <code>binary compatibility</code></strong> come from? The answer to this question usually sounds like:</p></li>
  </ul>
  
  <blockquote>
    <p>Different Scala compilers produce different bytecode.</p>
  </blockquote>
  
  <p>but this explains not much to me. Does it mean that the 'interface' of the bytecode is changed? Like changing the name of the field containing the instance of companion object, for example. If yes, then why is there no backward compatibility? Is not it possible to add metadata to the bytecode? Scala compiler could use it to change its behaviour/expectations and emit different bytecode for various versions.</p>
  
  <ul>
  <li>Does having library cross compiled for several Scala versions imply that using the library from Java will require its own interoperation for each version?</li>
  </ul>