Język programowania Scala

Język programowania Scala

Pisałem już jak to się stało, że zamiast w JavaScripcie programuję w Scali oraz zacząłem artykułem o for comprehensions pisać serię z cyklu „o Scali” . Postanowiłem jednak wrócić do sedna sprawy – czyli skupić się na samym języku programowania Scala. Sprawdzimy również czy język programowania Scala to dobry materiał by zacząć przygodę z pisaniem swoich kawałków kodu.

Wielkim zaskoczeniem to nie będzie, ale niech formalności stanie się zadość – nazwa języka Scala oznacza „język skalowalny” (eng. scalable language).

 

Sposób pisania w języku Scala pozwala używać go do „wszystkiego”. Mam na myśli proste skrypty, małe komponenty, całe aplikacje webowe, ogromne projekty, frameworki, Twitter’a czy Netflixa. Używanie Scali deklaruje również LinkedIn, IBM, NASA, Sony, Apple czy Amazon (i wiele więcej).

Kto używa Scali?

Czytelność kodu

Zacznijmy od warstwy wizualnej i postępujmy stopniowo w dół. Jako, że język Scala, tak samo jak Java, kompiluje się do bytecodu JVM, porównam Scalę właśnie z tym językiem programowania. Programiści, którzy przeszli z Javy na Scalę twierdzą, że kod potrafi być do 10 razy krótszy, zachowując swoją funkcjonalność. To oczywiście przekłada się na mniejszą ilość błędów, ich szybsze lokalizowanie, czytelność kodu, mniejszy nakład pracy, no i większą satysfakcję .


//Definicja klasy tajnej misji (Java)
class TopSecretMission {
    private String secretCode;
    private boolean completed;
    
    public Spaceship(String secretCode, boolean completed) {
        this.secretCode = secretCode;
        this.completed = completed;
    }
}
  

//Definicja klasy tajnej misji (Scala)
class TopSecretMission(secretCode: String, completed: Boolean)

  

Przyznasz, że powyższy fragment kodu w języku Scala wygląda to znacznie schludniej, zrozumialej oraz przyjaźniej. Nie tylko w powyższym przykładzie, ale również w innych aspektach, Scala implementuje rzeczy za nas – często są to powtarzalne fragmenty, które nie wnoszą wartości dodanej.

Scala jest językiem typowanym statycznie (i to mocno), a skoro jesteśmy pod nagłówkiem „Czytelność kodu”, zobaczmy jak to wpływa na wspomnianą czytelność. Poruszyłem już tę kwestię w pierwszym poście, ale pozwolę sobie przypomnieć. Języki typowane dynamicznie nie wymagają pisania typów przy deklaracji zmiennej. Definicja zmiennej, która przechowywać będzie imię definiowana jest w sposób np. var imie = "Paws". Zazwyczaj w typowaniu statycznym jesteśmy zobligowani do podania typu przy definicji zmiennej:  val imie: String = "Paws". Zgodziłbym się bez wahania, że zmniejsza to czytelność gdy używamy skomplikowanych typów lub jest ich zwyczajnie dużo. Scala posiada na szczęście inferencję typów – oznacza to, że język Scala „domyśli” się jaki typ ma zmienna. Patrząc na przykładowe fragmenty napisane w Scali, można zauważyć, że proste typy są pomijane i zapisywane podobnie jak w językach typowanych dynamicznie. Pisząc w taki sposób w Scali (np. skrypty) odnosi się wrażenie, że nie jest typowana statycznie, a dynamicznie. Kolejny plus do czytelności!

Kontynuując wątek wizualny dodam, że w Scali możemy, ale nie musimy, używać średników. W gruncie rzeczy pomija się je całkowicie. Średniki przydają się np. gdy chcemy zapisać dwa wyrażenia w jednej linii. Gdy wcześniej pisaliśmy w PHP czy C++ będzie to nie lada wygoda, że nie ma potrzeby się od średników odzwyczaić.

 

 

Scala jest obiektowa. Scala jest funkcyjna.

O Scali można powiedzieć, że jest to język zorientowany obiektowo i to dość mocno. Tak mocno, że wszystko w Scali jest obiektem. Czy funkcja jest obiektem? Tak! Funkcja jest obiektem. To samo tyczy się operatorów. Gdy dodajemy do siebie dwie liczby czy dwa ciągi znaków, to operator + jest niczym więcej jak wywołaniem metody zadeklarowanej w klasie Int lub String.
Scala ma to do siebie, że implementuje prawdziwe programowanie obiektowe, jak wspomniałem wcześniej – wszystko jest obiektem. Java również jest językiem zorientowanym obiektowo, jednak dopuszcza istnienie wartości prymitywnych jak: byte, short, char, int itd., które nie są obiektami. Podobnie jest z metodami czy wartościami, które nie należą do obiektów.

Co mnie zauroczyło w Scali to trait’y (trait), czyli coś na wzór interfejsu w Javie. Trait od interfejsu wyróżnia się tym, że umożliwia definiowanie wewnątrz siebie pól oraz metod. I to nie samych abstrakcyjnych definicji, również ich implementacji! Dodatkowym atutem jest to, że chroni programistę przed „diamentowym problemem” dziedziczenia. Osobiście nie natrafiłem na ten problem, jednak w kilku źródłach spotkałem się ze stwierdzeniem, że Scala wybawia od tego typu sytuacji.

„Diamentowy problem” pojawia się, gdy dziedziczymy z wielu miejsc. Przykładowo: mamy klasę FooA, która jest rozszerzana przez klasę FooB oraz FooC. Następnie tworzymy klasę FooD, która dziedziczy z FooB oraz FooC – i tutaj pojawia się problem z diamentem. Polega on na tym, że w klasie FooD klasa FooA została dodana podwójnie. Java rozwiązała to uniemożliwiając wielokrotne dziedziczenie. To trochę jak zburzyć dach, żeby nie przeciekał.

