Событийно-ориентированное программирование

Поделись знанием:
Перейти к: навигация, поиск
Парадигмы программирования
 • Императивная
(контрастирует с декларативной)
Процедурная
Структурная
Аспектно-ориентированная
Объектно-ориентированная
Агентно-ориентированная
Компонентно-ориентированная
Прототипно-ориентированная
Обобщённое программирование

 • Декларативная
(контрастирует с императивной)

Чистота языка
Чистота функции
Функциональная
В терминах Рефал-машины
Аппликативная
Комбинаторная
Бесточечная
(чистая конкатенативная)
Логическая
Ограничениями

 • Конкатенативная
 • Векторная[en]
 • Метапрограммирование

Языково-ориентированная
Предметно-ориентированная
Пользователями[en]
Автоматизация процесса программирования
Рефлексивность
Гомоиконность[en]

 • Связанные темы

Программирование в крупном и мелком масштабе[en]
Модульность
Полиморфизм
Продолжения и CPS
Параллелизм и конкурентность

 • Методы и алгоритмы

Автоматное
Динамическое
Потоков данных
Событийно-ориентированное
Реактивное
Сервис-ориентированное

Событи́йно-ориенти́рованное программи́рование (англ. event-driven programming; в дальнейшем СОП) — парадигма программирования, в которой выполнение программы определяется событиями — действиями пользователя (клавиатура, мышь), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета).

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

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





Сфера применения

Событийно-ориентированное программирование, как правило, применяется в трёх случаях:

  1. при построении пользовательских интерфейсов (в том числе графических);
  2. при создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов;
  3. при программировании игр, в которых осуществляется управление множеством объектов.

Применение в серверных приложениях

Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10000 одновременных соединений и более.

В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам:

  • слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стек);
  • слишком велики накладные расходы на переключение контекстов.

Философской предпосылкой для отказа от потоковой модели серверов может служить высказывание Алана Кокса: «Компьютер — это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы»[1].

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

Мультиплексирование

Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:

  • select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
  • poll и epoll (Linux);
  • kqueue (FreeBSD);
  • /dev/poll (Solaris);
  • IO completion port (Windows);
  • POSIX AIO на текущий момент только для операций дискового ввода-вывода;
  • io submit и eventfd для операций дискового ввода-вывода.

Примеры реализаций

Применение в настольных приложениях

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

Обработчик события может выглядеть следующим образом (на примере C#):

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Была нажата кнопка");
        }

Здесь обработчик события представляет собой процедуру, в которую передается параметр sender, как правило содержащий указатель на источник события. Это позволяет использовать одну и ту же процедуру для обработки событий от нескольких кнопок, различая их по этому параметру.

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

В языке C# события реализованы как элемент языка и являются членами классов. Механизм событий здесь реализует шаблон проектирования Publisher/Subscriber. Пример объявления события:

    public class MyClass
    {
        public event EventHandler MyEvent;
    }

Здесь EventHandler — делегат, определяющий тип процедуры обработчика событий. Подписка на событие производится следующим образом:

            myClass.MyEvent += new EventHandler(Handler);

Здесь myClass — экземпляр класса MyClass, Handler — процедура-обработчик. Событие может иметь неограниченное количество обработчиков. При добавлении обработчика события он добавляется в специальный стек, а при возникновении события вызываются все обработчики по их порядку в стеке. Отписка от события, то есть удаление обработчика производится аналогично, но с использованием оператора «-=».

Разные языки программирования поддерживают СОП в разной степени. Наиболее полной поддержкой событий обладают следующие языки (неполный список):

Остальные языки, в большей их части, поддерживают события как обработку исключительных ситуаций.

