По собственному опыту знаю – увидев в заголовке или в тексте статьи незнакомые названия экзотических языков или труднопроизносимые термины, читатель стремится перелистнуть страницу в поисках чего-нибудь поинтереснее. В этой статье мы постараемся убедить вас, что как минимум один такой экзотический язык может быть интересным.
Так что же такое Erlang?
В далеком 1985-м году группа разработчиков из компьютерных лабораторий компании Ericsson решила создать язык, который идеально бы подходил для решения задач в телекоме. Шесть лет спустя, в 1991-м, миру был представлен такой язык – Erlang.
ПРИМЕЧАНИЕ
Среди любителей Erlang-а бытует мнение, что Erlang расшифровывается как ERicsson LANGuage. На самом деле язык назван в честь Агнера Крарупа Эрланга, датского математика, который работал в области телекоммуникаций. Так, единица измерения телекоммуникационного траффика также называется «Erlang».
С 1992 года Erlang начал применяться в компании Ericsson для разработки телекомуникационного оборудования. Например, бoльшая часть функциональности флагманского продукта компании, свитча AXD-301, реализована с использованием Erlang-а.
В 1998 году были опубликованы исходные коды языка и его библиотек. С тех пор Erlang стал не просто языком для телекоммуникационных приложений, а полноценным языком общего назначения. Ericsson до сих пор развивает Erlang, и его бесплатная версия собирается из тех же исходников, что и коммерческая.
И все же, что такое Erlang?
Кратко говоря, Erlang – это язык программирования общего назначения и среда исполнения. В язык встроена поддержка распределенных и параллельных вычислений.
А если говорить подробнее, то Erlang предлагает разработчику следующее
Параллельные вычисления. Erlang использует легковесные процессы (не путать с процессами ОС!), не затрагивающие потоки операционной системы. Процессы Erlang - это аналоги процессов ОС в том смысле, что все ссылки на объекты внутри них недоступны другим процессам. Но обеспечивается это не за счет изоляции адресных пространств, а за счет типобезопасности языка и программной изоляции ссылок. Если проводить аналогии с процессами и потоками Windows, процессы Erlang являются чем-то средним между процессом и потоком, так как, с одной стороны являются изолированным объектным пространством, а с другой – непосредственно исполняют код, принадлежащий этому пространству (процессы Windows содержат потоки, которые реально выполняют код, но сами процессы код не выполняют). Основное отличие процессов Erlang от потоков заключается в том, что реализация переключения контекста в Erlang значительно дешевле, чем для потоков, что позволяет существенно повысить эффективность при исполнении множества процессов Erlang на одном процессоре. На практике это означает, что на обычной пользовательской машине можно запустить несколько десятков тысяч процессов Erlang и не ощутить замедления быстродействия системы (по сравнению с аналогичным количеством потоков ОС).
Надежность. Erlang позволяет выстраивать различные сценарии для отслеживания всевозможных состояний системы – от примитивных (отслеживание состояния различных процессов) до продвинутых (таких, как создание failover-кластеров).
«Горячая» замена кода. Erlang позволяет отслеживать изменения в системе и загружать обновленные версии кода без остановки всей системы, что особенно важно, если такая остановка невыгодна или невозможна.
Внешние интерфейсы. Процессы в Erlang-е взаимодействуют друг с другом путем передачи асинхроных сообщений. На этом же принципе построено взаимодействие и с программами, написанными на С/С++ или Java. Существует также интерфейс взаимодействия с .NET.
В состав стандартных библиотек Erlang-а входят, например, следующие продукты:
Mnesia. Распределенная СУБД.
Inets. HTTP-клиент и сервер, а также FTP-клиент.
Orber. CORBA v2.0 Object Request Broker (ORB).
И где я могу его использовать?
Erlang можно использовать в самых разнообразных областях. На данный момент Erlang с успехом применяется, например:
Для телекоммуникационного оборудования (например, в компаниях Ericsson и Nortel).
Для создания сервера ejabberd на основе протокола Jabber.
Для управления поездами (например, в метро в городе Лион, Франция).
В БД-приложениях, нуждающихся в режиме, близком к режиму реального времени.
1 Введение
1.1 Вступление
Это – простая обучающая статья, посвященная началам работы с Erlang. В ней все верно, но это только часть правды. Например, я привожу только самую простую форму синтаксиса, но не все его эзотерические формы. Там, где я уж очень упрощаю, я буду писать *manual*, что означает, что куда больше информации можно найти в книгах или в Erlang Reference Manual.
Я также предполагаю, что вы не в первый раз сели за компьютер, и что вы имеете общее представление о том, как их программируют. Не волнуйтесь, я не рассчитываю на то, что вы – гуру.
1.2 Пропущенные вещи
Перечисленное ниже в этой статье не рассматривается:
Ссылки.
Локальная обработка ошибок (catch/throw).
Однонаправленные связи (monitor).
Работа с бинарными данными (binaries/синтаксис работы с битами).
List comprehensions (специальный синтаксис, упрощающий работу со списками).
Здесь не рассматривается также связь с внешним миром и/или ПО, написанным на других языках. Впрочем, для этого есть отдельная обучающая статья, Interoperability Tutorial.
Затронуто очень мало библиотек Erlang (например, для работы с файлами).
OTP (большой набор библиотек Erlang) вообще пропущен, и, следовательно, СУБД Mnesia – тоже.
Хеш-таблицы (ETS).
Изменение кода работающих систем.
2 Последовательное программирование
2.1. Оболочка Erlang
2.2 Модули и функции
2.2 Modules and Functions
2.3 Атомы
2.4 Кортежи
2.5 Списки
2.6 Стандартные модули и документация
2.7 Вывод на консоль
2.8 Больший пример
2.9 Сопоставление, защита и область видимости переменных
2.10 Еще о списках
2.11 If и Case
2.12 Встроенные функции (Built In Functions, BIF)
3 Параллельное программирование
3.1 Процессы
3.2 Обмен сообщениями
3.3 Регистрированные имена процессов
3.4 Распределенное программирование
3.5 Больший пример
4. Устойчивость к ошибкам
4.1 Ограничения по времени
4.2 Обработка ошибок
5 Записи и макросы
5.1 Пример побольше, разделенный на несколько файлов
5.2 Заголовочные файлы
5.3 Записи
5.4 Макросы
Полная версия этой статьи опубликована в журнале
RSDN Magazine
#3-2006. Информацию о журнале можно найти здесь