Erlang

From JaWiki (Jabber/XMPP wiki)
Revision as of 11:17, 8 July 2009 by Vindicar (Talk | contribs)

Jump to: navigation, search

Erlang (Эрла́нг) — функциональный язык программирования, позволяющий писать программы для разного рода распределённых систем. Разработан и поддерживается компанией Ericsson. Язык включает в себя средства порождения параллельных процессов и их коммуникации с помощью посылки асинхронных сообщений. Программа транслируется в байт-код, исполняемый виртуальной машиной, что обеспечивает переносимость.

Кратко формулу языка можно выразить как Erlang=функциональный язык+процессы.

Язык динамический. Синтаксис наследован от Prolog. Компактен, содержит минимум конструкций, лёгок для освоения, но не примитивен.

К услугам программиста — модули, полиморфные функции, сопоставление с образцом, анонимные функции, условные конструкции, структуры, обработка исключений, оптимизация хвостовой рекурсии. В общем базовый арсенал современных функциональных языков.

Функциональная парадигма (отсутствие присваиваний) позволяет Erlang избежать таких традиционных для императивных языков проблем распределенных приложений, как необходимость синхронизации, опасность возникновения тупиков и гонок.

Главное в Erlang — его модель легковесных процессов. Перефразируя для Erlang слоган текущего дня "Everything is an object" («Всё является объектом»), можно сказать "Everything is a process" («Всё является процессом»).

Процессы дёшевы, создание процесса занимает не больше ресурсов, чем вызов функции. Единственным способом взаимодействия процессов является асинхронный обмен сообщениями.

При желании процесс может установить связь (link) с другими процессами и по выбору или получить сообщение о их смерти с указанием причины или разделить их участь.

Процесс имеет свой «почтовый ящик», откуда может выборочно читать сообщения, в чем очень помогает сопоставление по шаблону, код проверки «ящика» чем-то похож на программу на awk, нужное выгребается и обрабатывается, остальное остаётся или выбрасывается.

На разработку программ накладывают сильный отпечаток два момента.

  • Язык стимулирует к созданию большого количества конкурентных процессов.
  • Процессы жёстко изолированы и не имеют общего состояния.

Процесс проектирования заключается в итеративном разбиении системы на иерархии конкурентно взаимодействующих подсистем, пока составляющие не станут достаточно просты для реализации.

Мощность связки «Процессы+сообщения» не меньше, чем «Объекты+Интерфейсы+Наследование», но зачастую приводит к более компактным и понятным решениям. Устранение конкуренции так же просто, как и создание. Отсутствие необходимости блокировки доступа к состоянию процесса для синхронизации их взаимодействия сильно облегчает жизнь. Для конкурентного ресурса обычно просто создаётся процесс-монитор, через который осуществляется взаимодействие с ресурсом.

Второй момент выражается в формуле «let it crash» («пусть процесс упадет»). Вместо перехвата ошибок и попытки продолжения работы часть программы, содержащая рискованный код, выделяется в отдельный процесс-камикадзе, этот процесс делает все возможное, чтобы система убила его в случае возникновения ошибки, а процесс-родитель только получает сообщения о смерти таких незадачливых потомков и делает выводы.

Учитывая, что обычно в 90% подобных ситуаций ничего более путного, чем вывести сообщение об ошибке и попытаться жить с этой болью дальше, не представляется возможным, отсутствие в коде многочисленных проверок не так уж непривлекательно.

Распределённое взаимодействие

Запущенный экземпляр эмулятора Erlang называется узлом (node). Узел имеет имя и «знает» о существовании других узлов на данной машине или в сети.

Создание и взаимодействие процессов разных узлов не отличается от взаимодействия процессов внутри узла. Для создания процесса на другом узле процессу достаточно знать его имя и, без особых на то оснований, он может не интересоваться физическим расположением взаимодействующего с ним процесса.

См. также

Ссылки

  • http://www.erlang.org/ — open-source реализация
  • http://www.erlang-projects.org/ — проекты, использующие Erlang в качестве основного языка разработки, REPOS (репозитарий проектов на Эрланге — коллекция библиотек, приложений и утилит)
  • http://www.trapexit.org/ — форум, вики, решения, учебные пособия, справочные материалы
  • Erlang по-русски — проект по переводу документации на русский язык