Blog (30)
Komentarze (5.6k)
Recenzje (0)
@mikolaj_sDlaczego warto programować w Scali

Dlaczego warto programować w Scali

09.07.2014 | aktual.: 06.08.2014 00:02

Poza najpopularniejszym językiem platformy JVM istnieje wiele różnorodnych języków programowania, które potrafią w pełni wykorzystać możliwości tej maszyny wirtualnej i korzystać z bibliotek i narzędzi napisanych dla niej. Sama Java jest językiem dość starym i ciąży na nim konieczność utrzymywania przy każdej nowej wersji kompatybilności wstecznej, w taki sposób aby kod źródłowy programów napisanych dla wcześniejszych wersji JVM działał w nowszych wersjach. Choć Java ostatnio szybko się rozwija i w wersji ósmej pojawiają się w niej nowe konstrukcje w tym elementy programowania funkcyjnego, anonimowe funkcje, domknięcia itp., to niestety pozostały w niej niedoskonałości, które dzisiaj trudno jest z niego usunąć. Do takich można by zaliczyć fakt, że typy prymitywne Javy nie dziedziczą od klasy Object. Ma to swoje zalety, jednak bardzo utrudnia programowanie uogólnione. Jeżeli porównamy kod napisany w języku Java i kod napisany w niektórych innych językach dla JVM realizujący podobne zadanie to zauważymy, że najczęściej kod tych ostatnich jest krótszy, a tym samym zazwyczaj łatwiejszy do przeczytania i zrozumienia. Dotyczy to głównie języków typowanych dynamicznie takich jak Groovy, Jython czy JRuby, ale jest też przynajmniej jeden język typowany statycznie, dla którego to stwierdzenie jest również prawdziwe. Tym językiem jest Scala.

Języki JVM
Języki JVM

Java a sprawa Oracle vs Google

Innym poruszanym ostatnio problemem przez programistów Java jest sprawa pozwu Oracle przeciwko wykorzystaniu API Javy przez Google. Trudno zrozumieć tutaj niuanse prawne i przewidzieć jakie problemy mogą mieć inne projekty, które używają języka Java. Niektórzy uważają, że rozwiązaniem jest niekorzystanie z języka Java, a wykorzystanie jakiegoś innego języka pracującego na JVM.

522799

Scala

Nazwa Scala bierze się od słowa skalowalna, co według twórcy tego języka Martina Odersky'ego ma oznaczać, że język może być dostosowany do potrzeb użytkownika. W Scali można realizować bardzo różnorodne zadania, począwszy od prostych skryptów wywoływanych podobnie do skryptów Pythona, aż do wielkich systemów informatycznych. Technicznie rzecz ujmując, Scala jest językiem zorientowanym obiektowo i równocześnie funkcyjnie, ale typowanym statycznie. Dodatkowo, kompilator potrafi odgadywać w wielu sytuacjach samodzielnie typ obiektu, co umożliwia pisanie kodu wyglądającego jak w języku typowanym dynamicznie. Obiektowy paradygmat programowania pozwala wykorzystywać metodologie tworzenia oprogramowania, podobne do wykorzystywanych w innych językach, takich jak Java z użyciem UML itp. Natomiast elementy funkcyjne języka umożliwiają wysoką zwartość kodu, ale również bezpieczeństwo przetwarzanych danych, w szczególności przy programach wielowątkowych. Opiera się to na przekazywaniu między wątkami niezmiennych wartości. Po wyliczeniu nowej wartości stara zostaje odrzucona, natomiast powstaje nowa, którą przekazuje się dalej. (Działa to podobnie do klasy String w Javie, gdzie stringi są niemutowalne, a wszelkie operacje powodują powstanie nowego łańcucha znaków).

522802

Język ten ma dodatkowo taką zaletę, że styl funkcyjny, do którego nie jest przyzwyczajona większość programistów, nie jest obligatoryjny. Można pisać kod zbliżony do tego jaki pisało się w innym języku używając typowych pętli, a gdy będziemy gotowi, przejść do stylu programowania odpowiadającego programowaniu funkcyjnemu.

Kompatybilność z Javą

Każdy kod napisany w Javie może być wykorzystany w języku Scala. Nie ma konieczności przepisywania bibliotek. Możemy z dnia na dzień zmienić język na Scalę i cały nasz dotychczasowy kod wykorzystywać dalej. Co prawda część bibliotek zastępuje te z Javy, ale często opiera się na tych standardowych. Przykładowo scala.String posiada wszystkie te same metody co java.lang.String i jest zasadniczo rozszerzeniem tej ostatniej. Rozszerzenia te ułatwiają użycie stringów na przykład dostarczając metod typu toInt, toFloat itp. (wymienione metody pozwalają łatwo konwertować napisy na liczby). Również sam kod napisany w Scali może być wywoływany w kodzie Javy, ale wymaga to już uwagi ze strony programisty i nie używania elementów typowych tylko dla Scali, jak chociażby przeładowanie operatorów.

Zwięzłość

