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 без единой обёртки, и наоборот.

АспектErlangElixir
Виртуальная машинаBEAMBEAM (та же)
OTP, процессыдада (то же самое)
Синтаксиспрологоподобныйрубиподобный
Макросы/метапрограммированиеограниченномощные макросы
Инструменты сборкиrebar3mix (очень удобный)

Различия в синтаксисе

Сравните одно и то же поведение. 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.
  • Языки взаимно вызывают друг друга и могут жить в одном проекте.
Проверьте себя
1. Что общего у Erlang и Elixir?
AТолько название
BОни работают на одной виртуальной машине BEAM и используют один OTP
CОдинаковый синтаксис
DНичего
2. Что из перечисленного добавил именно Elixir?
AЛёгкие процессы
BСупервизоры
CМощные макросы, оператор |> и удобный mix
DВиртуальную машину BEAM
3. Можно ли в одном проекте использовать и Erlang, и Elixir?
AНет, они несовместимы
BДа — оба компилируются в BEAM и вызывают друг друга напрямую
CТолько через сеть
DТолько при перекомпиляции в один язык