Содержание
Erlang. Что это, зачем, как и для кого. / Хабр
Статья короткая, если понравиться, попробую осветить этот язык программирования подробнее.
Что
Erlang, это функциональный язык программирования с динамической типизацией, главной особенностью которого является программирование на уровне отдельных процессов(почти аналог threads в других ЯП), коммуникация между которыми реализуется с помощью MPI(Message Passing Interface).
Зачем
Рост частот центральных процессоров остановился. Растет количество ядер и количество узлов в кластерах. Erlang создан для максимального упрощения разработки программ которые могут использовать всю мощь многоядерных и/или много узловых систем.
Успешные примеры использования Erlanga — Jabber(ура!) сервер ejabberd, web-сервер YAWS и многочисленные эксперименты, например comet-программа(специфический стиль программирования веб-сайтов, когда сервер не разрывает подключения с клиентом, а продолжает пересылать ему данные при необходимости) способная держать 1,000,000(миллион) TCP-подключений.
Никаких сравнений я приводить не буду, достаточно сказать, что ети программы выдерживают бешеную нагрузку и очень сопротивляются попыткам их убить 🙂
Как
Программирование на уровне отдельных, изолированных процессов дает много преимуществ перед обычным стилем программирования параллельного ПО.
Начнем из истоков — почему трудно программировать такое ПО на жаве, си или шарпе? Проблема очень глобальная и существует во всех этих языках — общий доступ к памяти. Программируя на этих ЯП вы не можете быть уверены, что вместимое памяти, куда ссылаются ваши переменные не изменил какой-то другой поток(трэд, thread, нить…). Из-за этого, очень часто приходиться прибегать к разнообразным, проверенным временем, трюкам — локи, мутексы, семафоры. И делать это трудно. Трудно не только начинающему программисту, но и программисту с опытом, от которого зависит работоспособность системы, если над ней работают еще несколько опытных/неопытных программистов.
Вообще говоря, в Erlang’е ета проблема не решена. Она просто изолирована на уровень ниже самого языка. Каждый процесс изолирован и не имеет доступа к памяти других процессов.
В двух словах: если нет общей памяти то нет проблемы с доступом к этой памяти.
Для кого
Erlang очень прост в изучении, в синтаксисе можно разобраться в течении дня-двух, в принципах программирования — неделя-другая. Но вот парадигма программирования достаточно сложна и переключиться на нее(особенно если есть огромный опыт в императивных ЯП) достаточно сложно и иногда совсем не хочется. Не раз слышал — как можно программировать не объектами? Весь мир состоит из объектов и взаимодействия между объектами! Ответ банальный — весь мир состоит из процессов и взаимодействия между процессами в той же мере в какой он состоит из объектов.
С использованием этого ЯП многие задачи решаються тривиально, и я считаю, что Erlang — лучший ЯП, с которого стоит начинать знакомство с функциональными языками. Особенно если программы должны быть параллелизированы и кластеризированы.
Редкие языки: Erlang | GeekBrains
Что за зверь и зачем нужен.
3 минуты
19559
Автор статьи
Андрей Никифоров
Автор статьи
Андрей Никифоров
https://gbcdn.mrgcdn.ru/uploads/post/546/og_cover_image/2f34e56fe22de605ca910a0203739a28
Здравствуйте!
Языки программирования бывают известные и не очень. Про известные вы слышали — Java, C/C++, Python, Ruby и еще полдесятка названий у всех на слуху. Сегодня речь не о них.
Поговорим о языке, который редко используют в прикладной разработке. Этот язык — Erlang.
Зачем нужен
Erlang — очень узкоспециализированный язык. На нем сложно писать утилиты, вебсайты или прикладные программы. Он создавался для написания ПО для телекоммуникационных коммутаторов в 1980-х годах.
Сегодня он используется для написания серверов видеостриминга и чатов. Erlang идеален там, где нет сложных вычислений или работы с большими объемами данных, но есть много клиентов и жесткие требования к отказоустойчивости.
Я не буду рассказывать о синтаксисе и основах, зато расскажу о трех фишках, которые восхищают меня больше всего.
Ну а если вы только погружаетесь в веб-разработку, приглашаем посетить наш бесплатный интенсив для начинающих.
Модель памяти
Чтобы понять, чем прекрасна организация памяти в Erlang, придется разобраться с тем, как вообще организована работа с памятью из разных потоков в современных языках.
Три основных подхода к организации памяти:
Блокировки
Самый простой для машины и сложный для программиста подход. Вот как это работает: есть два потока и одна общая переменная. Когда поток хочет записать в переменную значение, он блокирует к ней доступ, чтобы другие потоки не помешали ему. Другие потоки в это время вынуждены ждать.
STM
Программная транзакционная память(STM) — альтернатива блокировкам. Суть метода в организации транзакционного доступа к памяти: все потоки пишут и читают без блокировки, но при этом все изменения памяти пишутся в лог. В конце транзакция фиксируется, и все изменения применяются. В случае конфликтов изменения откатываются.
Изоляция
Ультимативный подход: у потоков вообще нет общей памяти — у каждого потока своя область памяти, в которую может писать только он. Не нужны ни транзакции, ни блокировки.
Erlang использует модель изоляции с одним исключением, о котором я расскажу ниже. Возникает вопрос — как тогда потоки обмениваются данными? Для этого предусмотрен механизм сообщений и почтовых ящиков. У каждого потока есть ящик, в который можно отправить сообщение. Поток в любой момент может получить из ящика все или определенные сообщения и обработать их.
Легкие потоки
Многопоточное программирование всегда было непростым. В C или Java каждый поток — почти отдельная программа: ему нужно выделить память, запустить, следить и корректно завершить. При этом потоки нельзя назвать легкими: так, по умолчанию один поток в Java съест от трехсот килобайт памяти только при запуске.
Erlang решил эту проблему: один поток запускается практически мгновенно и для своей работы берет всего четыре килобайта памяти. При этом потоки можно запускать сотнями тысяч на обычном ноутбуке.
Все дело в том, что потоки Erlang управляются не операционной системой, а самим Erlang, его виртуальной машиной (BEAM). Для операционной системы все выглядит так, будто поток один, но внутри BEAM их может быть много. За счет того, что операционная система не вмешивается в управление потоками, скорость работы с ними получается очень высокой.
Приятный бонус этого — Erlang способен равномерно занимать все процессорные ядра. Вот как выглядит приложение Erlang на продакшн-сервере — все ядра заняты делом:
Erlang не прожорлив до памяти еще из-за того, что когда поток завершается, вся его память быстро очищается и возвращается системе.
Не стреляет в ногу
Erlang прекрасен еще тем, что в нем сложно фатально выстрелить себе в ногу. Можно написать неэффективный, некрасивый и сложный в поддержке код, но если он заработает — он будет работать. Есть исключения, и про самое большое я сейчас расскажу. Это связано с памятью.
Как я писал выше, память в Erlang изолированная, но есть одно исключение: бинарные данные. У каждого потока своя куча памяти, но бинарные данные размером больше 1024 байт сохраняются не в память потока, а в общую память для бинарных данных, а в памяти потока хранится ссылка на бинарник.
Все хорошо, пока ссылка на бинарные данные не отправляется другому процессу. Если бы ссылка не ушла другому процессу, Erlang при завершении потока удалил бы ненужные больше бинарные данные из общей кучи и все. А теперь он не может этого сделать, потому что другой поток тоже ссылается на эти же данные.
Возникает утечка памяти. Это и есть самая большая проблема, которая может случиться из-за программиста. Остальные грабли мельче и на них нужно наступить специально.
Минусы
Кроме узкой сферы применения, у Erlang есть еще недостатки. Вот они:
- Мало библиотек и инструментов
- Небольшое сообщество
- Сложная идеология разработки
- Язык медленно развивается
Почитать
Блоги
http://lionet.livejournal.com/tag/erlang
http://levgem.livejournal.com/tag/erlang
http://eax.me/tag/erlang
Книги
http://learnyousomeerlang.com
Мартин Логан, «Erlang and OTP in action»
Фред Геберт, «Erlang in anger», PDF — о темных сторонах Erlang
Джо Армстронг, «Programming Erlang» — книга от одного из разработчиков языка
К вам два вопроса. Первый — что думаете о Erlang?
Второй — нравится новая тема? Хотите еще о редких языках? Предложения в комментарии.
Нередкие языки: профессия «Веб-разработчик».
языки программирования, программирование
Нашли ошибку в тексте? Напишите нам.
Индекс
— Erlang/OTP
Практическое функциональное программирование
для параллельного мира
Получить
Erlang/OTP 25
факт(1) -> 1; %% сопоставление с образцом для потока управления факт(N) -> N * факт(N-1). %% Рекурсия для создания циклов > пример:факт(10). %%Интерактивная оболочка для быстрых итераций 3628800 > [{Я, пример:факт(Я)} || I <- списки:seq(1,10)]. [{1, 1}, {2, 2}, {3, 6}, {4, 24}, {5, 120}, {6, 720}, {7, 5040}, {8, 40320}, {9, 362880}, {10, 3628800}]
Функциональное программирование
> Фрукты = ["банан","обезьяна","джунгли"]. %% Неизменяемые переменные ["банан","обезьяна","джунгли"] > списки: карта (забавная строка: верхний регистр/1, фрукты). %% Сопоставление значений с использованием функций stdlib ["БАНАН","ОБЕЗЬЯНА","ДЖУНГЛИ"] %% Свернуть списки с помощью пользовательских функций > lists:foldl(fun(Str, Cnt) -> string:length(Str) + Cnt end, 0, Fruits). 18
Функции высшего порядка
> Parent = self(). %% Получить собственный идентификатор процесса <0,376,0> > Child = spawn(fun() -> receive go -> Parent ! lists:seq(1,100) end end). <0,930.0> > Ребенок! идти. %% Отправить сообщение ребенку идти > получить ответ -> завершить ответ. %% Получить ответ от ребенка [1,2,3,4,5,6,7,8,9,10,11|. ..]
Облегченные процессы
-spec даже(список(целое())) -> список(целое()). четные (числа) -> mapreduce(Numbers, fun(Number) -> Number rem 2 == 0 end). mapreduce (числа, функция) -> Родитель = я (), [spawn(fun() -> Parent ! {Число, Функция(Число)} end) || Номер <- Числа], списки: сгладить ( [получить {Число, правда} -> Число; _ -> [] конец || Число <- Числа]).
Параллельное уменьшение карты для поиска четных чисел
%% Возврат факториала для N факт(1) -> 1; факт(N) -> N * факт(N-1). > пример:факт(10). 3628800
Функциональное программирование
> Фрукты = ["банан","обезьяна"]. ["банан","обезьяна"] > списки:карта( забавная строка: верхний регистр/1, фрукты). ["БАНАН","ОБЕЗЬЯНА"]
Функции высшего порядка
> Me = self(). <0.376.0> %% Отправить сообщение с помощью ! > spawn(fun() -> Me!lists:seq(1,10) end). <0,930.0> > получить ответ -> завершить ответ. [1,2,3,4,5,6,7,8,9,10]
Облегченные процессы
-spec даже(In) -> Out когда In:: list(integer()), Выход :: список (целое число ()). четные (числа) -> [Число || Число <- Числа, Число рем 2 == 0].
Найти четные числа
Что такое Erlang?
Erlang — это язык программирования, используемый для создания масштабируемых программных приложений реального времени.
системы с требованиями по высокой доступности. Некоторые из его применений относятся к телекоммуникациям, банковскому делу,
электронная коммерция, компьютерная телефония и обмен мгновенными сообщениями. Система выполнения Erlang имеет встроенную
поддержка параллелизма, распределения и отказоустойчивости.
Быстрый запуск Erlang
Что такое одноразовый пароль?
OTP — это набор библиотек Erlang и принципов проектирования, обеспечивающих промежуточное ПО для
развивать эти системы. Он включает в себя собственную распределенную базу данных, приложения для интерфейса
к другим языкам, средствам отладки и обработки выпусков.
Начало работы с OTP
Новости
Дополнительные оптимизации в компиляторе и JIT
19 апреля 2023 г. by Бьорн Густавссон
- В этом посте рассматриваются расширенные оптимизации на основе типов.
и другие улучшения производительности в Erlang/OTP 26. Erlang/OTP 26.0 Release Candidate 3
12 апреля 2023 г., Хенрик Норд
- Erlang/OTP 26.0-rc3 — третий и последний релиз-кандидат для OTP 26.
Erlang/OTP 26.0 Release Candidate 2
22 марта 2023 г., Хенрик Норд
- Erlang/OTP 26.0-rc2 — второй релиз-кандидат для OTP 26.
Участвовать
Документация - Erlang/OTP
Онлайновая документация
- Erlang/OTP Документация
- Электронная документация для последней версии системы выполнения, а также всех библиотек.
- Программирование на Erlang: программное обеспечение для параллельного мира (ограниченная бесплатная версия)
- Programming Erlang: Software for a Concurrent World (Джо Армстронг) — это книга об Erlang, написанная одним из первых изобретателей и опубликованная в 2007 году. Вы можете купить ее на бумаге в Amazon и других книжных интернет-магазинах или напрямую у издателя.
- Справочное руководство по Erlang - Руководство пользователя
- Описание языка Erlang
- Руководство по эффективности - Руководство пользователя
- Руководство, которое научит вас, что использовать и чего следует избегать в Erlang, а также тому, как реализованы определенные функции Erlang.
- Системные принципы — Руководство пользователя
- Руководство по ряду принципов системы Erlang.
- — Руководство пользователя
- Принципы проектирования OTP определяют, как структурировать код Erlang с точки зрения процессов, модулей и каталогов.
- Дерево версий OTP
- Все выпущенные версии OTP, начиная с OTP 17.0, со ссылками на исходные теги GitHub и на README:s. Начиная с OTP 23 отсюда также можно загрузить установщики Windows для всех исправлений.
Принципы разработки OTP
Книги Эрланга
- Программирование на Erlang: программное обеспечение для параллельного мира (полная версия)
- Programming Erlang: Software for a Concurrent World (Джо Армстронг) — это книга об Erlang, написанная одним из первых изобретателей и опубликованная в 2007 году. Вы можете купить ее на бумаге в Amazon и других книжных интернет-магазинах или напрямую у издателя.
- Выучите Эрланг на благо!
- Выучите Эрланг на благо! Фреда Хеберта — это книга для начинающих об Erlang, опубликованная в 2013 году. Она доступна в бумажном виде и в Интернете.
- Программирование на Эрланге
- » была опубликована в 2009 году. Получите ее на Amazon и т. д. или непосредственно у издателя.
- Erlang и OTP в действии
- «Эрланг и OTP в действии» была опубликована в 2010 году. Ее можно купить в различных книжных интернет-магазинах или напрямую у издателя.
- Представляем Erlang
- «Введение в Erlang», Саймон Сен-Лоран, 2013 г.
Книга Франческо Чезарини и Саймона Томпсона «Программирование на Erlang (параллельный подход к разработке программного обеспечения)
Книга Мартина Логана, Эрика Мерритта и Ричарда Карлссона