この質問は、C や Java などの 1 つの言語 (「ソース」) で記述され、動的リンクを使用してマシン コードや Java バイト コードなどの別の言語 (「バイナリ」) で配布されるすべての言語に適用されます。
ユーザーが既に私のライブラリのバージョン A を使用しているとします。新しいバージョン B をリリースします。
B に対して変更せずにコードをコンパイルし、B で正しく実行できる場合、A から B への変更はソース互換性があると言われます。
A に対してコードをコンパイルし、B で正しく実行できる場合、A から B への変更はバイナリ互換性があると言われます。この状況は、分離されたモジュールのロード (OSGI など) なしで推移的な依存関係グラフを使用する場合によく見られます。X は Y および Z の特定のバージョンに対してコンパイルされ、Y は別の特定のバージョンの Z に対してコンパイルされます。実行時に、Y の Z への呼び出しは正しくない可能性があり、クラッシュする可能性があります。
変更がソース互換であっても、バイナリ互換でない可能性があります。変更がソース互換性がなく、バイナリ互換性がある可能性もあります。
セマンティック バージョニングにはどの互換性を使用しますか? メジャー アップデートとマイナー/パッチ アップデートを区別するためにソース互換性を使用しますか? または、メジャー アップデートとマイナー/パッチ アップデートを区別するためにバイナリ互換性を使用しますか?
私の現在の動機は、Scala ライブラリです。Scala バイナリ互換性は分析が非常に難しく、コンパイラの詳細をよく理解している必要があります。ソースの互換性とバイナリの非互換性は非常に一般的です。
これは奇妙なエッジ ケースではありません。この問題は、ほとんどすべてのコンパイル済みの動的にリンクされた言語で発生する可能性があります。