Kiedy Java dostarcza możliwości programowania współbieżnego, jakie są główne zalety używania Clojure (zamiast Java)?Dlaczego Clojure zamiast Javy do programowania współbieżnego
Odpowiedz
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.
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?
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.
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.
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
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).
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.
Myślę, że musisz zawrzeć zmniejszenie w (seque (reduce (pmap #(stuff) input)))
–
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.
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 . ;-)
Prezentacja video stanowi bardzo mocną sprawę, skupiając się wokół wydajnych trwałych struktur danych wdrożonych jako próby.
- 1. Funkcjonalny odpowiednik współbieżnego multimapu
- 2. Jakie zalety ma Scala nad Javą do programowania współbieżnego?
- 3. Wywoływanie Javy z Clojure
- 4. Używanie idiomów programowania Clojure DataFlow
- 5. Traktowanie pliku Javy jako leniwa sekwencja Clojure
- 6. Przejdź do współbieżnego dostępu do metod wskaźników
- 7. Czy vim jest już wystarczająco dobry do programowania clojure?
- 8. Języki programowania, które definiują problem zamiast rozwiązania?
- 9. Dostęp do Javy Javy z Delphi
- 10. Haskell do mobilnego programowania
- 11. Testowanie, czy obiekt jest prymitywną tablicą Javy w Clojure
- 12. Stan ustawienia współbieżnego zadania JavaFX
- 13. Nieprawidłowe zachowanie Javy w instancji Javy
- 14. Dlaczego nie mogę używać Clojure's:^const z tablicą Javy?
- 15. Dlaczego Objectify zamiast JDO?
- 16. Dlaczego darcs zamiast git?
- 17. Narzędzia do samouczków programowania?
- 18. Czy istnieje bezpieczny sposób pobrania Javy Javy?
- 19. Dlaczego tylko ASP.NET ma asynchroniczny model programowania?
- 20. Nauka programowania języków programowania
- 21. Dlaczego Q_ASSERT zamiast assert
- 22. Dlaczego używać JOIN zamiast wewnętrznych zapytań
- 23. . Język Java dla programowania jednoczesnego
- 24. CMS w języku programowania funkcjonalnego
- 25. brzydkie duble - dlaczego 2.9000000000000004 zamiast 2.9?
- 26. Dlaczego otrzymuję kwadraty zamiast tekstu?
- 27. JavaScript do clojure
- 28. Oświadczenie Javy z + =/- = operatorami
- 29. Która wersja VMware do programowania?
- 30. Model maszyny do programowania funkcjonalnego
linki wydają się być uszkodzone. Ktoś ma działający? – Surya
@Surya: Najwyraźniej usunęli stare prezentacje konferencyjne. –
Czy myślałeś o tej prezentacji? http://clojure.blip.tv/file/812787/ – egbokul