Esterel - это язык синхронного программирования для разработки сложных реактивных систем. стиль императивного программирования в Esterel позволяет простое выражение параллелизма и вытеснения. Как следствие, он хорошо подходит для разработки моделей с преобладанием элементов управления.
Разработка языка началась в начале 1980-х годов и в основном осуществлялась командой Ecole des Mines de Paris и INRIA во главе с Жерар Берри во Франции. Текущие компиляторы берут программы Esterel и генерируют код C или аппаратные (RTL) реализации (VHDL или Verilog ).
Язык все еще находится в стадии разработки, несколько компиляторов уже выпущены. Коммерческая версия Esterel - это среда разработки. Компания, которая занимается его коммерциализацией (Synfora ), инициировала процесс нормализации с помощью IEEE в апреле 2007 года, однако рабочая группа (P1778) распалась в марте 2011 года. Версия справочного руководства Esterel v7 v7 30 - первоначальное предложение по стандартизации IEEE общедоступно.
Понятие времени, используемое в Эстерель, отличается от понятия времени в несинхронных языках следующим образом: понятие физического времени заменяется понятием порядка. Учитываются только одновременность и приоритет событий. Это означает, что физическое время не играет особой роли. Это называется разнообразным представлением о времени. Программа Esterel описывает полностью упорядоченную последовательность логических мгновений. В каждый момент происходит произвольное количество событий (включая 0). События, происходящие в один и тот же логический момент, считаются одновременными. Другие события упорядочены по экземплярам их возникновения. Есть два типа операторов: те, которые занимают нулевое время (выполняются и завершаются в один и тот же момент), и те, которые задерживаются на заданное количество циклов.
Сигналы - единственное средство связи. Есть оценочные и неоцененные сигналы. Далее они подразделяются на входные, выходные или локальные сигналы. Сигнал имеет свойство мгновенно присутствовать или отсутствовать. Ценные сигналы также содержат значение. Сигналы передаются по программе, а это означает, что любой процесс может читать или записывать сигнал. Значение оценочного сигнала можно определить в любой момент, даже если сигнал отсутствует. Статус сигнала по умолчанию отсутствует. Сигналы остаются отсутствующими до тех пор, пока они не будут явно представлены с помощью оператора emit. Связь происходит мгновенно, это означает, что сигнал, излучаемый в цикле, виден немедленно. Обратите внимание, что можно общаться в одном и том же цикле.
Таким образом,
присутствует A else emit A end
- это ошибочная программа : средство записи "emit A" должно выполняться до того, как средство чтения "представляет A", но семантика языка требует "настоящего A" "должно выполняться первым, что приводит к конфликту в семантике программы.
Pure Esterel имеет одиннадцать примитивных операторов.
ничего | Немедленное прекращение без каких-либо других последствий. |
пауза | Блокирует поток управления в текущем цикле для возобновления в следующем цикле. |
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 | Объявить помеченный escape-блок. |
exit T | Перейти к концу самого внутреннего блока перехода с T-меткой. |
Esterel имеют несколько производных конструкций:
Производные операторы | Expansion |
---|---|
halt | loop pause end |
ustain s | loop emit s ; пауза конец |
присутствует s затем p end | присутствует s затем p еще ничего конец |
ожидание s | прерывание T в паузе цикла; присутствует s затем выйти T конец конец цикла конец |
ждать немедленного s | прерывание T в цикле присутствует s затем выйти T end; приостановить конец цикла конец |
приостановить p когда немедленно s | приостановить настоящее s затем приостановить конец; p когда s |
прервать p когда (немедленно) s | ловушка T в приостановке p когда (немедленно) s ; выход T || ждать (немедленно) s ; выход T; конец |
слабое прерывание p когда (немедленно) s | ловушка T в p ; выход T || ждать (немедленно) s ; выход T; конец |
цикла s | цикл прерывание p ; останавливаться, когда s конец цикла |
каждый (немедленно) s do p конец каждые | ожидание (немедленно) s ; loop p each s |
Полный язык Esterel также имеет операторы для объявления и создания экземпляров модулей, для переменных, для вызова внешних процедур и для оцененных сигналов.
Следующая программа генерирует выход O, как только будут получены оба входа A и B. Сбросьте поведение всякий раз, когда принимается вход R.
модуль ABRO: вход A, B, R; выход O; цикл [ожидание A || ждать B]; emit O each R end module