Closed
Description
Until Dotty 0.x.y-RC1's, the binary and TASTy formats were free to be broken at any time, and hence the binary version was 0.x
(for example 0.27
). With 3.0.0-M1, it has become 3.0.0-M1
, which corresponds to what the milestones and RCs of Scala 2 do (a full version number).
We need to decide what will happen in Scala 3.0.0 and onwards. There are a few things to take into account.
- There exists a version
3.T.0
at which we will break and finalize TASTy, as well as change the stdlib to use Scala 3 features in appropriate places. That implies that it will also break binary compatibility. - For all versions >= 3.0.0 and < 3.T.0, we will preserve binary compatibility, which also implies staying binary compatible with Scala 2.13.
- For all versions >= 3.T.0, we will keep backward tasty compatibility, basically forever. We don't know exactly what promises will be in terms of binary compat, but most likely we'll want to at least keep backward and forward binary compat between patch versions.
Therefore, we have at least two binary versions to settle on: the one for < 3.T.0, and the one for >= 3.T.0. I see the following options:
3.0
and3.T
. That choice means: the first minor version that uses the new binary version. It has the benefit that it can develop further in time if we decide that binary versions should stick to binary compatibility, not to TASTy compatibility, even after 3.T.0, since we can introduce another3.U
at some point. It is however confusing that3.1
is compatible with binary version3.0
but not3.T
.3.0
and3
: That choice bets on 3 being the ultimate binary version, which will never change again. The use of3.0
is a transient state in the meantime. It will be weird that3.0.0
cannot read3
, but that's not too bad.3
and4
: After all, there is no hard requirement for the binary version to be related to the general version. That choice makes it explicit that a binary version is not structured. It's flat: when it changes, the whole ecosystem has to be rebuilt, no matter what. (If we preserved backward compatibility, we wouldn't change the binary version to begin with.)- And finally,
2.13
and3
. This one will make people scream, but it makes perfect sense given that Scala 3 and 2.13 are forward and backward binary compatible. The ecosystems are therefore not split: it is the same ecosystem. That also makeswithDottyCompat
and the reverse one for which we don't have a name yet both moot. It does mean that a library cannot release the same version separately for 2.13 and 3. But after all, it shouldn't have to, since we made everything so that the binary built by one version is usable from the other version.