Erlang
Материал из Википедии — свободной энциклопедии
Семантика: | мультипарадигменный: конкурентное, функциональное программирование |
---|---|
Тип исполнения: | {{{class}}} |
Появился в: | 1987 г. |
Автор(ы): | Ericsson |
Типизация данных: | cтрогая, динамическая |
Основные реализации: | Erlang |
Диалекты: | |
Создан под влиянием: | не известно |
Оказал влияние на: |
Erlang (Эрла́нг) — функциональный язык программирования, позволяющий писать программы для разного рода распределённых систем. Разработан и поддерживается компанией Ericsson. Язык включает в себя средства порождения параллельных процессов и их коммуникации с помощью посылки асинхронных сообщений. Программа транслируется в байт-код, исполняемый виртуальной машиной, что обеспечивает переносимость.
Кратко формулу языка можно выразить как Erlang=функциональный язык+процессы.
Язык динамический. Синтаксис наследован от Prolog. Компактен, содержит минимум конструкций, лёгок для освоения, но не примитивен.
К услугам программиста — модули, полиморфные функции, сопоставление по шаблону, анонимные функции, условные конструкции, структуры, обработка исключений, оптимизация хвостовой рекурсии. В общем базовый арсенал современных функциональных языков.
Функциональная парадигма (отсутствие присваиваний) позволяет Erlang избежать такие традиционные для императивных языков проблемы распределенных приложений как deadlocks, syncronization, race conditions.
Главное в Erlang — его модель легковесных процессов. Перефразируя для Erlang слоган текущего дня «Everything is object» («Все является объектом»), можно сказать «Everything is 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 по-русски — проект по переводу документации на русский язык