wtorek, 22 lipca 2008

Języki na JVM - Scala

Scala jest językiem, który moim zdaniem zyska dużo zwolenników. Podobnie jak Groovy został stworzony od podstaw i oparty na Javie. Również tutaj klasy Scala są poprawnymi klasami Java i dziedziczenie jest możliwe. Jednak wzoruje się na językach funkcyjnych takich jak SML i Ocaml, jest silnie, statycznie typowany i to bardzo odróżnia język od JRuby, Jython i Groovy.

Scala
  • Silna i statyczna typizacja - czyli po prostu jest i będzie szybszy niż 3 wcześniej wymienione, a narzędzia potencjalnie mogą być lepsze
  • Odgadywanie typu (type inference) - zdecydowanie mniej gadatliwy kod niż w Java
  • Czysto obiektowy (absolutnie wszystko jest obiektem)
  • Silnie funkcyjny z ładną obsługą powiązanych koncepcji
  • Przeciążanie operatorów
  • Pozwala na pewnego rodzaju wielodziedziczenie (mixin,trait)
  • Wzorzec singleton jest elementem języka
  • Kompilowany do bytecodu
  • Bezpośrednie korzystanie z typów Java
  • Możliwe dziedziczenie po klasach Java
  • W przyszłości będą możliwe cykliczne zależności tak jak w Groovy
  • Podobno ma lepsze generics niż Java :)
  • Obsługują adnotacje
  • Podsumowując możemy używać wszędzie tam gdzie Java, np. w JPA / Hibernate
  • Wspiera programowanie współbieżne (dzięki aktorom)
  • Jest i będzie szybszy niż Groovy, Ruby/JRuby, Python/Jython, JavaScript etc.
  • Istnieje kompilator Scala dla .Net
Przykładowe aplikacje w Scala: Lift

Język od początku został zaplanowany jako język funkcyjny, co to oznacza ? Szybki (mimo, że w kompilatory języków funkcyjnych nie zainwestowano tyle czasu co w kompilatory C/C++ to i tak zawsze są blisko czołówki w rankingach wydajności), łatwiejsza obsługa wielordzeniowości, język ładny, kompaktowy, naturalny w obliczeniach matematycznych...
def qsort(lst: List[Int]):List[Int] =
lst match {
case Nil => Nil
case pivot::tail => qsort(tail filter { _ < pivot }) ::: pivot ::: qsort(tail filter { _ >= pivot })
}
Oto definicja funkcji (w Scali do zmiennej można przypisywać funkcje, stąd taka notacja). Oczywiście algorytm to QuickSort. Teraz bardziej znajoma encja JPA:
@Entity
class SomeClass {
@Id @Generated
var id: Long = -1
var name: String = _
}
Jest dużo różnic między Java a Scala, bardzo dużo. Prawie każda koncepcja jest zmieniona lub nowa. Krzywa nauki jest z tego powodu stroma. Przy okazji jeszcze różnice między Java Groovy i Ruby.
Studiując różnice nie da się zauważyć, że najłatwiej zrozumieć Groovy, można go wprowadzać stopniowo zaczynając od Java, albo uczyć się od podstaw od razu w nowym stylu. Pewnie dlatego będzie cześciej spotykany od Scali, mimo że Scala jest/będzie szybszym, gotowym na wielordzeniowość - ogólnie scalowalnym językim. Może jednak wprowadza zbyt wiele zmian? Czy zwykłego szarego programiste można nauczyć Scali?

Wszystkie 4 dotychczas opisane języki posiadają konsolę - interpreter na bieżąco wykonujący podany mu kod, dzięki czemu możemy błyskawicznie uczyć się poznawać konstrukcje języków.

Jaki powinien być dobry język według mnie? Powinien być silnie i statycznie typowany z refleksją i odgadywaniem typów wszędzie gdzie to możliwe, mieć spójny model semantyczny, który jest zamienialny na sensowny diagramy akcji i sekwencji, pozwalać na styl funkcyjny, mieć domknięcia i definicję rozszerzeń języka.
Myślę, że pojawi się więcej lub zyskają na popularności języki funkcyjne lub tylko trochę "brudne obiektowo" lub nawet czysto funkcyjne, które będą bezpieczne we wszelkich obliczeniach równoległych (więc w sam raz na serwery web, usługi sieciowe, komunikatory i desktopy skoro za parę lat będziemy mieli 64+ rdzeni). Już widać powrót i ponowne wykorzystanie starego języka Erlang. Pewnie będą próby tworzenia systemów operacyjnych w takich językach. ok, kolejne posty będą bardziej praktyczne.

1 komentarz:

mateusz.fiołka pisze...

java, groovy, python, ruby -1
scala +1