Введение

Семантика действий — это фреймворк для формальной спецификации семантики языков программирования, изобретенный Дэвидом Уаттом и Питером Д. Моссом в 1990-х годах. Она представляет собой сочетание денотационной, операционной и алгебраической семантики. Семантика действий стремится быть прагматичной, а описания семантики действий (ASD) разработаны для масштабирования и обработки реалистичных языков программирования. Этому способствует расширяемость и модифицируемость ASD, что помогает гарантировать, что расширения и изменения не потребуют слишком большого количества изменений в описании. Это отличается от типичной ситуации при расширении денотационной или операционной семантики, которая может потребовать переформулировки всего описания. Фреймворк семантики действий был первоначально разработан в Университете Орхуса и Университете Глазго. С тех пор группы и отдельные исследователи по всему миру внесли свой вклад в развитие этого подхода.

Семантические сущности

Важной частью семантики действий, которая обеспечивает ей модульность, не свойственную семантике предыдущих языков программирования, является использование семантических сущностей первого порядка. Под первым порядком понимается то, что, в отличие от денотационной семантики, где семантическая функция может быть применена к другой семантической функции, в семантике действий семантическая сущность не может быть применена к другой сущности того же типа. Более того, семантические сущности, используемые в семантике действий, расширяют возможности фреймворка по описанию конструкций языка программирования, позволяя обозначать как поведение программы, не зависящее от конкретной реализации, так и влияние частей программы на общую производительность целого. Для выражения трех типов семантических сущностей, используемых в семантике действий – действий, данных и генераторов – используется соответствующая нотация действий. Центральной семантической сущностью в этом фреймворке являются действия, в то время как данные и генераторы играют вспомогательную роль. В частности, действия являются механизмами, посредством которых обрабатываются генераторы и данные. Действие, которое может происходить внутри другого действия, представляет собой пошаговое представление поведения программы, где каждый шаг получает доступ к текущей информации, изменяет её или делает и то, и другое. Генераторы появляются внутри действий и получают доступ только к текущей информации. Сущность генератора может быть вычислена, и результатом вычисления является сущность данных.

Субъекты действий

Субъекты действия могут непосредственно представлять семантику программ, описывая возможное поведение программы, или представлять более косвенным образом влияние, которое отдельные части программы, такие как операторы или выражения, оказывают на семантику программы в целом. Они моделируют вычислительное поведение, указывая на изменения состояния посредством генерации новых значений из переданных. В частности, действие принимает данные, переданные ему через текущую информацию – временные данные, полученные связывания и текущее состояние памяти, – и на основе этого генерирует новые временные данные, создает новые связывания, обновляет состояние памяти или любую их комбинацию. Сущность действия может завершиться четырьмя способами: успешно завершиться (нормальное завершение), прерваться (завершение с исключением), не выполниться (альтернатива отклонена) или зациклиться (не завершиться). Существует четыре категории информации, обрабатываемой при выполнении действия. Временная информация соответствует промежуточным результатам и доступна для немедленного использования действием. Данные, составляющие временную информацию, включают значения, полученные выражениями. Если эти значения не используются немедленно, они теряются. Областная информация соответствует таблицам символов и может быть использована в любом месте внутри действия и его поддействий. Также возможно скрыть такую информацию внутри поддействия, создав внутреннюю область видимости, в этом случае она будет доступна только локально в этой области для данного поддействия. Стабильная информация соответствует значениям, присвоенным переменным, и может быть изменена в процессе выполнения действия. Поскольку изменения в памяти во время выполнения действия являются постоянными, только явные действия могут вызывать такие модификации. Соответственно, стабильная информация доступна до тех пор, пока она не будет явно уничтожена. И, в отличие от областной информации, её нельзя скрыть. Постоянная информация соответствует данным, обмениваемым между действиями, и может быть расширена, но не изменена. Временная информация генерируется только при успешном завершении или прерывании действия, а областная – только при успешном завершении. Изменение стабильной информации и расширение постоянной информации должны происходить в процессе выполнения действия. Сущность действия имеет пять различных граней: одна для обработки, не зависящей от информации, и четыре для обработки каждого из четырех типов информации. Базовая грань, примером которой являются потоки управления, не связана с информацией какого-либо рода. Функциональная грань обрабатывает временную информацию и характеризуется действиями, передающими и принимающими данные. Декларативная грань обрабатывает областную информацию и характеризуется действиями, создающими и получающими связывания. Императивная грань обрабатывает стабильную информацию и характеризуется действиями, выделяющими и освобождающими ячейки памяти, а также извлекающими и изменяющими хранящиеся в них данные. Коммуникативная грань обрабатывает постоянную информацию и характеризуется действиями отправки и получения сообщений и «предложения контрактов агентам». Существуют два типа действий с точки зрения их влияния на информацию в каждой грани. Примитивные действия влияют на информацию только в одной грани. Комбинаторы действий позволяют создавать действия, включающие несколько граней, определяя, как управляются и передаются данные для каждой грани, участвующей в комбинированном действии. При комбинировании действий комбинаторы действий управляют последовательностью выполнения поддействий и входящими и исходящими потоками данных для каждого поддействия.

Субъекты данных

Сущности данных – это элементы, составляющие информацию, обрабатываемую сущностями действия. Данные организованы в структуры, известные как сорта. Сорты – это множества математических объектов, включающие операции, которые могут быть выполнены над этими объектами, и определяются на основе алгебраических критериев. Эти структуры обеспечивают доступ к каждой отдельной сущности. Примеры сущностей данных могут включать конкретные элементы, такие как отображения, списки, множества, строки, символы, числа и логические значения, а также более абстрактные элементы, используемые исключительно для целей вычислительной операции, а именно доступа к данным, такие как агенты, ячейки памяти и токены, или элементы, такие как контракты и сообщения, являющиеся составными компонентами данных. Абстракция – это сущность данных, инкапсулирующая сущность действия, в этом случае выполнение абстракции приводит к выполнению действия. Это метод, с помощью которого семантика действий представляет объявление и вызов подпрограмм.

Субъекты доходности

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

Обозначение действия

Обычные английские слова используются в качестве символов в нотации действий. Нотация действий разработана для имитации естественного языка, что отражается в частях речи, используемых для обозначения семантических единиц. Действия представлены глагольными фразами, а данные и результаты – именными фразами. Благодаря такому выбору символов, эта система отличается высокой читаемостью и не уступает в формальности другим системам, поскольку остаётся чётко определённой.

Другие ключевые аспекты

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