Введение

Esterel – синхронный язык программирования для разработки сложных реактивных систем. Императивный стиль программирования в Esterel позволяет просто выражать параллелизм и прерывания. Как следствие, он хорошо подходит для проектирования моделей, где управление играет ключевую роль. Разработка языка началась в начале 1980-х годов и в основном проводилась командой из Ecole des Mines de Paris и INRIA под руководством Жерара Берри во Франции. Современные компиляторы преобразуют программы на Esterel в код на C или аппаратные реализации (RTL) – VHDL или Verilog. Язык продолжает разрабатываться, существует несколько компиляторов. Коммерческой версией Esterel является среда разработки Esterel Studio. Компания Synfora, которая занимается коммерциализацией языка, инициировала процесс стандартизации в IEEE в апреле 2007 года, однако рабочая группа (P1778) была расформирована в марте 2011 года. Справочное руководство находится в открытом доступе.

Многообразное понятие времени

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

Сигналы

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

Первичные заявления Эстереля

Чистый Эстерель имеет одиннадцать примитивных операторов. nothing Завершается немедленно, без каких-либо побочных эффектов. pause Блокирует ход управления в текущем цикле для возобновления в следующем цикле. p ; q Выполняет p до завершения, а затем, в той же реакции, запускает q. p || q Выполняет p и q параллельно. loop p end Перезапускает тело p сразу после его завершения. Любой путь через тело цикла должен содержать хотя бы один оператор pause, чтобы избежать бесконечного цикла в рамках одной реакции. signal S in p end Объявляет локальный сигнал. emit S Делает сигнал S активным в текущий момент времени. Сигнал отсутствует, пока он не станет активным. present S then p else q end Если сигнал S активен в текущий момент времени, немедленно выполняет p, иначе выполняет q. suspend p when S Приостанавливает выполнение тела в моменты, когда S активен. trap T in p end Объявляет помеченный блок выхода. exit T Переходит к концу ближайшего блока выхода, помеченного T.

Другие заявления Esterel

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