Подтвердить что ты не робот

Почему Clojure вместо Java для параллельного программирования

Когда Java предоставляет возможности для параллельного программирования, каковы основные преимущества использования Clojure (вместо Java)?

4b9b3361

Ответ 1

Clojure предназначен для concurrency.

Clojure предоставляет примитивы concurrency на более высоком уровне абстракции, чем Java. Некоторые из них:

  • Программное обеспечение Transactional Memory для работы с синхронными и скоординированными изменениями общих ссылок. Вы можете изменить несколько ссылок как атомную операцию, и вам не нужно беспокоиться о том, что делают другие потоки в вашей программе. В рамках вашей транзакции вы всегда будете иметь последовательный взгляд на мир.

  • Система агентов для асинхронного изменения. Это напоминает сообщение, переданное в Эрланге.

  • Внести локальные изменения в переменные. Эти переменные имеют корневое связывание, которое совместно используется каждым потоком в вашей программе. Однако, когда вы повторно привязываете переменную, она будет видна только в этом потоке.

Все эти примитивы concurrency построены на основе неизменяемых структур данных Clojures (т.е. списков, карт, векторов и т.д.). Когда вы входите в мир изменяемых объектов Java, все примитивы ломаются, и вы возвращаетесь к замкам и переменным условия (которые также могут быть использованы в clojure, когда это необходимо).

Ответ 2

Не будучи экспертом по Clojure, я бы сказал, что главное преимущество заключается в том, что Clojure скрывает много деталей параллельного программирования, и, как мы все знаем, дьявол находится в деталях, поэтому я считаю, что хороший вещь.

Вы можете проверить эту отличную презентацию от Рика Хики (создателя Clojure) на concurrency в Clojure. EDIT: Очевидно, JAOO удалил старые презентации. Я еще не смог найти новый источник для этого.

Ответ 3

Потому что мир продвинулся за последние 10 лет, а язык Java (!= JVM) испытывает трудности с тем, чтобы не отставать. Более современные языки для JVM основаны на новых идеях и улучшенных концепциях, что делает многие утомительные задачи более простыми и безопасными.

Ответ 4

Поскольку Clojure основан на парадигме функционального программирования, то есть он обеспечивает безопасность в concurrency, следуя нескольким простым правилам:

  • неизменяемое состояние
  • функции не имеют побочных эффектов

Программы, написанные таким образом, имеют встроенную горизонтальную масштабируемость, тогда как механизм concurrency на основе блокировки (как и в Java) подвержен ошибкам, связанным с условиями гонки, взаимоблокировками и т.д.

Ответ 5

Одной из замечательных вещей, связанных с неизменяемыми типами, является то, что большинство встроенных функций уже многопоточны. Простое "сокращение" будет охватывать несколько ядер/процессоров, без какой-либо дополнительной работы от вас.

Итак, вы можете быть многопоточными с Java, но в нем есть блокировки и еще много чего. Clojure является многопоточным без каких-либо дополнительных усилий.

Ответ 6

Да, Java предоставляет все необходимые возможности для одновременных программ.

Аналогия: C предоставляет все необходимые возможности для безопасных для памяти программ даже при большом количестве обработки строк. Но в C безопасности памяти проблема программиста.

Как это бывает, анализ concurrency довольно сложный. Лучше использовать неотъемлемо безопасные механизмы, а не пытаться предвидеть все возможные опасности concurrency.

Если вы попытаетесь сделать совместную программу с изменяемой структурой данных с разделяемой памятью, добавив блокировки, вы идете по канату. Кроме того, он в значительной степени не поддается тестированию.

Один хороший компромисс может заключаться в написании параллельного Java-кода с использованием функционального стиля Clojure.

Ответ 7

В дополнение к Clojure подход к concurrency через неизменяемые данные, vars, refs (и транзакционную память программного обеспечения), атомы и агенты... это a Lisp, который стоит изучить. Вы получаете Lisp макросы, деструктурирование, функции и замыкания первого класса, REPL и динамическую типизацию - плюс литералы для списков, векторов, карт и наборов - все это на вершине совместимости с Java-библиотеками (и там разрабатывается версия CLR тоже.)

Это не совсем то же самое, что Scheme или Common Lisp, но изучение этого поможет вам, если вы когда-нибудь захотите работать через Структура и интерпретация Компьютерные программы или grok, о чем говорит Пол Грэхем в своих эссе, и вы можете относиться к этот комикс от XKCD.; -)

Ответ 8

Эта видео представляет собой очень сильный случай, ориентированный на эффективные постоянные структуры данных, реализованные как попытки.

Ответ 9

Развитие языка программирования Java довольно медленное, главным образом из-за беспокойства Sun о обратной совместимости.

Почему бы вам просто не использовать JVM-языки, такие как Clojure и Scala?