Многоядерное / параллельное программирование и .NET / Java - PullRequest
4 голосов
/ 16 августа 2011

Я часто слышу о других языках, которые рекламируются как более подходящие для многоядерного / параллельного программирования, например, Clojure, Scala, Erlang и т. Д., Но меня немного смущает вопрос, почему мне нужно беспокоиться о нескольких ядрах, еслиJava / .NET VM обрабатывает это автоматически, а если нет, то каковы причины этого?

Это потому, что упомянутые языки являются функциональными и имеют некоторое внутреннее преимущество перед нефункциональными языками?

Ответы [ 4 ]

1 голос
/ 16 августа 2011

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

Выполнение параллелизма при использовании неизменяемого «материала» гораздо проще, чем при использовании изменяемого »stuff »Java / C # не делает ваши программы автоматически параллельными: вам все равно придется выполнять тяжелую работу самостоятельно.

1 голос
/ 16 августа 2011

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

Некоторые люди предпочитают функциональные языки стиля, такие как Scala, Erlang и F #, не функциональные для многопоточного программирования. Функциональные языки, как правило, по меньшей мере, по меньшей мере, являются незначительными неизменяемыми по умолчанию, и, следовательно, теоретически с ними легче работать в многопоточных ситуациях.

Вот очень хорошая статья на эту тему

0 голосов
/ 16 августа 2011

Я никогда не программировал функциональные языки, но предполагается, что их проще кодировать одновременно, так как состояния не меняются (или не меняются сильно), так что вы можете иметь один и тот же объект в двух потоках одновременно. Если у вас в Java один и тот же объект одновременно в двух потоках, вы должны быть очень осторожны и использовать некоторые специальные конструкции синхронизации, чтобы два потока могли «видеть» объект в одном и том же состоянии, когда это необходимо.

Текущая проблема в программировании состоит в том, что все привыкли делать что-то последовательно, но аппаратное обеспечение движется многоядерным. Должен быть полный сдвиг парадигмы в том, как мы кодируем и думаем о коде. Прямо сейчас, кодирование для многоядерности в Java или C # - это просто последовательное кодирование со взломами, чтобы сделать его параллелизуемым. Станет ли функциональное программирование необходимым сдвигом парадигмы? Я не знаю.

0 голосов
/ 16 августа 2011

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

Однако существуют различные библиотеки справки, которые могут помочь вам на разных платформах.Например, библиотека Task Parallel в .NET позволяет вам сделать это, например:

Parallel.ForEach(files, file => 
{
   Process(file);
});

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

...