А вот подскажите, можно ли использовать Erlang для написания серверов, которые занимаются очень большим количеством вычислений? Например, симуляция физики движения — грубо говря, можно ли на нём написать шутер (серверную часть, разумеется)?
Меня прельстили всякие статьи про него — особенно количество одновременно обрабатываемых соединений и линейная масштабируемость «из коробки», но постоянно встречаю оговорки, что с математикой у него туго.
Правда ли это? Умеет ли он использовать тот же OpenCL? Или для задач с кучей математики лучше задействовать что-нибудь другое?
он создан главным образом для таких вычислений, потому что распараллеливает всё на уровне дерева выполняемой функции. кроме того там искоробочная длинная арифметика для длинных чисел и всё такое. в любом случает, даже если он где-то проиграет по скорости, это компенсируется удобной кластеризацией: сделать несколько узлов, в случае отказа просто упадёт производительность.
другое дело, что на нём тоже писать надо уметь, чтобы функции были по возможности хвосторекурсивными и тому подобное
Распараллеливаемость «из коробки» меня, собственно, и привлекает. С другой стороны — возможность использования OpenCL на C может вообще снять вопрос с распараллеливаемостью, так как на тех же задачах симуляции физики GPU просто нереально равёт обычные процессоры, и не в разы, а в десятки и сотни раз.
В любом случае — спасибо за ответ, учить Эрланг всё равно буду — лишний язык не помешает. Правда трудно переключиться с объектного мышления на Эрланговскую логику (Пролог я в универе терпеть не мог по этой же причине), но это вопрос времени.
Нет, для числодробилки язык слишком медленный. Можно использовать его как клей, а критичный к производительности код писать на OCaml или C и подключать через NIF, получается этакий Питон с сетевой прозрачностью.
Хммм, ну тогда, получается, что надо учитывать кучу других вещей — если на чистом Эрланге мне не важно знать, где и что находится и я могу (это я говорю на основе только тех знаний, что уже успел подчерпнуть) сделать, например, каждую частицу (шарик) отдельным процессом и отправить его двигаться по произвольной траектории и наплодить таких шариков миллион — то CUDA/OpenCL мне не сильно помогут. А если использовать расширения и допустить, что это физически будет на разных нодах (физических) — то и тут CUDA/OpenCL мне не поможет, так как процессоры GPU должны работать с общими данными… Надо будет подумать тогда, какую задачку взять в качестве тестовой для обучения…
Странного от языка хотите.
Да, если только начинаете изучать язык, то сильно советую прочесть «OTP design principles», там то немногое, что, лично меня, действительно восхитило в языке, может что-то прояснится.
Книги Вирдинга и Армстронга, там есть и про Erlang, и базовые сведения про ФП, для задачек с Project Euler этого достаточно.
Потом — документация с сайта, смотрим стандартную библиотеку по случаю и курим ФП из разных источников. Комьюнити дружное, но небольшое. Из открытых проектов посмотреть — yaws, он небольшой, с развертыванием и тестами.
Язык сам по себе не особенно сложный, главное начать думать в категориях немутабельных структур и асинхронных сообщений.
Параллельно можно учить Scala+Akka, концептуально они похожи, но нет проблем с библиотеками и шанс, что знания пригодятся в реальном мире сильно больше.