Функциональные языки со статической типизацией и параллельные вычисления

#multithreading #parallel-processing

#многопоточность #параллельная обработка

Вопрос:

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

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

Ответ №1:

В Frege вы можете использовать Java API fork / join, вот сообщение в блоге, посвященное этому: http://fregepl.blogspot.de/2011/09/parallelism-in-frege-employing-forkjoin.html

Комментарии:

1. Это интересный язык, поддержка потоков все еще довольно незначительна, но приемлема, поскольку она кажется близкой альтернативой. Кроме того, я обнаружил, что язык Rust, хотя и находится в очень альфа-состоянии, имеет несколько очень интересных моделей параллельных вычислений.

Ответ №2:

Я мало что знаю о Haskell, но я знаю, что Erlang довольно хорошо справляется с параллелизмом. Однако Erlang является динамически типизированным языком, и параллелизм обрабатывается на языке программирования, а не в операционной системе.

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

Для тех, кто не знаком с Erlang, вот ссылка на введение в язык.

Существует также Scala, которая объединяет возможности функционального программирования и объектно-ориентированного программирования. Scala выполняется на виртуальной машине Java, и потоки взаимодействуют, используя модель, основанную на событиях. Это может быть показателем потоков уровня операционной системы, которые вы ищете. Кроме того, он имеет встроенную поддержку модели актора.

Существует книга о Scala и многоядерных системах, на которые вам следует взглянуть.

Комментарии:

1. Да, erlang — это очень сильно статически типизированный язык, и сильная потоковая обработка модели субъекта отодвигает другие модели потоковой обработки на задний план.

2. @Arelius Я обновил свой ответ, включив Scala, который может соответствовать вашим целям 😉

3. Я не имею в виду потоки уровня операционной системы в том смысле, что должна быть корреляция один-> один, например, Erlang подходит в этом отношении, потому что, хотя он управляет собственными потоками в операционной системе. он также использует потоки операционной системы в серверной части, чтобы использовать преимущества нескольких процессоров. Моя основная идея в этом заключается в том, чтобы отличать это от того, что распространено в OCaml, и от некоторых схем, где они поддерживают потоковую обработку только на уровне языка и вообще без SMP.

4. @Arelius Я знаком только с языками, где потоковая передача поддерживается на уровне операционной системы. И с их помощью вы можете «легко» мыслить в параллелизме. Я согласен с вами, что потоковое управление на уровне языка по-своему влияет на параллелизм.