- Эрланг (язык программирования)
-
Erlang Файл:Erlang logo.png Семантика: мультипарадигмальный: конкурентное, функциональное программирование
Появился в: 1987 г.
Автор(ы): Типизация данных: Основные реализации: Erlang, Erlang HiPE
Erlang (Эрла́нг) — функциональный язык программирования, позволяющий писать программы для разного рода распределённых систем. Разработан и поддерживается компанией байт-код, исполняемый виртуальной машиной, что обеспечивает переносимость.
Кратко формулу языка можно выразить как Erlang=функциональный язык+процессы.
Язык динамический. Синтаксис наследован от Prolog. Компактен, содержит минимум конструкций, лёгок для освоения, но не примитивен.
К услугам программиста — модули, полиморфные функции, сопоставление с образцом, анонимные функции, условные конструкции, структуры, обработка исключений, оптимизация хвостовой рекурсии. В общем, базовый арсенал современных функциональных языков.
Функциональная парадигма (отсутствие присваиваний) позволяет Erlang избежать таких традиционных для императивных языков проблем распределённых приложений, как необходимость синхронизации, опасность возникновения тупиков и гонок.
Главное в Erlang — его модель легковесных процессов. Перефразируя для Erlang слоган текущего дня «Everything is an object» («Всё является объектом»), можно сказать «Everything is a process» («Всё является процессом»).
Процессы дёшевы, создание процесса занимает не больше ресурсов, чем вызов функции. Единственным способом взаимодействия процессов является асинхронный обмен сообщениями.
При желании процесс может установить связь (link) с другими процессами и по выбору или получить сообщение о их смерти с указанием причины или разделить их участь.
Процесс имеет свой «почтовый ящик», откуда может выборочно читать сообщения, в чём очень помогает сопоставление по шаблону, код проверки «ящика» чем-то похож на программу на awk, нужное выгребается и обрабатывается, остальное остаётся или выбрасывается.
На разработку программ накладывают сильный отпечаток два момента:
- Язык стимулирует к созданию большого количества конкурентных процессов.
- Процессы жёстко изолированы и не имеют общего состояния.
Процесс проектирования заключается в итеративном разбиении системы на иерархии конкурентно взаимодействующих подсистем, пока составляющие не станут достаточно просты для реализации.
Мощность связки «Процессы+сообщения» не меньше, чем «Объекты+Интерфейсы+Наследование», но зачастую приводит к более компактным и понятным решениям. Устранение конкуренции так же просто, как и создание. Отсутствие необходимости блокировки доступа к состоянию процесса для синхронизации их взаимодействия сильно облегчает жизнь. Для конкурентного ресурса обычно просто создаётся процесс-монитор, через который осуществляется взаимодействие с ресурсом.
Важный принцип работы процесса формулируется как «let it crash» («пусть процесс упадет»). Вместо перехвата ошибок и попытки продолжения работы, часть программы, содержащая рискованный код, выделяется в отдельный «процесс-смертник», и этот процесс делает всё возможное, чтобы система убила его в случае возникновения ошибки, а процесс-родитель готов получать сообщения о смерти таких подпроцессов и обрабатывать их. Этот принцип приводит к тому, что код избавляется от многочисленных проверок, которые ранее приводили к невразумительным сообщениям об ошибке, труднопонятным пользователю. Разработчики считают этот принцип преимуществом языка.
Содержание
Распределённое взаимодействие
Запущенный экземпляр эмулятора Erlang называется узлом (node). Узел имеет имя и «знает» о существовании других узлов на данной машине или в сети.
Создание и взаимодействие процессов разных узлов не отличается от взаимодействия процессов внутри узла. Для создания процесса на другом узле процессу достаточно знать его имя и, без особых на то оснований, он может не интересоваться физическим расположением взаимодействующего с ним процесса.
Распределённое программирование
Программы написанные на Erlang способны работать на нескольких узлах. Узлами могут быть процессоры, многие ядра одного процессора либо целый кластер машин.
Достигается это за счет того, что хорошо написанная программа создает большое количество легких процессов.
Один процесс на много потоков не разбить, а если у вас сотни процессов? Какая вам теперь разница, одно ли у вас ядро в компьютере или их там сотня? То есть, теперь, чем сложнее ваше приложение и чем больше оно создает процессов, тем оно масштабируемей.
И наоборот, если вы не используете преимущества функционального программирования, то всегда сумеете довести программу до того, что она сможет работать только в один поток.
Erlang и ООП
Человек который привык к Си-подобным языкам, иногда не понимает, что создание отдельного процесса с возможностью обмениваться с ним сообщениями, равнозначно созданию экземпляра класса.
Да, принцип сильно отличается от привычных разновидностей ООП, но результат как минимум не уступает в своей эффективности.
См. также
- Сравнение возможностей Erlang с другими языками см. в статье Сравнение языков программирования
- веб-сервер написанный на Erlang’е
-
- Nitrogen — каркас для создания веб-приложений на языке Erlang.
- Disco — это реализация Nokia. Ее ядро написано на языке Erlang и приложения для нее можно писать на языке Python.
- Apache CouchDB - документоориентированная база данных с
Ссылки
- http://www.erlang.org/ — open-source реализация (англ.)
- http://www.erlang-projects.org/ — проекты, использующие Erlang в качестве основного языка разработки, REPOS (репозитарий проектов на Эрланге — коллекция библиотек, приложений и утилит) (англ.)
- http://www.trapexit.org/ — форум, вики, решения, учебные пособия, справочные материалы (англ.)
- Erlang по-русски — проект по переводу документации на русский язык (рус.)
- Статья: «Язык Erlang и программирование для мультиядерных процессоров» (рус.)
- Начала работы с Erlang на RSDN (рус.)
- Erlang Comunity на Гугле (рус.)
- Planet Erlang Собрание материалов по языку (англ.)
Основные языки программирования Используемые
в разработкеПрочие
Wikimedia Foundation. 2010.