elwis napisał(a):
@stivens: A nie są podobne? W stosunku do Javy dodaje wsparcie dla inferencji typów i rozszerza składnię o kilka fajnych konstrukcji. Jedna zasadnicza różnica jest taka, że Scala zachęca do programowania funkcyjnego i pod nie jest stworzona. Wszystkie odmienności, mimo wszystko mieszczą się w Javowej infuicji, działają w tym samym środowisku. Porównaj sobie z Perlem. Lispem lub Haskellem (moim zdaniem nawet C++ bardziej się różni) i mów, że nie są podobne. No chyba, że tak piszę dlatego, że znam wiele języków i programowanie funkcyjne jest moim domyślnym paradygmatem. Bez takiego obycia, możliwe, różnica jest nie do ogarnięcia.
Programowanie funkcyjne jest różnie rozumiane. Jedni rozumieją przez to skrócony zapis dla domknięć (tzw. lambdy), ale to zdecydowanie za mało, by takie pojęcie miało sens. Programowanie funkcyjne stawia się w opozycji do programowania imperatywnego. Dla przykładu: kolekcje z Javy są stricte imperatywne. Operacja kolekcja.add albo mutuje kolekcję albo rzuca wyjątkiem. Funkcyjny odpowiednik w Scali tworzy nową kolekcję z elementami ze starej kolekcji plus nowym elementem. To jest bardzo duża różnica. W Javie 8+ są niby streamy, ale to ma poważne wady. Oprócz tego, że jest strasznie rozwlekłe w porównaniu do odpowiedników ze Scali to jeszcze nie da się zrobić pojedynczej modyfikacji kolekcji bez przebudowania jej w całości od nowa. W Scali można też użyć monad IO (np. ZIO czy Cats Effect) i mieć kod generalnie analogiczny do kodu w Haskellu. Ogólnie Scala daje duży wybór. Można pisać mocno funkcyjnie, a można pisać też mocno imperatywnie. To jest ważne, a nie czy pewne szczegóły implementacyjne (np. kolejność inicjalizacji parametrów w klasach) się pokrywają czy nie.
Główny wariant Scali jest uruchamiany na platformie Java, ale to nie znaczy, że np. Scala jest przez to mało funkcyjna. To czy masz kod funkcyjny zależy od tego co napiszesz i na co pozwala język. W Scali kod funkcyjny pisze się wygodnie, a kod działa wydajnie. Zaletą tego, że Scala chodzi na JVMie jest dostęp do całego ekosystemu narzędzi integrujących się z JVMem: profilery, samplery, debuggery, wzbogacanie bajtkodu, agenty JVMki, itp itd Do tego sam JVM oferuje rozbudowanego JITa, wielość różnych GC, przenośność (wraz z wieloplatformowymi GUI toolkitami), itp itd W ogólnym rozrachunku oparcie języka Scala o platformę Java jest zdecydowanie dobrym posunięciem.
Co do samej platformy Java to się przecież rozwija. Język Java rozwija się stosunkowo wolno (co mnie, scalowca, średnio boli), a przez częste wydania (co pół roku) to lista nowości (dotycząca samego języka) w każdym wydaniu jest krótka (i dlatego niektórzy się bezsensownie podśmiechują). Intensywniej rozwija się platforma Java jako całość, zwłaszcza jeśli weźmiemy dodatkowo pod uwagę GraalVMa.
Java jest platformą dla biznesu. Tutaj ważne jest, by 10-letnia biznesowa krowa dalej działała wydajnie, mimo zdegradowanej z czasem jakości kodu i masy niepotrzebnych rzeczy. Sprytny JIT, dobrze skalowalne GC z niskimi pauzami, narzędzia pozwalające łatwo i szybko znaleźć problemy wydajnościowe - to się liczy. Ekscytująca składnia czy brak podobieństwa do Javy (niektórzy się tym chełpią) są zdecydowanie mniej ważne.
PS: podobno są jakieś odległe plany dodania do języka Java type classes, ale nie mogę tego zguglać teraz. Dla C# jest jakaś propozycja: https://github.com/dotnet/csharplang/issues/110 Ich dodanie nie sprawi, że te języki będą automatycznie bardziej funkcyjne. Co najwyżej zmniejszy się nacisk na OOP.