Семантика действий — это структура для формальной спецификации семантики языков программирования, изобретенная Дэвидом Уоттом и Питером Д. Моссесом в 1990-х годах. Она представляет собой смесь денотационной , операционной и алгебраической семантики .
Семантика действий стремится быть прагматичной, а описания семантики действий ( ASD ) разработаны для масштабирования с целью обработки реалистичных языков программирования. Этому способствует расширяемость и модифицируемость ASD. Это помогает гарантировать, что расширения и изменения не потребуют слишком много изменений в описании. Это контрастирует с типичным случаем расширения денотационной или операционной семантики, которая может потребовать переформулирования всего описания.
Фреймворк семантики действий был первоначально разработан в Университете Орхуса и Университете Глазго . С тех пор группы и отдельные лица по всему миру внесли свой вклад в этот подход.
Важной частью семантики действий, которая придает ей модульность, невиданную в предыдущих семантиках языков программирования, является использование семантических сущностей первого порядка. Первый порядок относится к тому, как, в отличие от денотационной семантики, где семантическая функция может быть применена к другой семантической функции, в семантике действий семантическая сущность не может быть применена к другой семантической сущности такого же рода. [1] Более того, семантические сущности, используемые семантикой действий, расширяют возможности фреймворка по описанию конструкций языка программирования, служа для обозначения как поведения программы, которое не зависит от какой-либо конкретной реализации, так и способа, которым части программы влияют на общую производительность целого. Соответствующе названная нотация действий используется для выражения трех типов семантических сущностей, обнаруженных в семантике действий: действия , данные и источники . Центральной семантической сущностью в этом фреймворке являются действия, а данные и источники играют дополнительные роли. [2] Более конкретно, действия являются механизмами, посредством которых обрабатываются источники и данные. [1] Действие, которое может происходить внутри другого действия, является пошаговым представлением поведения программы, где каждый шаг получает доступ к текущей информации, изменяет текущую информацию или делает и то, и другое. Получатели появляются внутри действий и получают доступ только к текущей информации. Сущность получателя может быть оценена, и когда это так, продукт является сущностью данных. [2]
Сущности действий могут напрямую представлять семантику программ, описывая возможное поведение программы или представлять, более косвенным образом, влияние, которое отдельные части программы, такие как операторы или выражения, оказывают на семантику программы в целом. [2] Они моделируют вычислительное поведение, указывая изменения в состоянии посредством генерации новых значений из переданных значений. В частности, действие принимает данные, переданные ему через текущую информацию — временные данные, предоставленные ему, привязки, полученные им, и текущее состояние хранилища — и из этого дает новые временные данные, создает новые привязки, обновляет состояние хранилища или любую их комбинацию. [1] Сущность действия может завершиться четырьмя возможными способами. Она может: завершиться (нормально завершиться), выйти из строя (завершиться с исключением), потерпеть неудачу (альтернатива отбрасывается) или отклониться (не завершиться). [2]
Существует четыре категории информации, которые обрабатываются при выполнении действия. Временная информация соответствует промежуточным результатам и доступна для немедленного использования действием. [2] Данные, которые содержат временную информацию, охватывают значения, заданные выражениями. Если эти значения не используются немедленно, они теряются. [1] Информация с ограниченной областью действия соответствует таблицам символов и может быть использована из любого места в пределах действия и его поддействий. [2] Также возможно, чтобы такая информация была скрыта внутри поддействия посредством создания внутренней области действия, в этом случае она будет доступна только локально в этой области действия для этого поддействия. [1] Стабильная информация соответствует значениям, назначенным переменным, и может быть изменена при выполнении действия. [2] Поскольку изменения в хранилище во время выполнения действия являются постоянными, только явные действия могут вызывать такие изменения. [1] В соответствии с этим стабильная информация доступна до тех пор, пока она не будет явно уничтожена. И, в отличие от информации с ограниченной областью действия, ее нельзя скрыть. Постоянная информация соответствует данным, которыми обмениваются действия, и может быть расширена, но не изменена. Временная информация создается только тогда, когда действие завершается или исчезает, а ограниченная информация создается только тогда, когда действие завершается. Изменение стабильной информации и расширение постоянной информации должны происходить во время выполнения действия. [2]
Сущность действия имеет пять различных граней, одну для обработки, которая не зависит от информации, и четыре для обработки каждого из четырех различных типов информации. Базовая грань, примером которой могут служить потоки управления, не привязана к информации любого рода. Функциональная грань имеет дело с обработкой временной информации и характеризуется действиями по предоставлению и принятию данных. Декларативная грань имеет дело с обработкой ограниченной информации и характеризуется действиями по созданию и получению привязок. Императивная грань имеет дело с обработкой стабильной информации и характеризуется действиями по выделению и освобождению ячеек хранения, а также извлечению и изменению хранящихся в них данных. Коммуникативная грань имеет дело с обработкой постоянной информации и характеризуется действиями по отправке и получению сообщений и «предложению контрактов агентам». [2] Существует два различных вида действий с точки зрения их влияния на информацию в каждой грани. Примитивные действия влияют только на информацию в одной грани. Комбинаторы действий допускают действия, которые включают несколько граней, определяя, как потоки управления и информации передаются для каждой грани, участвующей в объединенном действии. [2] При комбинировании действий комбинаторы действий управляют последовательностью выполнения поддействий, а также входящими и исходящими потоками данных для каждого поддействия. [1]
Сущности данных — это элементы, которые содержат информацию, обрабатываемую в сущностях действий. Данные организованы в структуры, известные как сортировки. Сортировки — это наборы математических объектов, включающие операции, которые могут быть выполнены над этими объектами, и определяются в соответствии с алгебраическими критериями. [1] Эти структуры позволяют получить доступ к каждой отдельной сущности. Примерами сущностей данных могут быть конкретные элементы, такие как карты, списки, наборы, строки, символы, числа и значения истинности, более абстрактные элементы, используемые исключительно для целей некоторой вычислительной операции, а именно доступа к данным, такие как агенты, ячейки, соответствующие ячейкам памяти, и токены, или элементы, такие как контракты и сообщения, которые являются составными частями компонентов данных. [2] Абстракция — это сущность данных, которая инкапсулирует сущность действия, и в этом случае принятие абстракции приводит к выполнению действия. Это метод, с помощью которого семантика действия представляет объявление и вызов подпрограмм. [1]
Сущности Yielder состоят из неоцененных объемов данных. Значения этих объемов зависят от текущей информации и состояния вычислений. Yielder используют временные данные, привязки и хранилище для выбора информации, которая будет обрабатываться действиями. [1] Именно во время выполнения действия оцениваются yielders, и их оценка приводит к сущностям данных. Хотя текущая информация может влиять на данные, полученные в результате оценки сущности yielder, оценка не может влиять на текущую информацию. Если операции с данными применяются к сущностям yielder, в результате могут быть сформированы составные сущности yielder. [2]
Обычные английские слова служат символами нотации действия. Нотация действия предназначена для имитации естественного языка, что иллюстрируется частями речи, используемыми для обозначения семантических сущностей. Сущности действия представлены глагольными фразами, а сущности данных и выходов — именными фразами. Результатом такого выбора символов является структура, которая легко читается и не менее формальна, чем другие структуры, поскольку она остается точно определенной. [2]
Семантика действий воплощает уровень абстракции, который повышает ее понятность. Специфика потоков управления и данных, которые включает действие, неявно включена в действие, в отличие от явно выраженных деталей семантических функций в денотационной семантике. Когда действие выполняется, большая часть обработки и манипулирования информацией происходит автоматически. [1]
Программные фразы сопоставляются с действиями при построении определения значения языка программирования в семантике действий. Выполнение программной фразы соответствует выполнению действия, которому она сопоставляется. [1]
Спецификацию языка программирования, полученную в результате применения семантики действий, можно разбить на нижний уровень ( микросемантика ) и верхний уровень ( макросемантика ). Нижний уровень состоит из определения значения нотации действий, тогда как верхний уровень состоит из определения значения языка программирования с использованием для этого нотации действий. [1]