Dlaczego binarny Scala jest niezgodny między różnymi wersjami?Scala: binarna niezgodność między wydaniami
Odpowiedz
Ma to związek ze sposobem cechy są kompilowane, ponieważ cechy są trochę jak interfejsy, ale mogą one zawierać realizacja. To sprawia, że BARDZO łatwe jest wprowadzanie zmian, które nie naruszają kompatybilności źródeł, ale łamią kompatybilność binarną, ponieważ kiedy dodajesz nową metodę do cechy wraz z implementacją, musisz rekompilować wszystko, co implementuje tę cechę, aby podejmie tę implementację. Prawdopodobnie są też inne problemy, ale myślę, że w większości są zgodne.
Jest wciąż względnie młody i podlega aktywnemu rozwojowi.
W nowej wersji wprowadzono pewne zmiany, które z niecierpliwością oczekiwano i które pomagają w wielu problemach, ale nie było możliwe ich kompatybilność wsteczna.
Ponieważ Sun jest dość restrykcyjny wobec aktualizacji, Java zmienia się dość wolno i zwykle stara się zachować kompatybilność wsteczną z gorzkim końcem. Czasami stoi to na drodze postępu, ale wielkie firmy uwielbiają stabilny język.
Scala, z drugiej strony, znajduje się w rękach niewielkiej grupy pracowników akademickich i nie jest (jeszcze) szeroko stosowana w branży, więc ma (lub bierze) więcej swobody przy zmianach.
Umm, nie. Zapoznaj się z faktami. Nie było potrzeby ponownej kompilacji * przy przejściu z wersji 2.7.2.3b1 -> 2.7.2.3b2, co było dla mnie prawdziwą ulgą ze względu na dużą bazę klientów, którą posiadaliśmy z okopanym dotychczasowym kodem przy użyciu funkcji 2.7.2.3b1.
* zastrzeżenie - chyba głupio stosowany kod w scala.collection._ lub scala.xml._
Brak obsługi JVM dla funkcji specyficznych dla Scala, takich jak wspomniane cechy i fakt, że aktywnie się rozwija.
Oto tło na to, prosto z Odersky, jeśli chcesz zrozumieć specyficzne problemy językowe, które powodują problemy:
http://www.scala-lang.org/node/9346
Warto czytać w powiązaniu z tym stanowisku Davida Pollacka jeśli jesteś nowy z emisją i chcą zrozumieć wpływ może to mieć na aplikacjach:
Myślę, że również brakowało mi odpowiedzi: http://suert.blogspot.com/2011/12/scala-fresh-is-alive.html , która wyjaśnia wiele z tego, co się wydarzyło od czasu wiadomości Odersky'ego. – jsuereth
mam realizowane wsparcie dla Scala w japi-compliance-checker 1.6 i przeprowadzona analiza kompatybilności wstecznej dla wszystkich wersji Scala (zarówno kompatybilność binarna, jak i źródłowa).
Teraz możesz zobaczyć szczegóły zmian. Raport jest dostępny tutaj: http://abi-laboratory.pro/java/tracker/timeline/scala/
Raport jest aktualizowany co drugi dzień, dzięki czemu można monitorować zmiany w najnowszych wersjach Scala.
To tylko częściowo prawda. JVM jest naprawdę * naprawdę * luźne z łączeniem. Tak właśnie działa JDBC 2.0 sterowników jest binarnie zgodnych ze sterownikami JDBC 3.0, gdzie interfejsy mają * wiele * więcej metod. To samo dotyczy Scala. Jeśli dodasz metodę do cechy, która nigdy nie jest wywoływana w programie, jest ona kompatybilna z binariami. Dotyczy to również wartości val/var oraz IIRC. – jsuereth
@jsuereth Dzięki za dodanie wyjaśnienia, chociaż jeśli dobrze pamiętam, wciąż istnieją subtelne sposoby, które mogą cię ugryźć. Na przykład, powiedzmy w v1 biblioteki, że masz cechę z metodą, która ma implementację, i mieszasz tę cechę w klasę w aplikacji. Następnie w v2 biblioteki dodajesz metodę z implementacją do cechy i wywołujesz tę metodę z metody wspólnej dla v1 i v2. Aplikacja skompilowana przeciwko v1 ulegnie awarii w czasie wykonywania, jeśli spróbujesz użyć go z v2, ponieważ v2 zależy od nowej metody mieszanej przez kompilator. Tak więc trzeba bardzo uważać przy aktualizacji bibliotek. –
Josh uprzejmie nie pasuje do bardziej szczegółowego wyjaśnienia, które zasługuje na miłość: http://suert.blogspot.com/2011/12/scala-fresh-is-alive.html –