这个问题适用于任何用一种语言(“源代码”)编写的语言,例如 C 或 Java,并使用动态链接以另一种语言(“二进制”)分发,例如机器代码或 Java 字节代码。
假设用户已经在使用我的库的 A 版。我发布了一个更新的版本 B。
如果他可以编译他的代码而无需对 B 进行更改并正确地与 B 一起运行,则从 A 到 B 的更改被称为source compatible。
如果他可以针对 A 编译他的代码并正确地与 B 一起运行,则从 A 到 B 的更改被称为是二进制兼容的。这种情况在使用没有隔离模块加载的传递依赖图(例如 OSGI)时很常见。X 是针对特定版本的 Y 和 Z 编译的,而 Y 是针对不同的特定版本 Z 编译的。在运行时,Y 对 Z 的调用可能不正确并且可能会崩溃。
更改可能是源兼容的,但二进制不兼容。更改也可能是源不兼容和二进制兼容的。
我将哪种兼容性用于语义版本控制?我是使用源兼容性来区分主要和次要/补丁更新,还是使用二进制兼容性来区分主要和次要/补丁更新?
我目前的动机是 Scala 库。Scala 二进制兼容性可能很难分析,需要对编译器细节有很好的理解。源代码兼容和二进制不兼容是很常见的。
这不是一些奇怪的边缘情况。这个问题可以出现在大多数任何编译的、动态链接的语言中。