3 marca 2014

Clojure - język funkcyjny osadzony na JVM

CLOJURE wg. wiki. jest to nowoczesny dialekt języka programowania Lisp, ogólnego przeznaczenia, który wspiera modyfikację uruchomionego programu i zachęca do programowania funkcyjnego oraz współbieżnego.

Tak się składa, że zawitałem ostatnio na warsztaty programowania w języku Clojure zorganizowane w Poznaniu i z niesamowitą lekkością ;-) w ciągu kilku pierwszych godzin testowałem sam język i jego możliwości, po czym kodowałem projekt prostej gry w Clojure oraz Clojure Script. Poniżej zechciałem dla siebie i innych sporządzić notatki z warsztatu n.t. Clojure.

Clojure cechy ogólne

  • kompilowany do bajtkodu JVM (Java Virtual Machine)
  • w pełni zgodny z językiem Java - można wykorzystywać klasy (bytekod) z Java w Clojure
  • domknięcia z naciskiem na rekurencję
  • Bogata biblioteka stałych struktur danych
  • repozytorium pakietów wraz z czymś takim jak szablony użycia, gotowe prototypy zapewniające szybsze pisanie kodu i przede wszystkim poznanie modułu
  • bogata biblioteka stałych struktur danych
  • Silne wsparcie dla współbieżności w postaci transakcyjnej pamięci (ang. Software Transactional Memory – STM) i systemu agentów
  • makra służące do definiowania funkcji jak w języku Scheme

Clojure jest dynamicznym językiem programowania

Wiem, że jest to zbyt ogólne pojęcie i już wyjaśniam. W Clojure ponad interpretację i kompilowanie kodu została wyniesiona idea odkrywania, testowania, wykonywania na bieżąco w trakcie programowania każdej linijki kodu. Clojure można osadzać w języku Java. Posiada on dedykowaną konsolę do uruchamiania kodu zwaną REPL (Read-Eval-Print-Loop), która umożliwia pracę zgodnie główną ideą Clojure napisz linijkę kodu, wykonaj, przetestuj, popraw i tak powtarzaj w pętli.

Clojure jest językiem funkcyjnym

Zapewnia to unikanie zmiennego stanu obiektu, proponuje funkcje jako obiekty "pierwszo klasowe", wspomaga iterację rekursywną zamiast ubocznego efektu rozwiązań bazujących na pęlach. Clojure powstał z myślą o zastosowaniach funkcyjnych, kiedy większość kodu wspiera ten sposób interpretacji rzeczywistości.

Clojure jest dialektem języka List

Idea - kod jako dane - zaczerpnięta z Lispa jest dość banalna a zarazem potężna. Opis funkcji w Clojure bazuje na systemie makr i danych, które te makra przetwarzają. Jednym ze znanych mi przypadków praktycznego użycia jest definicja cennika, który bazuje na makrach i strukturach danych zapisanych w jednym kodzie. Zmiana struktur danych jest możliwa na zasadzie pomyślnej interpretacji kodu Clojure. Mamy konwencję do przechowywania danych w strukturach, struktury, walidację oraz makra zapewnione na poziomie jednego języka/pliku opisującego byt/y.

Clojure jest w pełni współbierzne

Dzisiejsze systemy posiadają wiele niezależnych zadań działających na wielordzeniowych procesorach. Rozwiązania oparte o wątkisą dość kosztowne i skompilowane, ze względu na sekcje krytyczne i synchronizację. Clojure upraszcza wielowątkowość na kilka sposobów. Dzięki temu, że typy danych są niemutowalne (bezstanowe) możliwe jest łatwe rozpraszanie zadań.

Clojure jest osadzony na JVM

Clojure jest wbudowanym rozwiązaniem i bardzo dobrze integruje się z językiem Java, podobnie jak Groovy, czy Scala umożliwa tworzenie aplikacji które działają na jednej wirtualnej maszynie i na mogą róznież w ten współdzielić zasoby, przez co zarazem cachować w ramach jednej instancji JVMa.

ClojureScript - dedykowany dialekt tłumaczony do JavaScript

Oczywiście jak każdy współczesny język również Clojure zdecydowało się na posiadanie własnego odpowiednika JavaScript, który ma składnie Clojure, lecz pod spodem kompiluje się do Java Script i potrafi wykonywać się w ramach jednej aplikacji.

Jak na każdy niezależny język programowania przystało Clojure posiada również swój menadżer pakietów o nazwie Leiningen, który zadba o to aby zależności wymagane w projekcie zostały pobrane i ew. skompilowane do bajtkodu.

Polecam zapoznanie się z tematem jezyka programowania Clojure i byćmoże to będzie język przyszłości:-)

Linki:

http://clojure.org/

http://www.verious.com/board/AKumar/using-mutable-state-in-clojure/

http://clojure.com/

http://java.ociweb.com/mark/clojure/article.html

http://clojurescriptone.com/