Erlang
Erlang — это функциональный язык программирования общего назначения с акцентом на параллельные, отказоустойчивые и распределённые вычисления. Разработан в 1986 году в компании Ericsson для создания телекоммуникационных систем, требующих высокой надёжности и непрерывной работы (до 99,999 % доступности, так называемое «правило пяти девяток»). Язык работает поверх собственной виртуальной машины (BEAM) и использует модель акторов для управления конкурентностью, что позволяет программам обрабатывать миллионы легковесных процессов одновременно.
История
Разработка в Ericsson
Erlang был создан группой исследователей под руководством Джо Армстронга, Роберта Вирдинга и Майка Уильямса в отделении компьютерных наук Ericsson в Эребру (Швеция). Первоначально язык назывался «Erlang» в честь датского математика и инженера Агнера Крарупа Эрланга, а также как сокращение от «Ericsson Language». Первая версия вышла в 1986 году, но долгое время оставалась внутренним проектом компании. В 1991 году Ericsson открыла исходный код Erlang для внутреннего использования, а в 1998 году — выпустила его под свободной лицензией, что способствовало распространению языка за пределами телекоммуникационной отрасли.
Открытие и стандартизация
В 1998 году Ericsson опубликовала Erlang как открытое программное обеспечение с лицензией, близкой к MPL (Mozilla Public License). В 2000-х годах язык приобрёл популярность в сообществе разработчиков, особенно в области создания серверных приложений, чат-систем, баз данных и финансовых платформ. В 2014 году была выпущена спецификация Open Telecom Platform (OTP) — набор библиотек и инструментов для построения отказоустойчивых систем, который стал стандартом де-факто для промышленного использования Erlang.
Ключевые особенности
Функциональная парадигма
Erlang является функциональным языком: переменные в нём неизменяемы (immutable), отсутствуют циклы в привычном виде (используется рекурсия), а функции являются объектами первого класса. Это упрощает написание кода, свободного от побочных эффектов, и облегчает тестирование.
Конкурентность и модель акторов
Основная единица конкурентности в Erlang — лёгкий процесс (process), который не является процессом операционной системы, а управляется виртуальной машиной BEAM. Процессы изолированы друг от друга, не имеют общего состояния и общаются исключительно через асинхронную передачу сообщений. Это позволяет создавать системы, способные обрабатывать миллионы одновременных соединений без блокировок и гонок данных.
Отказоустойчивость
Erlang реализует философию «let it crash» («пусть падает»): программа проектируется так, чтобы ошибки в одном процессе не нарушали работу всей системы. Виртуальная машина поддерживает иерархию супервизоров (supervisors), которые автоматически перезапускают упавшие процессы в соответствии с заданной стратегией. Это обеспечивает высокую доступность и самовосстановление приложений.
Распределённость
Erlang изначально поддерживает распределённые вычисления: процессы могут находиться на разных узлах (nodes) сети, но общаться так же, как локальные. Виртуальная машина автоматически управляет подключениями, аутентификацией и передачей сообщений между узлами.
Архитектура и среда выполнения
Виртуальная машина BEAM
BEAM (Bogdan/Björn’s Erlang Abstract Machine) — виртуальная машина, выполняющая байт-код Erlang. Она оптимизирована для конкурентных нагрузок: использует собственный планировщик (scheduler) на каждый логический процессор, поддерживает сборку мусора на уровне отдельных процессов (что минимизирует паузы) и обеспечивает детерминированное выполнение.
Open Telecom Platform (OTP)
OTP — это набор стандартных библиотек и архитектурных шаблонов для Erlang. Включает:
- gen_server — шаблон для создания серверов, обрабатывающих запросы;
- gen_fsm — конечные автоматы;
- gen_event — обработчики событий;
- supervisor — деревья супервизоров для управления процессами;
- application — упаковка приложений как единиц развёртывания.
OTP стал де-факто стандартом для построения промышленных систем на Erlang.
Синтаксис и примеры
Erlang использует синтаксис, близкий к Прологу: операторы заканчиваются точкой, переменные начинаются с заглавной буквы, атомы — со строчной. Пример простой функции, вычисляющей факториал:
```erlang -module(factorial). -export([fact/1]).
fact(0) -> 1; fact(N) when N > 0 -> N * fact(N-1). ```
Пример параллельного вычисления с передачей сообщений:
```erlang -module(ping_pong). -export([start/0, ping/2, pong/0]).
ping(0, Pong_PID) -> Pong_PID ! finished; ping(N, Pong_PID) -> Pong_PID ! {ping, self()}, receive pong -> ping(N-1, Pong_PID) end.
pong() -> receive finished -> io:format("Pong finished~n"); {ping, Ping_PID} -> Ping_PID ! pong, pong() end.
start() -> Pong_PID = spawn(ping_pong, pong, []), spawn(ping_pong, ping, [3, Pong_PID]). ```
Применение
Телекоммуникации
Erlang остаётся основным языком для разработки телекоммуникационного оборудования Ericsson: коммутаторов, базовых станций, систем управления сетями. Например, узел AXD 301, используемый в телефонных сетях, работал под управлением Erlang и обслуживал до 30 миллионов вызовов в час.
Серверные и веб-приложения
Erlang применяется для создания высоконагруженных серверов: чат-систем (WhatsApp, Telegram — частично на Erlang), игровых серверов (World of Warcraft использует Erlang для некоторых компонентов), систем обмена сообщениями (RabbitMQ — брокер сообщений на Erlang).
Базы данных и хранилища
На Erlang построены распределённые базы данных: CouchDB (документо-ориентированная), Riak (ключ-значение), Mnesia (встроенная в OTP). Эти системы обеспечивают горизонтальное масштабирование и отказоустойчивость.
Финансовые системы
Erlang используется в торговых платформах и системах обработки транзакций благодаря предсказуемой задержке и высокой доступности. Например, шведская биржа Nasdaq OMX применяла Erlang для некоторых компонентов.
Сообщество и развитие
С 2010-х годов Erlang развивается как проект с открытым исходным кодом под управлением Ericsson и сообщества. Основные релизы выходят регулярно (текущая стабильная версия — 27.x, на начало 2025 года). Существует активное сообщество на форумах, в списках рассылки и на платформе GitHub. Для Erlang написаны тысячи библиотек, доступных через менеджер пакетов Hex.
Влияние на другие языки
Идеи Erlang (модель акторов, отказоустойчивость, лёгкие процессы) повлияли на разработку языков Elixir (работает на той же виртуальной машине BEAM), Go (горутины и каналы), Scala (акторы через Akka) и Rust (асинхронные задачи). Elixir, созданный в 2011 году, стал популярной альтернативой Erlang с более современным синтаксисом, но сохранил совместимость с OTP.
Критика
Erlang критикуют за:
- Сложность синтаксиса — синтаксис, унаследованный от Пролога, считается непривычным для разработчиков, знакомых с C-подобными языками;
- Производительность численных расчётов — из-за неизменяемости данных и накладных расходов на передачу сообщений Erlang плохо подходит для задач, требующих интенсивных вычислений с плавающей точкой;
- Ограниченная поддержка многопоточности на уровне ОС — BEAM использует собственные процессы, которые не отображаются на потоки ядра, что может снижать производительность на некоторых архитектурах;
- Небольшое сообщество — по сравнению с Java, Python или JavaScript, количество разработчиков Erlang относительно невелико, что ограничивает доступность специалистов и библиотек.
Интересные факты
- Название «Erlang» также является омонимом единицы измерения телефонной нагрузки (эрланг), названной в честь того же Агнера Крарупа Эрланга.
- Система AXD 301 от Ericsson, работающая на Erlang, демонстрировала доступность 99,9999999 % (девять девяток) в течение нескольких лет эксплуатации.
- WhatsApp, приобретённый Facebook (организация признана экстремистской и запрещена в РФ) в 2014 году, использовал Erlang для серверной части, обслуживая более 2 миллиардов пользователей при небольшой команде разработчиков (около 50 инженеров на пике).
Источники
- Armstrong, J., Virding, R., Williams, M. (1993). Concurrent Programming in Erlang. Prentice Hall.
- Cesarini, F., Thompson, S. (2009). Erlang Programming: A Concurrent Approach to Software Development. O'Reilly Media.
- Ericsson AB. Erlang/OTP Documentation. Официальный сайт проекта Erlang (erlang.org).
- Logan, M., Merritt, E., Carlsson, R. (2011). Erlang and OTP in Action. Manning Publications.
- Документация Open Telecom Platform (OTP), версия 27.0, 2024.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →