Scala logo

Scala

Scala jest to wieloparadygmatowy język programowania wysokiego poziomu.

Główne paradygmaty:

Obiektowy

Scala jest językiem obiektowym w czystym tego słowa znaczeniu - w Scali wszystko jest obiektem. Typy danych i zachowania obiektów opisane są przez klasy i cechy. Po klasach abstrakcyjnych dziedziczą podklasy, a problem wielodziedziczenia rozwiązuje mechanizm oparty na domieszkach.

Cecha - pojęcie używane w programowaniu obiektowym, reprezentujące zbiór metod, których można użyć do rozszerzenia funkcjonalności klasy. Cechy w Scali są poniekąd odpowiednikiem interfejsów w Javie.

Domieszka - klasa, która umożliwia korzystanie z jej metod w innych klasach bez konieczności dziedziczenia z niej. Nie można utworzyć obiektu domieszki. Klasa może pozyskiwać dodatkowe funkcjonalności korzystając z wielu domieszek.

Funkcyjny

Scala łączy w sobie funkcyjność i obiektowość oraz zapewnia wiele mechanizmów i elementów charakterystycznych dla języków funkcyjnych. Przykładowe cechy Scali nadające językowi charakter funkcyjny:

  • Brak rozróżnienia pomiędzy wyrażeniami a instrukcjami
  • Inferencja typów (identyfikacją typów zajmuje się kompilator)
  • Funkcje anonimowe
  • Leniwe wartościowanie
  • Funkcje wyższego rzędu
  • Zagnieżdżone funkcje
  • Rozwijanie funkcji (currying)
  • Dopasowania do wzorca (pattern matching)

Wielowątkowość:

W Scali podstawowym mechanizmem wspierającym wielowątkowość jest mechanizm Aktorów - wielowątkowych procesów, które komunikują się poprzez wymianę wiadomości. Aktora można traktować jako aktywny obiekt, w którym wywołanie odpowiedniej metody odpowiada wysłaniu wiadomości. W Scali biblioteka Actors zapewnia zarówno asynchroniczne, jak i synchroniczne przesyłanie wiadomości. Co więcej, Aktorzy mogą komunikować się z wykorzystaniem Future - mechanizmu, gdzie żądania są obsługiwane asynchronicznie, ale zwracają reprezentację, która pozwala poczekać na odpowiedź.

Wirtualna maszyna Javy:

Scala działa na Wirtualnej Maszynie Javy (JVM) i jest kompatybilna z programami napisanymi w Javie. Aplikacje przeznaczone na Androida zazwyczaj pisane są w Javie i tłumaczone z kodu bajtowego Javy. Dzięki kompatybilności z Javą, Scala dobrze sprawdza się przy tworzeniu aplikacji mobilnych na Androida (szczególnie stosując podejście funkcyjne).

Przykładowy kod:


object abstractTypes extends Application {
  abstract class Buffer {
    type T; val element: T
  }
  abstract class SeqBuffer {
    type T; val element: Seq[T]; def length = element.length
  }
  def newIntBuffer(el: Int) = new Buffer {
    type T = Int; val element = el
  }
  def newIntBuffer(el: Int*) = new SeqBuffer {
    type T = Int; val element = el
  }
  println(newIntBuffer(1).element)
  println(newIntBuffer(1, 2, 3).length)
}
  
      

Źródło: www.scala-lang.org/old/node/222