scala/バイナリ互換性
Scalaにおける互換性には2つのレベルがある。ソース互換性とバイナリ互換性である。 Scalaにおいて(Scala言語の)バイナリ互換とは、Scalaのバージョンが変わってもABIが互換であることを言う。つまり、JVMバイトコード(またはScala.jsやScala Nativeなどで)にビルドされた状態で、相互のAPIを呼び出すことが可能という意味である
ABI: 関数やメソッドを呼び出すとき、バイナリレベルでどうするべきなのかを規定する規約
引数をスタックのどこに置くべきなのか?みたいなやつ
s Scalaはコンパイル型言語であるため、ライブラリの相互呼び出しはコンパイル済みの状態で行われている コンパイル済みのバイトコードはJVMで動作するので、その上でのABI
これは特に、ユーザが開発しているソフトウェアと、それが利用しているライブラリとの間で問題になりうる。
例えば、Scalaの初期においては、ライブラリかソフトウェアで利用されているScalaのパッチバージョンが上がっただけでも、正しくライブラリを呼び出すことができなくなっていた。これはJVM上における呼び出し規約が破られた、すなわちABIが非互換になったためである。
前方互換性と後方互換性
https://scrapbox.io/files/6a1e3c7865e24daf8cc9b7b4.png
前方互換性: あなたのソフトウェアのビルド環境が新しく、それが使うライブラリのビルド環境が古いときでも、問題なく呼び出せること
前方互換性がない場合、あなたはライブラリをビルドするScalaのバージョンが新しくなるまで、あなたのソフトウェアのScalaのバージョンを上げられない
後方互換性: あなたのソフトウェアのビルド環境が古く、それが使うライブラリのビルド環境が新しくても、(同上)
後方互換性がない場合、あなたのソフトウェアをビルドするScalaのバージョンをライブラリ水準に上げなければ、あなたはライブラリのバージョンを上げられない
例
ライブラリからパブリックメソッドを削除すると後方互換性を破壊する
いわゆる破壊的変更
古いバージョンを前提にしていたソフトウェアが動作しなくなるため
ライブラリにパブリックメソッドを追加すると前方互換性を破壊する
これを利用した新しいバージョンを前提としたプログラムが古いバージョンのライブラリで動作しなくなるおそれがあるため
Scala 2系において、Scala 2.13.18までは、メジャーバージョン内のバイナリ前方互換性と後方互換性との両方が保証されていた。つまり、2.12.xxと2.13.yyのそれぞれでビルドされたソフトウェアとライブラリにおいて、相互の呼び出しが保証されていた。