SEvents

Материал из ALT Linux Wiki

SEvents[1][2] - система событийного программирования с фактором случайности, написана на языках Java и C. Создана для обучения студентов принципам событийного программирования, по сути своей близка к имитационному моделированию.

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

Событийное программирование - это стиль программирования, в котором вычисления активизируются в результате какого-то события в системе, являются реакцией на это событие, изменяя состояние системы[3].

Событийное программирование может быть как минимум двух вариантов:

  • программирование от событий
  • программирование от приоритетов

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

Сценарий

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

Пример Сценария

Программа на языке SEvents имеет вид сценария, в заголовке которого можно определить переменные и константы 3-х типов: boolean, int и double.

var
  boolean init = false; ";" - это комментарий
const
  double pi = 3.14;
begin
event
  name = "Событие инициализации"; уникальное имя события
  cond = time == 0; условие, при котором может возникнуть данное событие
  priority = 5; приоритет события, согласно которому данное событие будет обрабатываться
  repeatable = false; является ли это событие возобновимым
  probability = 1; вероятность выполнения этого события, вещественное значение от 0 до 1
body
  init = true;
end

Выполнение сценария

В SEvents время дискретное, системная переменная времени time пробегает значения от 0 до MAX_TIME во время выполнения одного сценария. Сценарий завершается в случае, если time == MAX_TIME, либо если системной переменной terminate присвоить истинное значение, значение переменной time в сценарии изменить невозможно (она меняется самой системой).

В каждый момент времени time выполняется по одному оператору у обработчиков активных событий и опрашивается реакция от объектов системы. Операторы событий выполняются согласно приоритетам событий (значение в priority), но с вероятностью UPDATE_PROBABILITY операторы обработчиков событий с меньшим приоритетом могут быть выполнены вместе в одном ряду с операторами событий с большим приоритетом.

Все изменения состояния в системе журналируются.

Операторы работы с событиями

Приведённые ниже операторы доступны как в сценарии, так и для динамических библиотек-объектов системы.

Значение Оператор Описание
boolean isSleep("Имя событие") спит ли сейчас событие с указанным именем
boolean isRun("Имя события") выполняется ли в данный момент событие с указанным именем
boolean isFinished("Имя события") выполнилось ли событие с указанным именем
boolean wasEvent("Имя события") выполнялось ли когда-либо событие с указанным именем
int getTime() получить текущее значение времени, то же самое, что и использовать time
void setSleep("Имя события") усыпить событие с указанным именем
void setWake("Имя события") пробудить событие с указанным именем
void killEvent("Имя события") убить событие с указанным именем
int getDelay("Имя события") получить количество итераций времени, в течении которого событие с указанным именем будет неактивно
void setDelay("Имя события", delay) установить количество итераций времени, в течении которого событие с указанным именем будет неактивно

Пример сценария с операторами

begin
event
  name = "Инициализация";
  cond = time == 0;
body
end

event
  name = "Пришёл преподаватель";
  cond = wasEvent("Инициализация");
body
end

event
  name = "Проводится лекция";
  cond = wasEvent("Пришёл преподаватель");
body
  killEvent("Проводится практика");
end

event
  name = "Проводится практика";
  cond = wasEvent("Пришёл преподаватель");
body
  killEvent("Проводится лекция");
end

event
  name = "Дали задания";
  cond = wasEvent("Проводится практика");
  probability = 0.5;
body
end

event
  name = "Перемена";
  cond = isFinished("Проводится практика") || isFinished("Проводится лекция")
body
  terminate = true; завершение
end

Объекты

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

Пример объекта

#include "libloader/include/functions.h"

#ifdef __cplusplus
extern "C" {
#endif

void run(void) {
  if (!wasEvent("init") || !hasImage()) {
    return;
  }
  long sColor = 0xff0000;
  long x, y, color;
  x = getInt("x");
  y = getInt("y");
  long x1, y1;
  x1 = getInt("x1");
  y1 = getInt("y1");
  if (x > 0 && x < x1 && y > 0 && y < y1) {
   color = getColor();
   setColor(sColor);
   fillRect(0, 0, x1, y1);
   setColor(color);
  }
}

#ifdef __cplusplus
}
#endif

Ссылки