Инструменты и библиотеки

  • Node.js, событийно-ориентированный I/O фреймворк на JavaScript движке V8
  • Cocoa & Objective-C, рефлексивный объектно-ориентированный язык программирования, добавляющий сообщения в стиле Smalltalk в язык Си.
  • GLib
  • Gui4Cli[4], событийно-ориентированный язык программирования для Windows
  • libsigc++ (англ.)
  • libevent
  • POCO
  • libasync, часть библиотек sfs и sfslite[5], эффективная событийная библиотека для C++
  • Perl Object Environment (англ.)
  • AnyEvent, EV — модули на Perl для событийно-ориентированного программироания
  • PRADO (англ.), компонентный событийно-ориентированный инструмент для Web-программирования на PHP 5
  • Tcl
  • Twisted, Python
  • Qt, кроссплатформенная библиотека виджетов для C++, основанная на модели управления событиями. Существует сокращённая версия, называемая Qt/Console, из которой исключён код поддержки виджетов, и представляющий собой управляемый событиями фреймворк, в который также включены некоторые дополнительные средства, вроде кроссплатформенной работы с сетью, многопоточности и работы с XML.
  • QP — семейство открытых событийно-ориентированных окружений для встроенных систем реального времени[6]
  • Simple Unix Events a.k.a. SUE[7], простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++.

См. также

Англоязычные источники

  • [c2.com/cgi/wiki?EventDrivenProgramming описание] из [c2.com/ppr/ Portland Pattern Repository]
  • [eventdrivenpgm.sourceforge.net/ Event-Driven Programming: Introduction, Tutorial, History] — учебное пособие Стефана Ферга (Stephen Ferg)
  • [www.freenetpages.co.uk/hp/alan.gauld/tutevent.htm Event Driven Programming] учебное пособие Алана Голда (Alan Gauld)
  • [www.martinfowler.com/eaaDev/EventCollaboration.html Martin Fowler. Event Collaboration]
  • [www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=504 Ben Watson. Transitioning from Structured to Event-Driven Programming]
  • [today.java.net/lpt/a/32 Jonathan Simon. Rethinking Swing Threading]
  • [www.csse.uwa.edu.au/cnet/eventdriven.html Chris McDonald. The event driven programming style]
  • [codeproject.com/cpp/static-callbacks.asp Christopher Diggins. Event Driven Programming using Template Specialization]
  • [www.swe.uni-linz.ac.at/people/schiffer/se-94-17/se-94-17.htm Stefan Schiffer and Joachim Hans Fröhlich. Concepts and Architecture of Vista — a Multiparadigm Programming Environment]
  • [docs.eiffel.com/eiffelstudio/general/guided_tour/language/invitation-09.html Event-Driven Programming and Agents]
  • [zone.ni.com/devzone/devzone.nsf/webcategories/FCE7EA7ECA51169C862567A9005878EA LabWindows/CVI Resources]
  • [javalobby.org/forums/thread.jspa?threadID=13874&messageID=91806918&tstart=0 Comment] by Tim Boudreau
  • [news.tmcnet.com/news/2006/08/18/1816129.htm Complex Event Processing and Service Oriented Architecture]
  • Event-driven programming and SOA: [soa-eda.blogspot.com/2006/11/how-eda-extends-soa-and-why-it-is.html Jack van Hoof. How EDA extends SOA and why it is important;;]
  • Пример с открытым кодом: [www.codeplex.com/pubsub Distributed Publish/Subscribe Event System]
  • Событийно-ориентированное программирование на языке Java: [jsasb.dev.java.net/ Rex Youung. Jsasb]

Материалы на русском

  • Н. Н. Непейвода. 13. Лекция: Событийное программирование // [www.intuit.ru/department/se/progstyles/13/ Стили и методы программирования. курс лекций. учебное пособие]. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X.
  • С.В. Зыков. Лекции №15 и №16 // [www.intuit.ru/department/se/tppobj/ Введение в теорию программирования. Объектно-ориентированный подход]. — Интернет-университет информационных технологий.
  • О. В. Ануфриев. [www.ict.edu.ru/vconf/files/3195.rtf О методике обучения основам событийного программирования]] (рус.). Новосибирский государственный педагогический университет. Проверено 29 октября 2010. [www.webcitation.org/65tNjeXma Архивировано из первоисточника 3 марта 2012].
  • [fpc.by.ru/xwin/xwin.html А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal]

