Posts Tagged ‘erlang’

Как быстро писать программы лучшего качества

December 10, 2009

Америка не унывает

Заразили меня американские партнеры своей энергией. Вот ведь неунывающие люди! Работают по 60-75 часов в неделю и не боятся, что может и вообще ничего не выйти.  За быструю разработку программ в американских коммпаниях начисляется бонус. Определенно, я его заслуживаю, поскольку предлагаю новую программную связку

Delphi + Erlang

Я долго писал серверные программы на Object Pascal. Есть определенная методика, как все сделать быстро, качественно, чтобы не было утечек и прочее.  Простой сервер на TCP изготовляю, скажем, за пару часов – все чин-чинарем, сервис Windows, каждому подключению – свой поток, встроенный маршаллинг и прочее.  Но все эти высокие скоростные показатели – ничто, если Вы пишете на Эрланг! Там реализация сервера – вопрос единиц минут!

Delphi очень хороша для написания визуальных интерфейсов. Я не говорю, что C# или Java плохи. Да и в Erlang есть визуальные средства, начиная с последней версии – даже очень неплохие.  Ладно. Главное, что я хочу сказать – вы можете разработать визуальное приложение тоже за несколько минут. Дык чуваки!!!

Если надо написать и клиента и сложный сервер со встроенной кластеризацией и прочими вкуснятиной, связка Delphi + Erlang = реальный шанс сделать все быстро!

Интероперабельность

Ах да, форматы. Я подумал за Вас и написал КОНВЕРТЕР Delphi <-> Erlang. (Напишите мне на killy@newmail.ru и я Вам его пришлю). Этот же конвертер пригодиться Вам, если Вы будете писать, скажем, драйвер для Erlang на Паскале. Я вовсе не говорю, что C++ – плохой язык. В тех местах, где требуется особенно высокое быстродействие, я всегда драйвера пишу на C.  Как выглядит код взаимодействия <<Вставить ссылочку на код>>.

Все тонкие моменты маршаллинга я учел :

  • оптимизация передачи списков целых <=255 (принимаются как строка)
  • новый и старый форматы float
  • передача хвоста списка

Что Вам надо сделать, чтобы передать данные ИЗ Паскаля:

MarshalledData  := Marshall(..данные тупла тут...);
cbNetLen         := RevertCardinal(Length(MarshalledData);
Socket.Write(cbNetLen, SizeOf(Cardinal));
Socket.Write(Pointer(MarshalledData)^, Length(MarshalledData));

Т.е. маршаллим данные, берем длину буфера, переворачиваем ее в сетевой формат (RevertCardinal = htonl), посылаем. Вдогонку – буфер.

Если мы укажем в проге на Эрланг режим сокета [active, {packet,4}],

каждой нашей посылке будет соответстовать одно сообщение в Erlang – нам не надо самим собирать пакет! Все, что нам нужно, это сделать так:

handle_info({tcp, Socket, Data}, State)->;
           MyTerm=binary_to_term(Data),
           some_processing(MyTerm),
           {noreply, State}.

УСЕ!
Мне вштырило. Раньше я писал проги за часы, теперь – за минуты. Качественный клиент с профессиональными компонентами (dx, скажем), и качественный сервер – OTP-compliant. Мне премия!

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

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).

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

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