To chyba najważniejsza zaleta Scali. Jeśli czytamy kod, to jedną z ważniejszych jego cech pozwalających łatwiej go zrozumieć jest jego zwięzłość, w tym ilość linijek, które trzeba przeczytać, aby zrozumieć jakąś bardziej złożoną operację. I w tym Scala wychodzi wyśmienicie. (podobnie jak wiele języków dynamicznych)

Przykładowy kod w Javie:


 class MyClass {

      private int index;
      private String name;

      public MyClass(int index, String name) {
          this.index = index;
          this.name = name;
      }
  }

możemy zastąpić w Scali znacznie krótszym:

class MyClass(index: Int, name: String)

Wiele pomaga odgadywanie typów przez kompilator oraz korzystanie z przetwarzania funkcyjnego kolekcji co wydatnie skraca kod (zamiast używania pętli).

Scala jako język wysokiego poziomu

Walcząc ze złożonością kodu warto przechodzić na wyższy poziom abstrakcji, przerzucając niektóre zadania na gotowe konstrukcje. Scala posiada wiele takich konstrukcji pozwalających zajmować się bardziej dodawaniem naszej logiki do kodu niż odkrywaniem na nowo jak przetworzyć np. String na liczbę. Przykładowy kod sprawdzający czy napis posiada co najmniej jedną wielką literę:


 boolean nameHasUpperCase = false;
  for (int i = 0; i < name.length(); ++i) {
      if (Character.isUpperCase(name.charAt(i))) {
          nameHasUpperCase = true;
          break;
      }
  }

możemy napisać dużo krócej:

 val nameHasUpperCase = name.exists(_.isUpperCase)

To następny powód dla którego pisanie i czytanie kodu jest łatwiejsze i szybsze.

Statyczne typowanie

Zalet statycznego typowania nie można przecenić. Do zalet w stosunku do języków typowanych dynamiczne możemy zaliczyć:

  • mniejsza ilość testów
  • mniejsza szansa na błędy w run-time
  • bezpieczniejszy refaktoring
  • prostsze tworzenie i czytanie dokumentacji

Zazwyczaj musimy wybierać między ekspresywnością języka, a jego bezpieczeństwem, które daje nam kompilator. W przypadku Scali mamy jedno i drugie. To jakby zjeść ciastko i mieć je dalej.

Wykorzystanie w projektach

Scala nie jest tak popularna jak większość mainstreamowych języków programowania. Jednak nie jest to język egzotyczny. W indeksie serwisu Tiobe zajmuje 40 miejsce. To lepiej niż Erlang czy D. Jego popularność ciągle rośnie, a kołem zamachowym są wielkie firmy, które wprowadzają go do swoich narzędzi i pomagają rozwijając nowe narzędzia i biblioteki dla tego języka. Najbardziej znane zastosowania Scali to: Twitter - duża część serwisu została przepisana na Scalę, bardzo znany startup Foresquare pisze prawie wyłącznie w Scali, Sgrouples - startup mający walczyć z Facebookiem. W Scali piszą takie firmy jak HP, IBM, The Guardian, LinkedIn. Na polskim rynku jest sporo firm, które piszą w Scali. Wiele firm używa tego języka jako dodatkowego, ale są też takie gdzie jest on głównym. Czasem jednym z powodów pisania projektu w Scali jest fakt, że dobrzy programiści lubią poznawać nowe technologie i jest to sposób na przyciągnięcie uzdolnionych ludzi do projektu. Na szczęście nie obywa się to kosztem jakości pracy, a wręcz przeciwnie ludzie mający już jakiś kontakt z JVM i programowaniem funkcyjnym bardzo szybko stają się bardziej produktywni w pracy.

Podsumowanie

Warto rozważyć użycie Scali w nowych projektach, jak również zastanowić się nad dodawaniem nowych modułów dla programów napisanych dla JVM właśnie w Scali. W dłuższej perspektywie obniży to koszty utrzymania projektu. Minusem Scali jest jej złożoność. Język ten jest trudniejszy do opanowania niż Java. Programując nawet krótko w Scali można zauważyć, że pisanie programów w Scali można podzielić na dwa tryby: pisanie logiki aplikacji z wykorzystaniem gotowych bibliotek i tworzenie własnych bibliotek i modułów do wielokrotnego użytku. Ten pierwszy tryb jest bardzo łatwy i nie wymaga zbyt dużych umiejętności programisty, ani też znajomości zaawansowanych elementów języka. Natomiast ten drugi jest dość trudny i wymaga sporej wiedzy. W zamian napisany kod jest łatwiejszy w utrzymaniu i użyciu co jest opłacalne na dłużą metę.

Inną zaletą jest możliwość pisania skryptów w Scali, podobnie jak to się pisze w językach takich jak Python czy Ruby. Jedyna niedogodność to fakt, że ze względu na konieczność zadziałania za każdym razem kompilatora, samo uruchomienie skryptu trwa sporo dłużej niż przykładowo skryptu Pythona. Za to jeśli nasz skrypt wykonuje jakieś większe obliczenia to wykorzysta znacznie większą szybkość działania Scali w porównaniu do typowych języków skryptowych.

Ten przydługi wpis jest wstępem do krótkiego kursu Scali (w oparciu o Programming in Scala ).

Wybrane dla Ciebie
Komentarze (52)