Język programowania Scala, to również pełnoprawny język funkcyjny. Co za tym idzie, funkcje traktowane są tak jak zmienne, a wartości nie są modyfikowane tylko mapowane. Funkcje można przekazywać jako argumenty, można tworzyć funkcje wewnątrz funkcji oraz zwracać funkcje. Język Scala pozwala programować tylko funkcyjnie, jeśli taka jest nasza wola. Gdy wolimy obiektowy punkt widzenia – nie ma problemu. Urok Scali polega na tym, że w wielu miejscach mamy wolność wyboru.

Czy Scala jest skalowalna?

Inaczej twórcy języka nieźle wygłupiliby się nazywając język „Skalowalny” gdyby skalowalny nie był . Nie wygłupili się jednak i w prosty sposób można zauważyć, że możemy ją rozciągać, poszerzać, skalować w którą stronę chcemy.

Według książki „Programming in Scala” największy przyczynek do skalowalności języka ma jego obiektowo-funkcyjna natura. Tak samo twierdzą inne, nie książkowe a internetowe publikacje.

Bardzo ogólne jest stwierdzenie, że to natura języka czyni go skalowalnym. W skalowalności Scali nie chodzi o to, że mając napisany program możemy automagicznie rozłożyć go na 3 serwery czy sprawić, że będzie bardziej wydajny lub obsługiwał większą ilość połączeń. 

"Scala is deep where other languages are broad."
Martin Odersky
Współtwórca Scali

Skalowalność Scali opiera się głównie na dwóch filarach:

  • Możliwościach zastosowania – Niezależnie czy chcemy napisać aplikację webową, skrypt na 20 linii czy system obsługi magazynów na 3 kontynenty – Scala jest dla Ciebie. Nie jest ograniczona do jednego typu działań, jest jak scyzoryk szwajcarski.
  • Możliwościach dostosowania – Wolność ekspresji i modyfikacji struktur, typów czy wyrażeń. Przykładem we wspomnianej wcześniej publikacji „Programming in Scala” jest framework używający aktorów. Jego stosowanie w tworzonych aplikacjach wygląda jak natywne, zaimplementowane w języku rozwiązanie.
Warto również wspomnieć, że Scala oferuje konwersje niejawne (implicit conversions). Stosowane są one między innymi, gdy wyrażenie jest typu A i nie odpowiada ono typowi B. Na przykład gdybyśmy chcieli dodać do wspomnianej wcześniej klasy TopSecretMission liczbę 5. Deklarujemy wtedy w klasie metodę, przyjmującą typ Int i po sprawie (justAnotherSecretMission + 5). A co gdy chcemy na odwrót dodać liczbę 5 do naszej klasy TopSecretMission (5 + justAnotherSecretMission)? Klasa Int nie posiada funkcji dodawania TopSecretMission, a Scala nie wie jak przekonwertować Int na TopSecretMission. Wtedy szuka definicji wartości/metody domniemanej, która przyjmuje typ Int i zamienia go na TopSecretMission. Tak jak poniżej.
implicit def int2mission(x: Int): TopSecretMission = 
        new TopSecretMission(s"SecredCode: $x", false)
Nie jest to filar skalowalności języka programowania Scala jednak z pewnością jest drogocennym narzędziem. Dodatkowo chciałem o nim wspomnieć w tym miejscu, ponieważ sprawia, że Scala staje się znacznie elastyczniejsza.

Czy Scala to dobry język na początek?

Alvin Alexander w książce „Scala Cookbook” twierdzi, że Scala to nie jest najlepszy język na rozpoczęcie przygody z programowaniem. W książce „Programming in Scala„, której współautorem jest współtwórca Scali, jest napisane, że Scala to „fine first programming language„. Fine tłumaczy się nie jako „wspaniały”, lecz „w porządku” czy „dobry” – więc jednoznacznie nie jest to najlepszy wybór na start. Osobiście nie polecam zaczynać przygody programowania od Scali, ponieważ na ten język składają się zapożyczenia z wielu języków: Javy, C++, Haskella, Erlanga i jeszcze kilku innych języków programowania. Niektóre rzeczy łatwiej zrozumieć, gdy dochodzi się do nich stopniowo.

Oczywiście jak ktoś jest uparty, to i Scala jako pierwszy język programowania może okazać się dobrym rozwiązaniem. Jeśli chcesz pobawić się Scalą tylko przez chwilę, to polecam kompilator online scalafiddle.io. Można również po prostu zainstalować Scalę i skorzystać z narzędzia REPL (Read–Eval–Print-Loop). Zachęcam również do poczytania o cudownym narzędziu do obsługi list, wartości opcjonalnych, funkcji asynchronicznych i wielu innych wartości !

2 thoughts on “Język programowania Scala

    1. Cześć Daniel!

      Artykuł, który wysłałeś opisuje wybór języka, którym wykwalifikowana osoba zamierza uczyć programowania. Gdy ktoś nad nami czuwa i pilnuje by programując funkcyjnie nie używać var’ów i trzymać się paradygmatów programowania funkcyjnego to oczywiście Scala nada się idealnie. Samemu jednak, na własną rękę łatwo zboczyć z właściwego toru, szczególnie, że Scala umożliwia jednocześnie programowanie obiektowe i wiele innych wariacji.
      Jeżeli ktoś potrafi się uczyć, wie czego chce i trzyma się właściwej ścieżki to Scala będzie bardzo dobrym wyborem – problem w tym, że zaczynając przygodę z programowaniem nie do końca jeszcze wiemy co i jak

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Back to top