Scala - warto?

@Tomash skoro mieli wszystko na JVM mogli użyć Clojure… użyli Scali. :smiley:

Polecam obejrzenie prezentacji o Scali:
http://vimeo.com/17225633

Dla osób programujących w Ruby przejście na Scalę nie będzie wysiłkiem, jest to “podobny” język. Szybko odnajdziemy mixiny, bloki itp.

#scala.pl @ irc.freenode.net - zapraszam :slight_smile:

Spojrzałem sobie i na Scalę, i na Clojure i chyba faktycznie spróbuję się zagłębić w Clojure.

Scalę jest o wiele łatwiej pojąć, bo jest podobna do Ruby. No właśnie - w zasadzie chyba wszystko, co mogę zrobić w Scali, mogę też zrobić w (J)Ruby, więc ogarnianie Scali na razie wydaje mi się trochę nieciekawe, tym bardziej, że w Polsce z ofert pracy dla koderów Scali jest pewnie mniej-więcej tyle samo, co ofert dla koderów Clojure.

Clojure jest natomiast dla mnie duuużo bardziej brainfuckowe niż Scala, nie ma się co dziwić - ten język ma całkiem inne zastosowanie. Ale po ogarnięciu API i kilku tutorialach nie powinno być tak źle, a sam język jest ciekawszy od Scali.

Wszystko co możesz zrobić w JRuby możesz zrobić w Scali, ale scala to znacznie większy świat, teoria kategorii, monady, funktory, leazy evaluation, pattern matching, pod typy, nadtypy i sam nie wiem co jeszcze w sumie się na tym nie znam :wink:

Uch, ale w Scali masz bardzo fajnie zrobioną współbieżność wzorcem Actor. Nawet Matz tego Scali zazdrości i chciałby Actor Pattern mieć jako preferowany sposób robienia “konkurencji” :wink: w Rubym.

(co nie zmienia faktu że język generalnie jest strasznym miszmaszem, niespójnym i ogólnie nie podnieca mnie jak patrzę na jego składnię)

Do Clojure jest fajny framework (nooo, taki mikroframework, a’la Sinatra) webowy, Compojure. Był chyba nawet ficzerowany na blogu Githuba :slight_smile:

Co konkretnie jest niespojne w scali?
Co do skladni - kwestia przyzwyczajenia. Scala jest o wiele bardziej skomplikowana niz ruby wiec nie ma sie co dziwic.

Co do frameworków:

  • sinatra -> scalatra
  • rails -> play
  • ??? -> liftweb

Po kilku latach z ruby ciesze sie ze kompilator skali odwala za mnie kupe roboty a sam jezyk sprawia ze programy napisane w scali sa miliard razy mniej podatne na bledy niz rubiowe.

Wszystko sprowadza sie do jednego: scala JEST trudna…

LOL.

Tomash, chyba nie wiesz z czego się śmiejesz. Teamon miał pewnie na myśli, że dzięki systemowi typów w Scali nie trzeba pisać aż tylu testów jednostkowych co w języku dynamicznym; i wiele błędów wyłapie ci kompilator zanim jeszcze uruchomisz kod. Z drugiej strony Clojure 1.3 ma type hints, wię można kod trochę uszczelnić… Poza tym w Scali masz named parameters (Ruby do dziś jest tu na poziomie PHP) i czytelne zarządzanie modułami i przestrzeniami nazw (bardziej explicite, jak w Pythonie), no i wydajność, Scala jest szybsza od Clojure i JRuby, potrafi czasami być nawet szybsza od samej Javy (sic!).

Zapomniałem dodać, że Scala za pomocą implicite conversions jest bezpieczniejsza od Ruby, bo uzyskuje efekt otwartych klas bez ich otwierania i globalnej modyfikacji (implicite conversions są ograniczone do leksykalnego kontekstu). Także Duck typing w Scali jest bezpieczniejszy, bo nie pozwoli skompilować kod który jakieś niedorzeczności przekazuje jako parametr, np. obiekt który wcale nie ma metody jaką powinien mieć). Zobacz http://blog.zabiello.com/2010/01/23/scala-duck-typing

domyślam się, że ciężko będzie z dwoma przykładowymi aplikacjami + benchmark, ale mógłbyś chociaż podać w jakich zastosowaniach może być szybsza? Bo to całkiem interesujące :wink:

Chodzi np. o boxing i unboxing, to są kosztowne operacje. Javowy Int jest dużo wolniejszy od int. Scala nie ma sztucznego podziału na typy referencyjne i prymitywne. Dla programisty wszystko wygląda jak typy referencyjne, wszystko jest obiektem. Ale… pod spodem kompilator Javy dokonuje optymalizacji do prymitywów gdzie się tylko da. W efekcie kod Javy używający jawnie typu referencyjnego może być wolniejszy od kodu Scali, który dla programisty jest obiektem, ale pod spodem został zoptymalizowany do prymitywu.

Rzućcie okiem co na ten temat pisał Ola Bini jakies trzy lata temu. Jakby ktoś nie wiedział kim jest autor, to po pierwsze: implementator JRubiego, pod drugi “language hacker” jakiego nie znacie :wink:

Wracając do tematu - czy będziesz się uczył Scali, Clojure, Haskella czy Logo - nie ma znaczenia. Jeśli masz czas to spróbuj wszystkiego, bo chociaż większość się Tobie nigdy nie przyda, to na pewno Twoim horyzontom to nie zaszkodzi. I niekoniecznie patrz na to jaki język jest praktyczny w danej chwili.

@filiptepper - o ruby tez nie tak dawno mowiono ze sie nigdy nie przyda. A scala sie przydaje juz dzisiaj, mimo swojej “mlodosci”

Scala ma potencjalnie bardzo duże zastosowania - można napisać moduł w Scali do dowolnego projektu javowego i projekt będzie śmigał bez problemu, myślę że jest sporo firm, w których już się to praktykuje (pewnie bardziej na zachodzie).

Scala to jest ten język, którego będę się uczył jeśli będę się chciał uczyć nowego języka. Sądzę, że w pewnej perspektywie (najdalej kilku lat) wejdzie do mainstreamu (zakładając, że teraz się tam nie znajduje). Tzn. firmy, w szczególności tworzące obecnie oprogramowanie w Javie, będą przechodzić na Scalę.

To samo Groovy i Clojure. Ale w ten sposób ograniczasz promocję języka do ludzi mających istniejące i rozwijane projekty w Javie, na dodatek wystawiając ich na koszt dodatkowego języka w stosie technologicznym (o co najtrudniej, ze względu na konieczność utrzymania i wyszkolenia programistów, w korpach – a zgadnij jakie firmy mają najwięcej projektów w Javie?).

EDIT: i JRuby, i Ioee, i pewnie jeszcze kilka(naście?) innych :wink:

Słyszę to od roku 2008 w każdym flejmie o językach na JVM :wink:

To samo Groovy i Clojure.[/quote]
Dlatego, że Scala jest statycznie typizowana i wspiera inferencję typów, a dla niektórych ludzi to ma znaczenie. Poza tym, nie znam nikogo kto programowałby zawodowo w Groovym ani w Clojure, a znam ludzi, którzy pracują w korporacjach i dla tych korporacjach używają Scali. Na pozostałe języki nawet się nie natknąłem (oczywiście z wyjątkiem JRubiego).

BTW: czytałeś post Ola (Oli?) Bini?