Posts Tagged ‘функциональное программирование’

Эрланг : постусловия и инварианты

May 22, 2009

Что есть что

Инвариант процесса – это некоторая функция, вычисленная над состоянием процесса, которая остается постоянной все время жизни процесса.  Если инвариант разрушился, процесс, очевидно, работает неверно.

Постусловие метода (обработчика сообщения) – условие, которое истинно на выходе функции. Касается каких-либо обязательных завершающих действий или выходных параметров. Если постусловие не достигнуто или не выполнено, очевидно, что-то идет не так.

Типовые применения

Инвариант касается состояния процесса.  Мы, программируя на Эрланге, постоянно меняем состояние – особенно явно в шаблонах gen_server. Важно проверить, что мы его не утратили:


handle_call(Msg, From, State)->

check_invariant(State),

{reply, Reply, NewState} =  safe_handle_call(Msg, From, State),

check_invariant(NewState),

{reply, Reply, NewState}.

safe_handle_call(Msg, From, State)->.... %Ваши методы

Что то вроде того. Штука очень полезная, особенно если состояние сложное – есть риск напутать и поставить не то.

Зачем нужны постусловия. Одно из применений – проверка состояния данных перед отсылкой по сети. Важно быть уверенным, что данные уходят правильные (это, правда, не значит, что они правильными придут:)

Продолжение следует…

Особенности программирования на Эрланге

May 19, 2009

Документация

По теме статьи следует прочесть еще один документ, лежит на сайте эриков:  http://www.erlang.se/doc/programming_rules.shtml

Принципы и шаблоны OTP

Следует использовать везде, где возможно. Почему ? Потому что это уже отлаженный код с заточками. И вообще, в этом языке, как в никаком другом поведенческие паттерны следует обобщать, выделять и помещать в библиотеку. Обобенно  если паттерн так сказать “OTP compliant”. Конкретное местное поведение – в call-back module с собственным behaviour. Последний делается нетрудно.

Доверенные и недоверенные арбайтеры

В общем и целом процессы могут быть разделены на два типа.  Супервизоры и арбайтеры. Арбайтеры (в оригинальной документации – workers) – это тот процесс, который выполняет полезную функциональность. Арбайтеры, в свою очередь, могут быть доверенными и не доверенными. Доверенный арбайтер не может упасть (внезапно завершиться). Скажем так, вероятность такого события крайне мала. Совокупность доверенных арбайтеров образует бессбойное ядро. Доверенные арбайтеры должны использоваться, например, для хранения данных протокола. Недоверенные -  обычные арбайтеры – могут валиться сколько им нравиться, поскольку супервизор их все равно перезапустит.

 Хранение состояния

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

Проектирование сверху вниз

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

 Управление внешними ресурсами

Управление внешними ресурсами – файлами, сокетами, и другими вещами реализуется обычно через прилинкованные процессы (linked processes). Если основной арбайтер упал, то все процессы, прилинкованные к нему, тоже упадут. Таким образом, все зависимые ресурсы будут освобождены.

Язык программирования Erlang

May 16, 2009

Что есть Elang

Во-первых, ссылка : http://www.erlang.org. Язык придумали эрики, жаждавшие облегчить свои мучения при разработке софта для телефонных станций. Можно вполне сказать, что у них получилось – скорость разработки возросла от 9 до 25 раз.

О языке. Эрланг – динамически типизированный строгий функциональный язык. Синтаксис вполне человеческий, чего не скажешь про Лисп и Хаскелл. Впрочем, я их уважаю, особенно Лисп. Для него я в порыве страсти даже написал интерпретатор. Конечно, детский по сравнению с отточенным фирменной реализацией, над которой 40 лет работали лучшие умы человечества.

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

Процессы и сообщения

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

Связи и супервизоры

Каждый процесс может быть связан (link) с другим.  Свзять двухсторонняя, включая процессы, расположенные на разных компах. Упал один процесс – падает и другой.  Особый тип процессов, называемых супервизорами, может отслеживать падение просессов и перезапускать их при необходимости. Супервизоры могут образовывать иерархию – дерево супервизоров. Это делает программы на Эрланг просто неубиваемыми. Профессиональные системы на Эрланг работают практически бессбойно.

Встроенная кластеризация

Приложения могут перемещаться от одной – упавшей – ноды к другой. Или, скажем, работать в пуле, распределяя нагрузку.

Богатая библиотека

Поддержана масса технологий – криптография, XML,  CORBA и пр. Все работает очень изящно.

Мультиплатформенность

Unix  <-> Windows не проблема – приложения переносятся в бинарном виде.

Мои впечатления

Два часа думаешь, потом тебя озаряет , пишешь три(!) строки кода  - и задача решена:)

От написания испытываешь удовольствие.  К сожалению, средства IDE пока не сильно разработаны, так что мы пользуемся старым добрым EMACS & Distel.

Отладчик, как правило, не рулит. Рулит трассировка, всякие там вьюверы процессов и пр. Изрядно  радуют профайлеры и средства оценки распараллеленности приложения. Поражен.

Наиболее частая ошибка, которую я делаю – передаю не те данные, которые ожидает функция (издержки динамической типизации). Врочем, постусловия и инварианты решают проблему (об этом – в следующих выпусках).

Еще, как правило, возникают какие-то сложные переходные процессы при сбоях в приложении – то запустилось, это не запустилось…Впрочем, это от плохого дизайна. Правильный дизайн приложения должен учитывать эти моменты.

Интероперабельность несколько геморройная. Врочем, мне, как опытному в этом деле человеку, показалось легкой (у меня есть с чем сравнить – с Java, .Net, COM).

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

В целом,  от программирования испытываешь удовольствие.