Написание функциональных программ на нефункциональных языках

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

PS Я хотел задать этот вопрос не для того, чтобы выяснить, как распараллелить Java-программы. Но знать - как компьютер распараллеливает код. Может ли это сделать это в функциональной программе, написанной на не функциональном языке?

5 ответов

Решение

Я не думаю, что вы можете "заставить" JVM распараллелить вашу программу, но наличие отдельного потока, выполняющего каждую "задачу", если вы можете так ломать свою программу, возможно, сработает в большинстве случаев? однако параллелизм все еще не гарантирован.

Java-программы распараллеливаются через потоки. Компьютер не может волшебным образом понять, как распределить части вашего приложения по всем ядрам на императивном языке, таком как Java. Только функциональный язык, такой как Erlang или Haskell, может сделать это. Читайте о потоках Java.

Я не знаю об автоматических JVM распараллеливания. Они существуют для других языков, таких как FORTRAN.

Вы могли бы найти интересную среду JSR166y для fork-join, запланированную для JDK7.

Вы можете писать функции с автоматически распараллеливающими задачами, это довольно легко сделать для конкретных случаев, однако я не знаю ни одного встроенного Java API, который бы делал это. (За исключением, возможно, Executor/ExecutorService)

Что-то, что я использовал в школе, которое сделало много работы для вас.

http://www.cs.rit.edu/~ark/pj.shtml

У этого есть способность сделать SMP или параллелизм на основе сообщений.

Полезно это для вас - другой вопрос:-)

Другие вопросы по тегам