[ d ] [ b / cu / dev ] [ r ] [ a / ts ] [ ci ] [ gnx / int ] [ misc ] [ dev / stat ]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог] [Главная]

Файл: Erlang_logo.png -(12 KB, 340x289, Erlang_logo.png)
12 No.28196  
Не понимаю, почему нет треда по прекрасному Эрлангу. Хотя, вообще-то понимаю прекрасно: он малоизвестен, особенно среди начинающих, а также достаточно специфичен, подходит для особого класса задач (массово-параллельных stateful приложений).

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

Но чтобы даже начать говорить об этом, надо понять лексикон эрлангиста, поскольку он крайне необычен.

В виртуальной машине Beam всё выполняется параллельно, и ближайший аналог ООП-объекта в Erlang называется процессом — процессом виртуальной машины Beam. Но это не объект как в Java или C++. Это рекурсивная функция (хвостовая рекурсия), которая может останавливаться, ожидая сообщений, и как правило так и делает каждую итерацию. Тогда состояние процесса — в списке аргументов этой функции.

Ближайший аналог Java-интерфейса — поведение (behaviour).

Pid в контексте Эрланга также относится к процессам внутри Beam.

Вытесняющая многозадачность процессов в Erlang достигается планировщиком задач, как у операционной системы. И он даже более агрессивен в равномерном распределении вычислительных ресурсов между процессами, чем в Linux или Windows. Его задача №1 — предотвратить массовый отказ в обслуживании из-за зависания одного процесса.

Эту фичу часто понимают неправильно. Допустим, вы пишите программу на мэйнстримном языке, и вам нужно сильно параллелить выполнение. Первый вариант, как можно это сделать — создать много процессов операционной системы, но это займёт очень много памяти. Второй вариант — вручную или в рамках фичи платформы сделать небольшой пул тредов ОС, которые будут переключаться между задачами по мере необходимости. Как правило, такие решения реализуют кооперативную многозадачность: пока зелёный процесс или корутина не отпустят выполнение, процесс ОС останется заблокированным. Операционные системы же почти все сами переключают процессы, что не даёт ни одной программе повесить всю систему. Так и поступает Beam.

Итак, поскольку процессы — это рекурсивные функции, которые ждут сообщения и по-разному реагируют на разные сообщения, в OTP они разделены на два класса — state-машины (gen_statem), рабочие лошадки любого проекта, меняющие своё состояние и в первую очередь воспринимающие внешние вызовы как спусковой механизм изменения состояния, и серверы (gen_server), воспринимающие сообщения как запросы к некоторому ресурсу. Над ними стоят супервизоры, единственная задача которых — выключить и включить.
>> No.28197  
Ключевое преимущество gen_server перед обычным самописный процессом, помимо совместимости с супервизорами, — безопасные синхронные вызовы (call, handle_call).

Если мы отправляем обычное сообщение и затем ставим receive-блок, который ждёт ответ, мы должны прописать pattern matching крайне специфично, чтобы не поймать вместо ответа на наш запрос какое-то левое сообщение. Синхронные вызовы OTP делают эту работу за нас. Они прикрепляют к запросу уникальный идентификатор и ждут ответ только с этим идентификатором.

Генсерверы — не обязательно должны быть интерфейсами к внешнему ресурсу. Они могут обладать и собственным состоянием.

Знакомство с Erlang/OTP лучше всего начать с книги Фреда Геберта Изучай Erlang во имя добра (в ней есть устаревшие сведения) или с видосов на ютубе.

По общепринятым тулзам/экосистеме:

Система сборки — Rebar3

Статический анализ — dialyzer

Тесты — eunit

Реестр процессов — gproc, pg или syn
>> No.28198  
Erlang 10 лет спустя
https://youtu.be/3WYFeaxgdH0

Максим Лапшин. Введение в Erlang
https://youtu.be/jYrHjS8Z_XU

Про Erlang и Elixir
https://youtu.be/EjJdA609KAM
>> No.28200  
>>28198
>Не понимаю, почему нет треда по прекрасному Эрлангу
Не было среди нас раньше хорошего специалиста по Эрлангу, вы вот первый



[ d ] [ b / cu / dev ] [ r ] [ a / ts ] [ ci ] [ gnx / int ] [ misc ] [ dev / stat ]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог] [Главная]