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

Используя array.map, мы можем уменьшить цикл, см. это в jsfiddle

function Check(){
    var arr = Array.prototype.slice.call(arguments);
    var result = [];
    for(i=0; i< arr.length; i++){
        var duplicate = 0;
        var val = arr[i];
        arr.map(function(x){
            if(val === x) duplicate++;
        })
        result.push(duplicate>= 2);
    }
    return result;
}

To Test:

var test = new Check(1,2,1,4,1);
console.log(test);

16
задан Chii 15 October 2009 в 07:53
поделиться

9 ответов

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

5
ответ дан 30 November 2019 в 16:19
поделиться

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

Вы можете проверить эту отличную презентацию Рика Хики (создателя Clojure) о параллелизме в Clojure. РЕДАКТИРОВАТЬ: Очевидно, JAOO удалил старые презентации. Мне пока не удалось найти для этого новый источник.

7
ответ дан 30 November 2019 в 16:19
поделиться

Clojure разработан для параллелизма .

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

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

  • Агентская система для асинхронного изменения. Это похоже на передачу сообщений в Erlang.

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

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

18
ответ дан 30 November 2019 в 16:19
поделиться

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

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

-5
ответ дан 30 November 2019 в 16:19
поделиться

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

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

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

6
ответ дан 30 November 2019 в 16:19
поделиться

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

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

2
ответ дан 30 November 2019 в 16:19
поделиться

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

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

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

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

Хорошим компромиссом может быть написание параллельного кода Java с использованием функционального стиля Clojure.

2
ответ дан 30 November 2019 в 16:19
поделиться

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

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

5
ответ дан 30 November 2019 в 16:19
поделиться

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

1
ответ дан 30 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: