Введение

Язык программирования с защищёнными командами (GCL) — это язык программирования, определённый Эдсгером Дейкстрой для семантики преобразования предикатов в EWD472. Он объединяет концепции программирования в компактной форме. Это облегчает одновременную разработку программы и её доказательства, при этом идеи доказательства задают направление; более того, части программы могут быть фактически вычислены. Важным свойством GCL является недетерминированность. Например, в операторе if несколько альтернатив могут быть истинными, и выбор, какую из них выбрать, осуществляется во время выполнения, когда оператор if выполняется. Это освобождает программиста от необходимости делать ненужные выборы и помогает в формальной разработке программ. GCL включает оператор множественного присваивания. Например, выполнение оператора осуществляется путём сначала вычисления значений правой части, а затем сохранения их в левые переменные. Таким образом, этот оператор меняет местами значения и . Следующие книги посвящены разработке программ с использованием GCL:

Охраняемая команда

Защищенная команда является наиболее важным элементом языка защищенных команд. В защищенной команде, как следует из названия, команда "охраняется" условием. Это условие – логическое выражение, которое должно быть истинным перед выполнением команды. В начале выполнения команды можно считать, что условие истинно. Кроме того, если условие ложно, команда выполняться не будет. Использование защищенных команд упрощает доказательство соответствия программы спецификации. Команда часто сама является защищенной командой.

Пропусти и отмени

skip и abort – важные операторы в языке защищённых команд. abort – это неопределённая инструкция: делайте всё, что угодно. Ему даже не обязательно завершать работу. Он используется для описания программы при построении доказательства, в этом случае доказательство обычно не удаётся. skip – пустая инструкция: ничего не делать. Он используется в самой программе, когда синтаксис требует оператора, но состояние не должно изменяться.

Назначение

Присваивает значения переменным.

Выбор: если

Выбор (часто называемый "условным оператором" или "оператором if") представляет собой список команд с условиями, из которых одна выбирается для выполнения. Если более одного условия истинно, то недетерминированно выбирается для исполнения одна из команд, условие которой истинно. Если ни одно условие не истинно, результат не определен. Поскольку по крайней мере одно условие должно быть истинным, часто требуется пустая команда skip. Оператор if fi не содержит команд с условиями, поэтому ни одно условие никогда не будет истинным. Следовательно, if fi эквивалентен прерыванию.

Семантика

После выполнения выбора оцениваются все условия. Если ни одно из условий не возвращает true, выполнение выбора прерывается, иначе одно из условий, возвращающих значение true, выбирается недетерминированно, и выполняется соответствующее выражение.

Повторение:

Исполнение этого повтора, или цикла, показано ниже.

Семантика

Исполнение повторения состоит из выполнения 0 или более итераций, где итерация состоит из (недетерминированного) выбора охраняемой команды Gi → Si, у которой охрана Gi истинна, и выполнения команды Si. Таким образом, если все стражи изначально ложны, повторение завершается немедленно, без выполнения какой-либо итерации. Исполнение повторения do od, которое не содержит охраняемых команд, выполняет 0 итераций, следовательно, do od эквивалентно команде skip.

Программы корректны по конструкции

Обобщение наблюдательной конгруэнтности охраняемых команд в решетку положило начало речевому исчислению (Refinement Calculus). Это было реализовано в формальных методах, таких как метод B, позволяющий формально выводить программы из их спецификаций.

Проверка модели

Защищённые команды используются в языке программирования Promela, который применяется в системе проверки моделей SPIN. SPIN верифицирует корректность работы параллельных программных приложений.

Другое

Модуль Perl Commands::Guarded реализует детерминированный, самовосстанавливающийся вариант защищенных команд Дейкстры.