Scala:版本之间的二进制不兼容

Scala:版本之间的二进制不兼容,scala,binary-compatibility,Scala,Binary Compatibility,为什么Scala二进制文件在不同版本之间不兼容?它还相对年轻,正在积极开发中 新发布的版本中有一些变化是人们期待已久的,这有助于解决许多问题,但不可能使它们向后兼容 因为Sun对更新有一定的限制,所以Java的变化相当缓慢,并且通常试图保持向后兼容。有时这会阻碍进步,但大公司喜欢稳定的语言 另一方面,Scala掌握在一小部分学者手中,而且它(尚未)在行业中得到广泛应用,因此他们有(或采取)更多的改变自由。嗯,不。直说吧。 从2.7.2.3b1->2.7.2.3b2时,不需要重新编译*,这对我来说

为什么Scala二进制文件在不同版本之间不兼容?

它还相对年轻,正在积极开发中

新发布的版本中有一些变化是人们期待已久的,这有助于解决许多问题,但不可能使它们向后兼容

因为Sun对更新有一定的限制,所以Java的变化相当缓慢,并且通常试图保持向后兼容。有时这会阻碍进步,但大公司喜欢稳定的语言


另一方面,Scala掌握在一小部分学者手中,而且它(尚未)在行业中得到广泛应用,因此他们有(或采取)更多的改变自由。

嗯,不。直说吧。 从2.7.2.3b1->2.7.2.3b2时,不需要重新编译*,这对我来说是一个真正的解脱,因为我们有大量的客户群,使用2.7.2.3b1特性的根深蒂固的遗留代码


*警告-除非您愚蠢地在scala.collection.\uu或scala.xml.\u

中使用了代码,否则这与trait的编译方式有关,因为trait有点像接口,但它们可以包含实现。这使得进行不破坏源代码兼容性而是破坏二进制兼容性的更改变得非常容易,因为当您将新方法与实现一起添加到trait时,您必须重新编译实现该trait的所有内容,以便它们能够获取该实现。可能还有其他问题,但我认为它们基本上都是相同的。

缺乏JVM对Scala特定功能的支持,例如上面提到的特性,以及它正在积极发展的事实。

如果您想了解导致问题的特定语言问题,请直接从Odersky开始介绍这方面的背景:

如果您对这个问题还不熟悉,并且想了解它对应用程序的影响,那么结合David Pollack的这篇文章值得一读:


我在japi compliance checker中实现了对Scala的支持,并对所有版本的Scala进行了向后兼容性分析(包括二进制和源代码兼容性)

因此,现在您可以查看详细的突破性更改。报告可在以下网址查阅:

该报告每隔一天更新一次,因此您可以监视Scala最新版本中的更改


这只是部分正确。JVM实际上在链接方面非常松散。这就是JDBC2.0驱动程序与JDBC3.0驱动程序二进制兼容的方式,JDBC3.0驱动程序的接口有更多的方法。Scala也是如此。如果您在trait中添加了一个从未在程序中调用过的方法,那么它是二进制兼容的。val/var和IIRC也是如此。@jsuereth感谢您添加了澄清,尽管如果我没记错的话,仍然有一些微妙的方式会对您造成伤害。例如,假设在库的v1中,您有一个trait和一个具有实现的方法,并且您将该trait混合到应用程序中的一个类中。然后在lib的v2中,向trait添加一个带有实现的方法,并从v1和v2的公共方法调用该方法。如果您尝试将v1编译的应用程序与v2一起使用,则该应用程序将在运行时崩溃,因为v2依赖于编译器混合的新方法。因此,在更新libs时必须非常小心。Josh善意地错误地给出了一个更详细的解释,值得链接喜爱:Write,但这个问题与使用任何Java库都是一样的。例如,在具有JDBC 4.0接口的系统中使用JDBC 2.0驱动程序,虽然可能,但可能是危险的。在运行时。Scala并没有改变二进制兼容性的面貌,但我们社区更倾向于忽视它。我想你也错过了我的回答:这澄清了自Odersky的电子邮件以来发生的许多事情。嗯,我不确定调用版本2+“相对年轻”是否是一个好主意。没错,一种10年的语言并不年轻和不断发展。