Что такое Erlang и зачем он нужен

Зачем существует язык, на котором написаны телефонные станции и WhatsApp.

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

Большинство языков программирования создавались, чтобы быстрее считать или удобнее описывать данные. Erlang создавался ради другой цели — чтобы система не падала. В конце 1980-х компания Ericsson искала способ писать программное обеспечение для телефонных коммутаторов: устройств, которые обслуживают миллионы звонков одновременно и не имеют права «зависнуть» даже на секунду. Если ваш сайт упадёт на минуту, вы потеряете немного денег и нервов. Если на минуту замолчит телефонная станция целого города, это уже совсем другой масштаб ответственности: экстренные вызовы, бизнес, инфраструктура. Именно из такого требования — «работать всегда, что бы ни случилось» — и родился Erlang.

Инженеры Ericsson сначала перепробовали существующие языки, и ни один не подошёл целиком: где-то конкурентность была слишком тяжёлой, где-то не получалось обновлять программу без остановки. Тогда команда собрала собственный язык, в который изначально заложены ровно те свойства, которых требует телеком. Это важный урок: Erlang — не язык «общего назначения, который умеет всё», а инструмент, заточенный под конкретный класс задач. Именно поэтому в своей нише он до сих пор почти не имеет конкурентов.

Откуда взялся Erlang

Язык придумали Джо Армстронг, Роберт Вирдинг и Майк Уильямс в исследовательской лаборатории Ericsson примерно в 1986 году. Имя обычно связывают с математиком Агнером Эрлангом, основателем теории массового обслуживания (а заодно это сокращение от «Ericsson Language»). Совпадение удачное: теория массового обслуживания как раз изучает, как системы справляются с потоком одновременных запросов — телефонных звонков, например. Первой большой системой на Erlang стал коммутатор AXD301 — он содержал больше миллиона строк кода и достигал доступности, которую инженеры описывали как «девять девяток».

Девять девяток — доступность 99,9999999%. Это примерно 32 миллисекунды простоя в год.

Сравните: «обычная» хорошая доступность 99,9% (три девятки) означает почти 9 часов простоя в год. Девять девяток — это другой класс надёжности, и достигается он не героизмом администраторов, а свойствами самого языка. Стоит понимать, что эта цифра — не маркетинговый лозунг, а результат многолетней эксплуатации реальных коммутаторов в продакшене. Долгое время Erlang был внутренней технологией Ericsson и даже какое-то время оставался коммерческой тайной; открытым (open source) язык стал лишь в 1998 году, и тогда же он начал распространяться за пределы телекома. Любопытный факт: на короткое время Ericsson запрещала использовать Erlang внутри компании для новых проектов, но сообщество и практическая польза оказались сильнее запрета, и язык вернулся.

За десятилетия вокруг языка выросла платформа OTP (Open Telecom Platform) — набор библиотек и проверенных шаблонов проектирования, без которых сегодня Erlang почти не используют. Когда говорят «писать на Erlang», на практике почти всегда подразумевают «писать на Erlang/OTP»: именно она превращает красивые идеи языка в готовые промышленные решения.

Три кита, на которых стоит Erlang

Чтобы понять язык, держите в голове три его опоры. Они объясняют почти все решения в синтаксисе и библиотеках, и если что-то в Erlang кажется странным, почти наверняка причина — в одном из этих трёх принципов.

  • Конкурентность — программа состоит из множества лёгких независимых процессов. Не потоков ОС, а собственных процессов виртуальной машины, которых могут быть миллионы.
  • Изоляция — процессы не делят память. Они общаются только сообщениями. Падение одного процесса не разрушает остальные.
  • Отказоустойчивость — система проектируется так, чтобы переживать сбои, а не предотвращать каждый из них. Отсюда знаменитый девиз «let it crash».

Обратите внимание, как эти три кита поддерживают друг друга. Изоляция возможна потому, что есть отдельные процессы (конкурентность). Отказоустойчивость возможна потому, что процессы изолированы: падение одного не задевает других. А управляемая конкурентность миллионов процессов возможна потому, что они дёшевы и не делят память. Уберите любую опору — и вся конструкция рассыплется. Эта взаимная поддержка и есть причина, по которой Erlang ощущается как цельный, продуманный инструмент, а не как набор случайных фич.

Чем Erlang отличается от привычных языков

Если вы пришли из мира Python, Java или JavaScript, проще всего понять Erlang через контраст. В этих языках конкурентность — надстройка: вы берёте потоки, мьютексы, очереди и аккуратно собираете из них что-то рабочее, постоянно опасаясь гонок и взаимоблокировок. В Erlang конкурентность встроена в саму ткань языка: создать процесс так же естественно, как вызвать функцию, а общаются процессы исключительно сообщениями, как люди по почте, а не через общий «стол» памяти.