Напишите отзыв о статье "Событийно-ориентированное программирование"

Ссылки

  1. [www.uwsg.indiana.edu/hypermail/linux/kernel/0106.2/0405.html Linux-Kernel Archive: Re: Alan Cox quote? (was: Re: accounting]
  2. Н. Н. Непейвода. 13. Лекция: Событийное программирование // [www.intuit.ru/department/se/progstyles/13/ Стили и методы программирования. курс лекций. учебное пособие]. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X.
  3. С.В. Зыков. Лекции №15 и №16 // [www.intuit.ru/department/se/tppobj/ Введение в теорию программирования. Объектно-ориентированный подход]. — Интернет-университет информационных технологий.
  4. [gui4cli.com Gui4Cli Home page]
  5. [www.okws.org/doku.php?id=sfslite:overview sfslite: overview]
  6. [www.quantum-leaps.com/downloads Download from Quantum Leaps]
  7. [www.croco.net/software/sue/ The Simple Unix Events (SUE) library homepage]

Отрывок, характеризующий Событийно-ориентированное программирование

На другой день княжна к вечеру уехала, и к Пьеру приехал его главноуправляющий с известием, что требуемых им денег для обмундирования полка нельзя достать, ежели не продать одно имение. Главноуправляющий вообще представлял Пьеру, что все эти затеи полка должны были разорить его. Пьер с трудом скрывал улыбку, слушая слова управляющего.
– Ну, продайте, – говорил он. – Что ж делать, я не могу отказаться теперь!
Чем хуже было положение всяких дел, и в особенности его дел, тем Пьеру было приятнее, тем очевиднее было, что катастрофа, которой он ждал, приближается. Уже никого почти из знакомых Пьера не было в городе. Жюли уехала, княжна Марья уехала. Из близких знакомых одни Ростовы оставались; но к ним Пьер не ездил.
В этот день Пьер, для того чтобы развлечься, поехал в село Воронцово смотреть большой воздушный шар, который строился Леппихом для погибели врага, и пробный шар, который должен был быть пущен завтра. Шар этот был еще не готов; но, как узнал Пьер, он строился по желанию государя. Государь писал графу Растопчину об этом шаре следующее:
«Aussitot que Leppich sera pret, composez lui un equipage pour sa nacelle d'hommes surs et intelligents et depechez un courrier au general Koutousoff pour l'en prevenir. Je l'ai instruit de la chose.
Recommandez, je vous prie, a Leppich d'etre bien attentif sur l'endroit ou il descendra la premiere fois, pour ne pas se tromper et ne pas tomber dans les mains de l'ennemi. Il est indispensable qu'il combine ses mouvements avec le general en chef».
[Только что Леппих будет готов, составьте экипаж для его лодки из верных и умных людей и пошлите курьера к генералу Кутузову, чтобы предупредить его.
Я сообщил ему об этом. Внушите, пожалуйста, Леппиху, чтобы он обратил хорошенько внимание на то место, где он спустится в первый раз, чтобы не ошибиться и не попасть в руки врага. Необходимо, чтоб он соображал свои движения с движениями главнокомандующего.]
Возвращаясь домой из Воронцова и проезжая по Болотной площади, Пьер увидал толпу у Лобного места, остановился и слез с дрожек. Это была экзекуция французского повара, обвиненного в шпионстве. Экзекуция только что кончилась, и палач отвязывал от кобылы жалостно стонавшего толстого человека с рыжими бакенбардами, в синих чулках и зеленом камзоле. Другой преступник, худенький и бледный, стоял тут же. Оба, судя по лицам, были французы. С испуганно болезненным видом, подобным тому, который имел худой француз, Пьер протолкался сквозь толпу.
– Что это? Кто? За что? – спрашивал он. Но вниманье толпы – чиновников, мещан, купцов, мужиков, женщин в салопах и шубках – так было жадно сосредоточено на то, что происходило на Лобном месте, что никто не отвечал ему. Толстый человек поднялся, нахмурившись, пожал плечами и, очевидно, желая выразить твердость, стал, не глядя вокруг себя, надевать камзол; но вдруг губы его задрожали, и он заплакал, сам сердясь на себя, как плачут взрослые сангвинические люди. Толпа громко заговорила, как показалось Пьеру, – для того, чтобы заглушить в самой себе чувство жалости.
– Повар чей то княжеский…
– Что, мусью, видно, русский соус кисел французу пришелся… оскомину набил, – сказал сморщенный приказный, стоявший подле Пьера, в то время как француз заплакал. Приказный оглянулся вокруг себя, видимо, ожидая оценки своей шутки. Некоторые засмеялись, некоторые испуганно продолжали смотреть на палача, который раздевал другого.
Пьер засопел носом, сморщился и, быстро повернувшись, пошел назад к дрожкам, не переставая что то бормотать про себя в то время, как он шел и садился. В продолжение дороги он несколько раз вздрагивал и вскрикивал так громко, что кучер спрашивал его:
– Что прикажете?
– Куда ж ты едешь? – крикнул Пьер на кучера, выезжавшего на Лубянку.
– К главнокомандующему приказали, – отвечал кучер.
– Дурак! скотина! – закричал Пьер, что редко с ним случалось, ругая своего кучера. – Домой я велел; и скорее ступай, болван. Еще нынче надо выехать, – про себя проговорил Пьер.
Пьер при виде наказанного француза и толпы, окружавшей Лобное место, так окончательно решил, что не может долее оставаться в Москве и едет нынче же в армию, что ему казалось, что он или сказал об этом кучеру, или что кучер сам должен был знать это.
Приехав домой, Пьер отдал приказание своему все знающему, все умеющему, известному всей Москве кучеру Евстафьевичу о том, что он в ночь едет в Можайск к войску и чтобы туда были высланы его верховые лошади. Все это не могло быть сделано в тот же день, и потому, по представлению Евстафьевича, Пьер должен был отложить свой отъезд до другого дня, с тем чтобы дать время подставам выехать на дорогу.
24 го числа прояснело после дурной погоды, и в этот день после обеда Пьер выехал из Москвы. Ночью, переменя лошадей в Перхушкове, Пьер узнал, что в этот вечер было большое сражение. Рассказывали, что здесь, в Перхушкове, земля дрожала от выстрелов. На вопросы Пьера о том, кто победил, никто не мог дать ему ответа. (Это было сражение 24 го числа при Шевардине.) На рассвете Пьер подъезжал к Можайску.
Все дома Можайска были заняты постоем войск, и на постоялом дворе, на котором Пьера встретили его берейтор и кучер, в горницах не было места: все было полно офицерами.
В Можайске и за Можайском везде стояли и шли войска. Казаки, пешие, конные солдаты, фуры, ящики, пушки виднелись со всех сторон. Пьер торопился скорее ехать вперед, и чем дальше он отъезжал от Москвы и чем глубже погружался в это море войск, тем больше им овладевала тревога беспокойства и не испытанное еще им новое радостное чувство. Это было чувство, подобное тому, которое он испытывал и в Слободском дворце во время приезда государя, – чувство необходимости предпринять что то и пожертвовать чем то. Он испытывал теперь приятное чувство сознания того, что все то, что составляет счастье людей, удобства жизни, богатство, даже самая жизнь, есть вздор, который приятно откинуть в сравнении с чем то… С чем, Пьер не мог себе дать отчета, да и ее старался уяснить себе, для кого и для чего он находит особенную прелесть пожертвовать всем. Его не занимало то, для чего он хочет жертвовать, но самое жертвование составляло для него новое радостное чувство.


24 го было сражение при Шевардинском редуте, 25 го не было пущено ни одного выстрела ни с той, ни с другой стороны, 26 го произошло Бородинское сражение.
Для чего и как были даны и приняты сражения при Шевардине и при Бородине? Для чего было дано Бородинское сражение? Ни для французов, ни для русских оно не имело ни малейшего смысла. Результатом ближайшим было и должно было быть – для русских то, что мы приблизились к погибели Москвы (чего мы боялись больше всего в мире), а для французов то, что они приблизились к погибели всей армии (чего они тоже боялись больше всего в мире). Результат этот был тогда же совершении очевиден, а между тем Наполеон дал, а Кутузов принял это сражение.
Ежели бы полководцы руководились разумными причинами, казалось, как ясно должно было быть для Наполеона, что, зайдя за две тысячи верст и принимая сражение с вероятной случайностью потери четверти армии, он шел на верную погибель; и столь же ясно бы должно было казаться Кутузову, что, принимая сражение и тоже рискуя потерять четверть армии, он наверное теряет Москву. Для Кутузова это было математически ясно, как ясно то, что ежели в шашках у меня меньше одной шашкой и я буду меняться, я наверное проиграю и потому не должен меняться.
Когда у противника шестнадцать шашек, а у меня четырнадцать, то я только на одну восьмую слабее его; а когда я поменяюсь тринадцатью шашками, то он будет втрое сильнее меня.
До Бородинского сражения наши силы приблизительно относились к французским как пять к шести, а после сражения как один к двум, то есть до сражения сто тысяч; ста двадцати, а после сражения пятьдесят к ста. А вместе с тем умный и опытный Кутузов принял сражение. Наполеон же, гениальный полководец, как его называют, дал сражение, теряя четверть армии и еще более растягивая свою линию. Ежели скажут, что, заняв Москву, он думал, как занятием Вены, кончить кампанию, то против этого есть много доказательств. Сами историки Наполеона рассказывают, что еще от Смоленска он хотел остановиться, знал опасность своего растянутого положения знал, что занятие Москвы не будет концом кампании, потому что от Смоленска он видел, в каком положении оставлялись ему русские города, и не получал ни одного ответа на свои неоднократные заявления о желании вести переговоры.
Давая и принимая Бородинское сражение, Кутузов и Наполеон поступили непроизвольно и бессмысленно. А историки под совершившиеся факты уже потом подвели хитросплетенные доказательства предвидения и гениальности полководцев, которые из всех непроизвольных орудий мировых событий были самыми рабскими и непроизвольными деятелями.
Древние оставили нам образцы героических поэм, в которых герои составляют весь интерес истории, и мы все еще не можем привыкнуть к тому, что для нашего человеческого времени история такого рода не имеет смысла.
На другой вопрос: как даны были Бородинское и предшествующее ему Шевардинское сражения – существует точно так же весьма определенное и всем известное, совершенно ложное представление. Все историки описывают дело следующим образом:
Русская армия будто бы в отступлении своем от Смоленска отыскивала себе наилучшую позицию для генерального сражения, и таковая позиция была найдена будто бы у Бородина.
Русские будто бы укрепили вперед эту позицию, влево от дороги (из Москвы в Смоленск), под прямым почти углом к ней, от Бородина к Утице, на том самом месте, где произошло сражение.
Впереди этой позиции будто бы был выставлен для наблюдения за неприятелем укрепленный передовой пост на Шевардинском кургане. 24 го будто бы Наполеон атаковал передовой пост и взял его; 26 го же атаковал всю русскую армию, стоявшую на позиции на Бородинском поле.
Так говорится в историях, и все это совершенно несправедливо, в чем легко убедится всякий, кто захочет вникнуть в сущность дела.
Русские не отыскивали лучшей позиции; а, напротив, в отступлении своем прошли много позиций, которые были лучше Бородинской. Они не остановились ни на одной из этих позиций: и потому, что Кутузов не хотел принять позицию, избранную не им, и потому, что требованье народного сражения еще недостаточно сильно высказалось, и потому, что не подошел еще Милорадович с ополчением, и еще по другим причинам, которые неисчислимы. Факт тот – что прежние позиции были сильнее и что Бородинская позиция (та, на которой дано сражение) не только не сильна, но вовсе не есть почему нибудь позиция более, чем всякое другое место в Российской империи, на которое, гадая, указать бы булавкой на карте.