Erlang и Elixir: одна платформа, разный синтаксис
Два языка, которые говорят на одном «машинном» наречии.
Elixir — современный язык, работающий на той же виртуальной машине BEAM и использующий тот же OTP, что и Erlang, но с другим синтаксисом и расширенным инструментарием.
Нельзя изучать Erlang, не упомянув Elixir. Это родственный язык, созданный Жозе Валимом и появившийся в 2011 году, и он живёт на той же платформе. Валим, опытный разработчик из мира Ruby, хотел сохранить всю мощь BEAM и OTP, но дать ей более дружелюбный синтаксис и современный инструментарий — и это удалось. Ключевая мысль, которую стоит усвоить сразу: Elixir — это не «другая технология», конкурирующая с Erlang, а другой фасад над тем же фундаментом. Понимая Erlang, вы уже на 80% понимаете Elixir — и наоборот. Всё, что вы узнали про процессы, сообщения, супервизоры и «let it crash», переносится один в один; меняется лишь то, как это записывается.
Что общего
Главное: оба компилируются в байт-код BEAM и используют одни и те же процессы, сообщения, супервизоры и OTP. Под капотом это одна и та же модель акторов и одна и та же отказоустойчивость. Лёгкие процессы, почтовые ящики, изоляция памяти, деревья супервизоров, поведения вроде gen_server — всё это не «фичи Erlang» и не «фичи Elixir», а свойства общей платформы, доступные обоим языкам в равной мере. Поэтому код на Erlang и Elixir свободно вызывает друг друга в одном проекте: для виртуальной машины это просто модули, и неважно, какой компилятор их породил. Можно взять зрелую Erlang-библиотеку и использовать её из Elixir без единой обёртки, и наоборот.
| Аспект | Erlang | Elixir |
| Виртуальная машина | BEAM | BEAM (та же) |
| OTP, процессы | да | да (то же самое) |
| Синтаксис | прологоподобный | рубиподобный |
| Макросы/метапрограммирование | ограниченно | мощные макросы |
| Инструменты сборки | rebar3 | mix (очень удобный) |
Различия в синтаксисе
Сравните одно и то же поведение. Erlang:
double(X) -> X * 2.
sum([]) -> 0;
sum([H | T]) -> H + sum(T).
То же на Elixir:
def double(x), do: x * 2
def sum([]), do: 0
def sum([h | t]), do: h + sum(t)
Идеи идентичны — pattern matching, рекурсия, неизменяемость. Отличаются ключевые слова и пунктуация: Elixir ближе к Ruby, переменные пишут с маленькой буквы, тело функции оформляют через do, а блоки закрывают end. Обратите внимание на одну характерную деталь: в Erlang переменная начинается с большой буквы (X, State), а атом — с маленькой; в Elixir всё наоборот — переменные строчные, а к атомам добавляют двоеточие. Это поверхностное различие, но оно сразу выдаёт, на каком языке написан фрагмент. Под этой косметикой — одна и та же семантика: = в обоих языках не присваивание, а сопоставление с образцом, и данные в обоих неизменяемы.
Что добавляет Elixir
Elixir привнёс удобства, которых не хватало Erlang. Главное из них — мощная система макросов: в Elixir почти весь язык построен на них, и разработчик может расширять синтаксис под задачу, чего в Erlang сделать почти нельзя. Дальше идёт оператор конвейера |>, который передаёт результат одного выражения первым аргументом в следующее и превращает вложенные вызовы в читаемую цепочку слева направо. Добавьте сюда отличный менеджер сборки mix (создание проектов, зависимости, тесты, релизы одной командой), протоколы для полиморфизма, документацию и тесты как часть языка — и станет понятно, почему многие приходят на BEAM именно через Elixir.
Особенно это изменило ситуацию в веб-разработке. Фреймворк Phoenix дал BEAM то, чего ему не хватало для массового продуктового рынка: продуктивный, выразительный стек для веб-приложений с впечатляющей производительностью и такими возможностями, как LiveView — интерактивный интерфейс без написания фронтенда на JavaScript. Под Phoenix лежит всё та же надёжность OTP, но «упакованная» в удобную для веб-команд форму. Именно Elixir и Phoenix во многом вернули платформе широкое внимание за пределами телекома.
Когда что выбирать
Erlang ценят за минимализм, стабильность и прямую близость к платформе. Язык намеренно маленький и почти не меняется годами, что делает его предсказуемым: код десятилетней давности компилируется и работает сегодня. Это идеально для инфраструктурных компонентов, библиотек и систем, которые должны жить десятилетиями без сюрпризов. Команды с глубокой экспертизой в телекоме и сетях часто остаются на Erlang именно по этой причине.
Elixir чаще выбирают для нового продуктового и веб-кода: более дружелюбный синтаксис, развитый mix, богатая экосистема пакетов и Phoenix ускоряют разработку и облегчают найм — особенно разработчиков, пришедших из Ruby или других динамических языков. Но важнее всего понять, что этот выбор — про эргономику и экосистему, а не про возможности или надёжность. Оба языка дают одинаковую отказоустойчивость, одинаковую конкурентность и одинаковую распределённость, потому что под ними один BEAM и один OTP. Никакой язык не «быстрее» и не «надёжнее» другого на уровне платформы. Поэтому правильный вопрос не «что лучше», а «с чем команде комфортнее писать и поддерживать систему» — и часто в одном проекте уживаются оба.
Как работает под капотом
Компилятор Elixir превращает код в те же BEAM-инструкции, что и компилятор Erlang. Модуль Elixir — это обычный модуль BEAM (с именем вида Elixir.MyModule), и из Erlang его можно вызвать. Поэтому в проекте можно смешивать языки: критичный низкоуровневый компонент на Erlang, продуктовую логику на Elixir — они исполняются бок о бок на одной ВМ, делят одни процессы и супервизоры.
Частые ошибки
- Думать, что Elixir надёжнее или быстрее «сам по себе». Под ними одна платформа; надёжность — от BEAM/OTP.
- Считать языки несовместимыми. Они вызывают друг друга без обёрток.
- Учить OTP заново при переходе. Концепции те же — меняется лишь синтаксис.
Итоги
- Erlang и Elixir работают на одной ВМ BEAM и используют один OTP.
- Различается синтаксис и инструментарий, а не модель конкурентности.
- Elixir добавил макросы, конвейер
|>, удобныйmixи веб-фреймворк Phoenix. - Языки взаимно вызывают друг друга и могут жить в одном проекте.