2009-10-15 17 views

Odpowiedz

7

Nie będąc ekspertem od Clojure, powiedziałbym, że główną zaletą jest to, że Clojure ukrywa wiele szczegółów programowania współbieżnego i jak wszyscy wiemy, diabeł tkwi w szczegółach, więc uważam to za dobrą rzecz.

Możesz sprawdzić this excellent presentation od Rick Hickey (twórca Clojure) na współbieżność w Clojure. EDYCJA: Wygląda na to, że JAOO usunął stare prezentacje. Nie udało mi się jeszcze znaleźć nowego źródła.

+0

linki wydają się być uszkodzone. Ktoś ma działający? – Surya

+0

@Surya: Najwyraźniej usunęli stare prezentacje konferencyjne. –

+0

Czy myślałeś o tej prezentacji? http://clojure.blip.tv/file/812787/ – egbokul

-5

Ewolucja języka programowania Java jest dość powolna, głównie ze względu na obawy firmy Sun związane z kompatybilnością wsteczną.

Dlaczego nie chcesz używać bezpośrednio języków JVM takich jak Clojure i Scala?

6

Ponieważ świat rozwinął się w ciągu ostatnich 10 lat, a język Java (! = JVM) ma trudności z dotrzymaniem kroku. Więcej nowoczesnych języków dla JVM opiera się na nowych pomysłach i ulepszonych koncepcjach, co sprawia, że ​​wiele żmudnych zadań jest o wiele prostsze i bezpieczniejsze.

6

Ponieważ Clojure jest oparta na paradygmacie funkcjonalno-programowania, co znaczy, że osiąga bezpieczeństwo w współbieżności przestrzegając kilku prostych zasad:

  • stan niezmienny
  • funkcje nie mają efekty uboczne

Programy napisane w ten sposób mają wbudowaną skalowalność poziomą, natomiast mechanizm współbieżności oparty na blokadach (jako z Javą) jest podatny na błędy obejmujące warunki wyścigu, zakleszczenia itp.

+0

Lisps nie są czysto funkcjonalne, jest całkiem możliwe, aby mieć wiele mutowalnych struktur danych i efektów ubocznych i zepsuć je podczas współbieżności. Ale tak, funkcjonalny adwokat programowania uniknie efektów ubocznych, takich jak plauge, co znacznie ułatwi współbieżność. – delnan

19

Clojure jest przeznaczony do concurrency.

Clojure zapewnia prymitywy współbieżności na wyższym poziomie abstrakcji niż Java. Niektóre z nich to:

  • System Software Transactional Memory do obsługi synchronicznych i skoordynowanych zmian w udostępnianych referencjach. Możesz zmienić kilka odniesień jako operację atomową i nie musisz się martwić o to, co robią inne wątki w twoim programie. W ramach transakcji zawsze będziesz miał spójny obraz świata.

  • System agentów do zmiany asynchronicznej. Przypomina to przekaz w Erlangu.

  • Wątek zmiany lokalne w zmiennych. Te zmienne mają powiązanie główne, które są współużytkowane przez każdy wątek w twoim programie. Jednak po ponownym związaniu zmiennej będzie ona widoczna tylko w tym wątku.

Wszystkie prymitywy współbieżności są zbudowane na bazie niezmiennych struktur danych Clojures (tj. List, map, wektorów itp.). Kiedy wkraczasz w świat zmiennych obiektów Java, wszystkie prymitywy ulegają awarii i wracasz do blokad i zmiennych warunkowych (które również mogą być użyte w clojure, kiedy to konieczne).

5

Jedną z najfajniejszych cech posiadania niezmiennych typów jest to, że większość wbudowanych funkcji jest już wielowątkowa. Prosta "redukcja" obejmie wiele rdzeni/procesorów, bez dodatkowej pracy od ciebie.

Tak więc, możesz być wielowątkowy z Javą, ale obejmuje ona blokady i inne. Clojure jest wielowątkowy bez dodatkowego wysiłku.

+0

Myślę, że musisz zawrzeć zmniejszenie w (seque (reduce (pmap #(stuff) input)))

2

Tak, Java zapewnia wszystkie niezbędne funkcje dla programów współbieżnych.

Analogia: C zapewnia wszystkie niezbędne funkcje dla programów bezpiecznych dla pamięci, nawet przy dużej ilości operacji na łańcuchach. Ale w bezpieczeństwie pamięci C problem programisty.

Tak się składa, że ​​analiza współbieżności jest dość trudna. Lepiej używać mechanizmów z natury bezpiecznych, niż próbować przewidzieć wszystkie możliwe zagrożenia współbieżności.

Jeśli usiłujesz zabezpieczyć współbieżny program współdzielonej struktury pamięci współdzielonych danych przez dodanie blokad, które chodzisz po linie. Poza tym jest w dużej mierze niezrównany.

Jednym z dobrych kompromisów może być napisanie współbieżnego kodu Java przy użyciu stylu funkcjonalnego Clojure.

2

Oprócz podejścia Clojure do współbieżności przez niezmienne dane, vars, ref. (I pamięć transakcyjna oprogramowania), atomy i agenci ... to Lisp, którego warto się nauczyć. Otrzymasz makra Lispa, destrukturyzację, funkcje i zamknięcia pierwszej klasy, REPL i dynamiczne pisanie - plus literały dla list, wektorów, map i zestawów - wszystko oprócz interoperacyjności z bibliotekami Java (i jest rozwijana również wersja CLR.)

to nie jest dokładnie taka sama jak Schematu lub Common Lisp, ale będzie to nauka pomóc jeśli kiedykolwiek chcesz pracować przez Structure and Interpretation of Computer Programs lub grok co Paul Graham mówisz w Jego essays, można odnosić się do this comic z xkcd . ;-)

1

Prezentacja video stanowi bardzo mocną sprawę, skupiając się wokół wydajnych trwałych struktur danych wdrożonych jako próby.

Powiązane problemy