2010-01-12 17 views

Odpowiedz

19

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.

+6

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

+1

@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. –

+1

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 –

2

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.

+3

Cóż, nie jestem pewien, czy wywołanie wersji 2. + „stosunkowo młody” jest dobrym pomysłem. – Opal

+2

Prawo 10-letni język nie jest młody i ewoluuje. – tutuca

0

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._

9

Brak obsługi JVM dla funkcji specyficznych dla Scala, takich jak wspomniane cechy i fakt, że aktywnie się rozwija.

5

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:

http://lift.la/scalas-version-fragility-make-the-enterprise

+0

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

2

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.

enter image description here