Открыть сервис

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. Включает:

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 критикуют за:

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →