Clojure. Nowy Lisp

Bezpłatny fragment

Wywiad z Richem Hickeyem

Dlaczego Clojure?

Infrastruktura

Z czym go porównać?

Zrozumienie języka Clojure – dlaczego Lisp nadal się liczy

REPL

Wektory i słowa kluczowe

Makra

Tożsamość, wartość i stan w Clojure

Model obiektowy

Model Clojure

Programowanie współbieżne w Clojure

Prosty problem programowania współbieżnego

Rozwiązania w Clojure

Przypisy

WYWIAD Z RICHEM HICKEYEM

AUTOR – Michael Swaine

Clojure jest jednym z najciekawszych nowych języków. Jest elegancką, czystą wersją języka Lisp, która powstała do celów programowania funkcyjnego. Została zaprojektowana do współbieżności i, podobnie jak Scala, kompiluje się na bajtowy kod JVM.

Clojure rozwiązuje problemy, które ograniczały Lisp (biblioteki, czytelność, wydajność), zachowując jego zalety. Ale tym, co napędza żywe zainteresowanie Clojure, są jego możliwości w zakresie programowania współbieżnego. Jak wskazują Stuart Halloway i Aaron Bedra: „Potężny sprzęt wielordzeniowy jest w zasięgu ręki, a języki funkcyjne zapewniają jasne podejście do jego wykorzystania”[1]. Dla tych właśnie zastosowań powstał język Clojure, dlatego chciałem porozmawiać z jego twórcą – Richem Hickeyem.

Dlaczego Clojure?

MS: Rich, dziękuję, że poświęciłeś mi swój czas. Chcę skupić się w zasadzie na jednym pytaniu: dlaczego? Z punktu widzenia programistów na co dzień mierzących się z różnymi problemami, chcę zapytać: Co w nim jest dla mnie? Dlaczego powinienem zapoznać się z Clojure? Dlaczego mam zainwestować swój czas w jego naukę? Jakie korzyści będę miał z programowania w Clojure?

RH: Oczywiście.

MS: Fajnie. Załóżmy więc, że jestem niezależnym deweloperem i choć nie odczuwam osobiście problemów z kryzysem ekonomicznym, widzę oznaki sugerujące, że może się zmienić rodzaj moich klientów. Chcę stale poznawać nowe języki i technologie, aby rozszerzyć moje możliwości. Dlaczego język Clojure powinien znaleźć się na mojej krótkiej liście technik rozwijających moją karierę?

RH: Jeśli nie masz jeszcze doświadczenia z programowaniem funkcyjnym, Clojure może zaoferować najłatwiejszy sposób, aby tego dokonać. Niektórzy określają go jako „pythona programowania funkcyjnego”, a ja akceptuję wszystkie pozytywy, które to określenie oznacza. Bezproblemowy dostęp tego języka do ekosystemu Javy oznacza, że niczego nie stracisz w dostępie do bibliotek, a twoje aplikacje będzie można dostarczyć w akceptowanym środowisku. Clojure to język nowy, ale nie znajduje się w próżni. Infrastruktura leżąca u jego podstaw, czyli JVM, to świetna technologia.

MS: Argumentem, który przemawia dzisiaj za programowaniem funkcyjnym, są mikroprocesory wielordzeniowe i programowanie współbieżne. Powiedzmy, że wiem coś o programowaniu funkcyjnym i mam określone potrzeby, aby je zastosować do programowania współbieżnego. Dlaczego Clojure to odpowiedni język?

RH: Clojure jest zaprojektowany na potrzeby programowania współbieżnego, a przemawia za tym styl funkcyjny i powszechna niemutowalność, które są wymogami dla współbieżności. Struktury danych są niemutowalne, a wartości lokalne nie są „zmiennymi”. Jednak Clojure bierze pod uwagę także potrzebę stanu w rzeczywistych aplikacjach i zapewnia mechanizm językowy do zarządzania stanem, który pozwala uniknąć problemów z blokadami i impasami występującymi w innych językach. Wśród języków funkcyjnych (jak np. Haskell, ML) Clojure jest dość nietypowy, gdyż jest dynamicznie typowany i jest powiązany z podstawową infrastrukturą.

Infrastruktura

MS: Porozmawiajmy o infrastrukturze. Powiedzmy, że jestem deweloperem piszącym w Javie. Nie boję się uczyć nowego języka, ale nie chcę porzucać całego ekosystemu języka Java. Co oferuje mi Clojure?

RH: Clojure pozwala nam na to – uczymy się czegoś nowego i nie odrzucamy naszych inwestycji i wiedzy. To dotyczy jednak wszystkich języków JVM: Groovy, JRuby, Scala itp. Clojure jest unikalny z tego względu, że oferuje nam wydajność skompilowanego języka i elastyczność języka dynamicznego. Wydajność jest bliższa wydajności Javy niż Pythona. Dostęp do Javy z Clojure i do Clojure z Javy jest łatwy, niewymagający opakowywania i szybki.

MS: Wydajność Clojure może być bliższa wydajności surowej Javy, ale doświadczenie programowania w Clojure zupełnie nie przypomina Javy.

RH: Clojure różni się od Javy bardziej niż inne popularne języki JVM, a jest tak nie bez powodu – chcemy, żeby wszystko wyglądało inaczej, jeśli mamy wykorzystać wielordzeniowość, a nasze duże programy obiektowe stały się rozwlekłe. Jeśli naprawdę chcemy nauczyć się czegoś nowego, zamiast robić to samo co dotychczas, tylko nieco inaczej, Clojure to dobry wybór.

MS: OK, wyobraźmy sobie, że rozmawiasz ze starym hakerem Lispa, którym w zasadzie jesteś. I powiedzmy, że poszedłeś dalej. Wydajność, biblioteki, dopasowanie do innych – z jakiegoś powodu zrezygnowałeś z Lispa. Dlaczego Clojure ma spowodować powrót do tego?

RH: Closure, jako dialekt Lispa, oferuje to wszystko, co kochamy w Lispie – interakcyjne tworzenie, elegancję, zwięzłość, rozszerzalność i ekspresyjność. Jest ukierunkowany dokładnie na te obszary, które sprawiały, że ludzie w przeszłości porzucali Lispa lub nie mogli z niego korzystać, w szczególności biblioteki i administracja. Jest ukierunkowany na wykorzystanie ogromnej pracy wykonanej w Javie, posługując się programami Javy. Ponadto Clojure przenosi Lisp dalej w zakresie włączania najlepszych pomysłów powstałych w ostatnich latach – budowanie podstawowej biblioteki na abstrakcjach opartych na interfejsie, leniwych ciągach, skojarzeniowych strukturach danych pierwszej klasy itp. Języki Lisp były nazywane językami funkcyjnymi, ale Clojure sięga znacznie głębiej niż Common Lisp lub Scheme.

MS: Clojure ma teraz wersję jeden kropka coś tam. To może oznaczać różne rzeczy. Czy Clojure poza dobrym wykorzystaniem programowania funkcyjnego jest gotowy na dominację? Powiedzmy, że chcę go użyć w pracy produkcyjnej. Czy Closure będzie stabilny?

RH: Clojure jest dość solidny. Ma niewielkie jądro, które rzadko się zmienia, i tysiące użytkowników bazujących na nim. Integruje się z ekosystemem narzędzi Javy, więc debugerzy JVM, profilerzy itp. mogą natychmiast podjąć pracę. Zaawansowana jest integracja z IDE z dobrymi wtyczkami do NetBeans i IntelliJ.

Z czym go porównać?

MS: Spróbujmy dokonać bezpośredniego porównania. Powiedzmy, że poświęciłem czas na naukę języka Erlang. Dlaczego powinienem wybrać Clojure’a zamiast Erlanga?

RH: Nie lubię angażować się w antagonizmy, zwłaszcza w porównania z Erlangiem, który podziwiam. Jeśli mamy naprawdę aplikację, do której najlepiej pasuje Erlang – na przykład rozproszoną aplikację komunikacyjną niskiego poziomu z wysokimi wymaganiami na utrzymanie działania – trudno jest go pobić. Clojure jest językiem ogólnego przeznaczenia, ma lepszą wydajność obliczeniową, lepszą obsługę wewnętrznego procesu SMP dla współbieżności oraz znacznie lepszą historię zastosowania bibliotek i współdziałania. Do dystrybucji można wybrać jedną z wielu technik i narzędzi, w tym kolejki komunikatów, z których część napisana jest w… Erlangu.

MS: No dobrze. To samo pytanie dla nowego dewelopera w Scali. Dlaczego powinienem wybrać Clojure zamiast Scali?

RH: Clojure jest prostszy. Jest dynamiczny. Ma mniej paradygmatów do obsłużenia i jest bardziej skupiony na funkcyjności. Należąc do rodziny Lispa, ma regularną składnię, a rozszerzenia składniowe są bardzo spójne. Nie jest językiem obiektowym, więc biblioteki Clojure mają inną strukturę, zachęcając do szerszego wykorzystania generycznych struktur danych, co daje większą możliwość współdziałania. Clojure opiera się na idei, że niemutowalność i programowanie funkcyjne są ważniejsze dla stabilności programu niż typy statyczne. Jeśli te wartości ci pasują, z pewnością będziesz wolał Clojure, ale moim zdaniem Clojure i Scala powinny pokojowo współistnieć.

MS: Cóż, przekonałeś mnie, że Clojure jest wart uwagi. Dziękuję za poświęcenie czasu na tę rozmowę.

RH: To było pouczające. Dziękuję za zaproszenie.

W kolejnych rozdziałach Michael Bevilacqua-Linn wprowadza nas do programowania funkcyjnego w Clojure, zaczynając od spojrzenia na jego początki w Lispie.

PRZYPISY

[1] Programming Clojure (2nd edition) [HB12].