Редкие языки: Erlang
Здравствуйте!
Языки программирования бывают известные и не очень. Про известные вы слышали — 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?
Второй — нравится новая тема? Хотите еще о редких языках? Предложения в комментарии.
Нередкие языки: профессия «Веб-разработчик».