Erlang — это функциональный язык программирования, разработанный для создания систем с высокими требованиями к параллелизму, отказоустойчивости и распределенной обработки. Он был разработан компанией Ericsson в конце 1980-х годов и первоначально предназначался для телекоммуникационного оборудования.
Само название Erlang имеет двойное происхождение, и существует две основные версии, объясняющие, почему язык программирования получил такое имя.
- Дань уважения Агусту Эрланду. Язык может быть назван в честь Агуса Эрланда (Agner Krarup Erlang), датского математика и инженера, который внес значительный вклад в теорию массового обслуживания и телекоммуникационные технологии. Его работа в области теории очередей и вероятностного анализа телефонных сетей стала основополагающей для развития телекоммуникаций.
- Сокращение от Ericsson Language. Название также можно расшифровать как Ericsson Language (язык Ericsson), так как он был разработан в компании Ericsson в конце 1980-х годов. Ericsson — шведская компания, известная своими разработками в области телекоммуникаций. Erlang изначально создавался для разработки телекоммуникационного оборудования, что также отражает его тесную связь с этой индустрией.
До сих пор, по данным опроса Stack Overflow 204 года, Erlang остается языком программирования с самой высокой зарплатой в мире.
Особенности языка
Основные особенности языка включают:
Параллелизм: Язык использует легковесные процессы, которые могут выполняться параллельно. Эти процессы не используют общую память, а общаются друг с другом посредством передачи сообщений.
Отказоустойчивость: В Erlang легко реализовать системы, устойчивые к сбоям, благодаря использованию концепций, таких как «наблюдатели» (supervisors), которые следят за процессами и перезапускают их в случае сбоя.
Горячая замена кода: Язык поддерживает обновление кода без остановки системы, что особенно полезно для систем, которые должны работать непрерывно.
Функциональный подход: Erlang — функциональный язык программирования с поддержкой неизменяемых данных, что упрощает написание и отладку параллельного кода.
Основные конструкции Erlang
В языке программирования есть несколько ключевых конструкций, которые помогают организовывать код, управлять параллелизмом и взаимодействием между процессами. Рассмотрим основные из них.
- Модули: Код в Erlang организован в модули. Модуль — это файл, содержащий функции, которые можно экспортировать и вызывать из других модулей.
- Процессы: Erlang-процессы очень легковесны и создаются с помощью функции
spawn
. - Сообщения: Процессы взаимодействуют посредством отправки и получения сообщений. Отправка сообщения осуществляется оператором
!
, а получение — конструкциейreceive
.
Пример кода
Простой пример модуля на Erlang, реализующего факториал:
-module(factorial). -export([fac/1]). fac(0) -> 1; fac(N) when N > 0 -> N * fac(N - 1).
Как запустить файл Erlang?
Для запуска Erlang-кода используется интерактивная оболочка erl. Для компиляции модуля и его использования:
1. Открываем оболочку:
erl
2. Компилируем модуль:
c(factorial).
3. Вызываем функцию:
factorial:fac(5).
Erlang также включает мощный фреймворк OTP (Open Telecom Platform), который предоставляет библиотеки и инструменты для построения сложных систем.
Преимущества и недостатки Erlang
Как и любого другого языка программирования, у Erlang есть как свои преимущества, так и недостатки. Перечислим некоторые из них.
Преимущества:
- Высокий уровень параллелизма и распределенной обработки.
- Простота написания отказоустойчивых систем.
- Поддержка горячей замены кода.
Недостатки:
- Уступает по производительности языкам низкого уровня для вычислительно интенсивных задач.
- Нетривиальное обучение из-за функционального подхода и особенностей параллельного программирования.
Где используется Erlang
Язык используется в различных областях, где необходимы высоконадежные, масштабируемые и параллельные системы. Вот некоторые из ключевых областей и примеров использования языка.
1. Телекоммуникации
Erlang был изначально разработан для телекоммуникационных систем, и эта область остается одной из основных, где он активно используется. Erlang изначально был создан для использования в телекоммуникационном оборудовании компании Ericsson, и до сих пор применяется в их продуктах, таких как AXD301, многопротокольный маршрутизатор.
2. Системы мгновенных сообщений и социальные сети
Erlang подходит для систем, требующих высокой степени параллелизма и низкой задержки.
- WhatsApp: Один из самых известных примеров. WhatsApp использует Erlang для обработки огромного количества сообщений в реальном времени с минимальной задержкой и высокой надежностью.
- Facebook* Chat: Первоначальная версия Facebook Chat также использовала Erlang для обеспечения масштабируемости и надежности.
3. Финансовые системы
Финансовые системы часто требуют высокой доступности и быстрого времени отклика. Некоторые финансовые приложения в компании Goldman Sachs используют язык для обработки большого количества транзакций и обеспечения высокой доступности.
4. Интернет-сервисы и веб-приложения
Erlang используется для создания надежных серверных приложений, которые могут обрабатывать большое количество одновременных подключений.
- RabbitMQ: Популярный брокер сообщений, использующий этот язык, обеспечивающий высокую производительность и надежность для распределенных систем обмена сообщениями.
- Ejabberd: Высокопроизводительный и масштабируемый сервер XMPP, который используется для создания систем обмена мгновенными сообщениями.
5. Онлайн-игры
Онлайн-игры требуют обработки большого количества одновременных пользователей и предоставления минимальной задержки. Riot Games, компания, стоящая за популярной игрой League of Legends, использует Erlang для обработки игровых серверов и обеспечения низкой задержки и высокой доступности.
6. Облачные и распределенные системы
Язык хорошо подходит для создания облачных и распределенных систем, требующих высокой отказоустойчивости.
- Cloudant: Облачная база данных, основанная на CouchDB, использует язык для обеспечения масштабируемости и надежности.
- Heroku: Платформа как услуга (PaaS), использует язык для обеспечения некоторых своих внутренних сервисов.
7. Интернет вещей (IoT)
Системы IoT требуют надежного и масштабируемого программного обеспечения для управления большим количеством устройств. Компания AdRoll, занимающаяся рекламой в Интернете, использовала Erlang для обработки данных и предоставления аналитики в реальном времени.
Erlang зарекомендовал себя как мощный инструмент для создания высоконадежных и масштабируемых систем. Его использование в телекоммуникациях, системах мгновенных сообщений, финансовых приложениях, веб-сервисах, онлайн-играх и облачных системах показывает его универсальность и способность решать сложные задачи, связанные с параллелизмом и отказоустойчивостью.