Ещё одно отличие — отношение к состоянию. Привычные языки разрешают менять переменные на месте, и это удобно ровно до того момента, пока два потока не захотят изменить одну переменную одновременно. Erlang же делает данные неизменяемыми: однажды созданное значение не меняется. На первый взгляд это ограничение, но именно оно убирает целый класс ошибок конкурентного программирования. Получается интересный парадокс: добавив строгость в одном месте, язык даёт огромную свободу в другом — можно безбоязненно запускать тысячи параллельных задач.

Кто использует Erlang сегодня

Erlang давно вышел за пределы телекома. Мессенджер WhatsApp обслуживал сотни миллионов пользователей небольшой командой именно благодаря Erlang — известна история, как пара десятков инженеров держала нагрузку, которая в других компаниях потребовала бы целых департаментов. На виртуальной машине Erlang работает брокер сообщений RabbitMQ, через который ежедневно проходят миллиарды сообщений в тысячах компаний. Базы данных Riak и CouchDB, игровые серверы, биржевые и платёжные системы — всюду, где нужна высокая конкурентность и устойчивость, Erlang оказывается хорошим выбором.

Отдельно стоит упомянуть язык Elixir — он появился позже, имеет более современный синтаксис, но работает на той же виртуальной машине и использует те же идеи. Изучая Erlang, вы осваиваете целую экосистему: знания о процессах, сообщениях и супервизорах переносятся на Elixir почти без изменений.

% Так выглядит "Hello, world" в модуле Erlang
-module(hello).
-export([start/0]).

start() ->
    io:format("Привет, надёжный мир!~n").

Пока не вникайте в детали — обратите внимание на стрелку -> (в коде она экранирована, в редакторе вы видите стрелку) и точку в конце. Это типичный синтаксис Erlang, к нему мы вернёмся. Строка -module(hello) объявляет имя модуля, а -export перечисляет функции, видимые снаружи. Такая явность не случайна: язык заставляет вас сознательно решать, что является публичным интерфейсом, а что — внутренней деталью.

Вывод:

Привет, надёжный мир!

Как работает под капотом

Секрет Erlang не в синтаксисе, а в среде выполнения. Программа компилируется в байт-код и исполняется виртуальной машиной BEAM. Именно BEAM даёт лёгкие процессы, вытесняющую многозадачность и сборку мусора отдельно для каждого процесса. Когда вы запускаете «процесс» в Erlang, операционная система об этом не знает — всё происходит внутри одной (или нескольких) ОС-нитей, которыми управляет планировщик BEAM. Поэтому миллион процессов на одной машине — норма, а не подвиг.

Чтобы почувствовать масштаб разницы, представьте аналогию. Поток операционной системы похож на отдельного штатного сотрудника: его нужно нанять, выделить ему рабочее место, платить зарплату — всё это дорого, и держать миллион сотрудников невозможно. Процесс BEAM ближе к задаче в списке дел: создать её почти ничего не стоит, и таких задач можно иметь сколько угодно, а планировщик BEAM, как опытный диспетчер, быстро переключается между ними, давая каждой по чуть-чуть внимания. Именно эта дешевизна процессов и делает реальной саму идею «программа из миллиона маленьких агентов». Подробно устройство BEAM мы разберём в отдельном уроке — пока достаточно запомнить, что вся надёжность и масштабируемость Erlang родом именно отсюда, из среды выполнения, а не из красоты синтаксиса.

Частые ошибки новичка

  • Искать в Erlang «обычное» ООП. Здесь нет классов и наследования. Единица абстракции — процесс и функция, а не объект.
  • Думать, что «let it crash» — это безответственность. Наоборот, это дисциплина: ошибки локализуются и обрабатываются специально выделенными процессами-супервизорами.
  • Сравнивать Erlang со скриптовыми языками по скорости одного потока. Erlang оптимизирован под тысячи параллельных задач и сетевой ввод-вывод, а не под численные циклы.

Итоги

  • Erlang создан в Ericsson для телеком-систем, которые должны работать без остановки.
  • Его опоры — конкурентность, изоляция процессов и отказоустойчивость.
  • «Девять девяток» — реальный ориентир доступности, достижимый благодаря модели языка.
  • Сегодня Erlang применяют в мессенджерах, очередях сообщений и распределённых базах данных.
Проверьте себя
1. Какова была изначальная задача, под которую создавали Erlang?
AБыстрые численные расчёты
BПрограммирование телефонных коммутаторов в Ericsson
CСоздание веб-сайтов
DОбучение детей программированию
2. Что означает выражение «девять девяток»?
AДевять процессоров в сервере
BВерсию языка 9.9
CДоступность 99,9999999% — около 32 мс простоя в год
DДевять обязательных тестов
3. Почему в Erlang возможны миллионы процессов на одной машине?
AЭто процессы операционной системы
BЭто лёгкие процессы виртуальной машины BEAM, а не ОС
CИспользуется только один процесс
DПроцессы хранятся на диске