La semántica de acción es un marco para la especificación formal de la semántica de los lenguajes de programación inventado por David Watt y Peter D. Mosses en la década de 1990. Es una mezcla de semántica denotacional , operacional y algebraica .
La semántica de acción tiene como objetivo ser pragmática, y las descripciones semánticas de acción ( ASD ) están diseñadas para escalarse y manejar lenguajes de programación realistas. Esto se ve facilitado por la extensibilidad y modificabilidad de las ASD. Esto ayuda a garantizar que las extensiones y los cambios no requieran demasiados cambios en la descripción. Esto contrasta con el caso típico cuando se extiende la semántica denotacional u operacional, que puede requerir la reformulación de toda la descripción.
El marco de trabajo de semántica de la acción se desarrolló originalmente en la Universidad de Aarhus y la Universidad de Glasgow . Desde entonces, grupos e individuos de todo el mundo han contribuido a este enfoque.
Una parte importante de la semántica de acción que le da una modularidad no vista en la semántica de lenguajes de programación anteriores es el uso de entidades semánticas de primer orden. El primer orden se refiere a cómo, a diferencia de la semántica denotacional, donde una función semántica se puede aplicar a otra función semántica, en la semántica de acción, una entidad semántica no se puede aplicar a otra entidad semántica de su tipo. [1] Además, las entidades semánticas utilizadas por la semántica de acción amplían la capacidad del marco para describir las construcciones de un lenguaje de programación al servir para denotar tanto el comportamiento del programa que es independiente de cualquier implementación particular como la forma en que las partes de un programa influyen en el rendimiento general del conjunto. La notación de acción, apropiadamente nombrada, se emplea para expresar los tres tipos de entidades semánticas que se encuentran en la semántica de acción: acciones , datos y rendimientos . La entidad semántica central en este marco son las acciones , con datos y rendimientos ocupando roles complementarios. [2] Más específicamente, las acciones son los mecanismos a través de los cuales se procesan los rendimientos y los datos. [1] Una acción, que puede ocurrir dentro de otra acción, es una representación paso a paso del comportamiento del programa, donde cada paso accede a la información actual, cambia la información actual o hace ambas cosas. Los cedentes aparecen dentro de las acciones y solo acceden a la información actual. Una entidad cedente puede evaluarse y, cuando lo hace, el producto es una entidad de datos. [2]
Las entidades de acción pueden representar directamente la semántica de los programas al describir posibles comportamientos del programa o representar, de una manera más indirecta, el impacto que las partes individuales de un programa, como declaraciones o expresiones, tienen en la semántica del programa en su conjunto. [2] Modelan el comportamiento computacional al indicar cambios en el estado a través de la generación de nuevos valores a partir de los valores pasados. Específicamente, una acción acepta datos que se le pasan a través de la información actual (los datos transitorios que se le dan, los enlaces que recibe y el estado actual del almacenamiento) y, a partir de esto, proporciona nuevos datos transitorios, crea nuevos enlaces, actualiza el estado del almacenamiento o cualquier combinación de estos. [1] Una entidad de acción puede culminar de cuatro formas posibles. Puede: completarse (terminar normalmente), escapar (terminar en una excepción), fallar (se descarta la alternativa) o divergir (no terminar). [2]
Existen cuatro categorías de información que son procesadas por la ejecución de la acción. La información transitoria corresponde a los resultados intermedios y es accesible para uso inmediato por la acción. [2] Los datos que comprenden la información transitoria abarcan los valores dados por las expresiones. Si estos valores no se utilizan inmediatamente, se pierden. [1] La información delimitada corresponde a las tablas de símbolos y se puede hacer referencia a ella desde cualquier lugar dentro de la acción y sus subacciones. [2] También es posible que dicha información se oculte dentro de una subacción, mediante la creación de un ámbito interno, en cuyo caso solo sería accesible localmente dentro de ese ámbito, para esa subacción. [1] La información estable corresponde a los valores asignados a las variables y se puede modificar en la ejecución de la acción. [2] Debido a que las alteraciones del almacenamiento durante la ejecución de una acción son persistentes, solo las acciones explícitas pueden causar dichas modificaciones. [1] De acuerdo con esto, la información estable está disponible hasta que se destruye explícitamente. Y, a diferencia de la información delimitada, no se puede ocultar. La información permanente corresponde a los datos intercambiados entre acciones y se puede ampliar pero no modificar. La información transitoria se produce solo cuando una acción se completa o se escapa, y la información delimitada se produce solo cuando una acción se completa. La modificación de la información estable y la extensión de la información permanente deben tener lugar durante la ejecución de la acción. [2]
Una entidad de acción tiene cinco facetas diferentes, una para el procesamiento que no depende de la información y cuatro para procesar cada uno de los cuatro tipos diferentes de información. La faceta básica , un ejemplo de la cual serían los flujos de control, no está vinculada a información de ningún tipo. La faceta funcional se ocupa del procesamiento de información transitoria y se caracteriza por acciones que dan y aceptan datos. La faceta declarativa se ocupa del procesamiento de información de ámbito y se caracteriza por acciones que crean y reciben enlaces. La faceta imperativa se ocupa del procesamiento de información estable y se caracteriza por acciones que asignan y liberan celdas de almacenamiento y obtienen y modifican los datos almacenados en ellas. La faceta comunicativa se ocupa del procesamiento de información permanente y se caracteriza por acciones que envían y reciben mensajes y "ofrecen contratos a los agentes". [2] Hay dos tipos diferentes de acciones en términos de su efecto sobre la información en cada faceta. Las acciones primitivas solo afectan la información en una faceta. Los combinadores de acciones permiten acciones que involucran múltiples facetas, gobernando cómo fluye el control y la información para cada faceta involucrada en una acción combinada. [2] Al combinar acciones, los combinadores de acciones controlan la secuencia de las ejecuciones de subacciones y los flujos entrantes y salientes de datos para cada subacción. [1]
Las entidades de datos son los elementos que componen la información procesada en las entidades de acción. Los datos se organizan en estructuras conocidas como ordenaciones. Las ordenaciones son conjuntos de objetos matemáticos, incluyen operaciones que se pueden realizar sobre esos objetos y se definen según criterios algebraicos. [1] Estas estructuras permiten el acceso a cada entidad individual. Los ejemplos de entidades de datos pueden incluir elementos concretos como mapas, listas, conjuntos, cadenas, caracteres, números y valores de verdad, elementos más abstractos utilizados únicamente con el propósito de alguna operación computacional, a saber, acceso a datos, como agentes, celdas correspondientes a ubicaciones de memoria y tokens, o elementos como contratos y mensajes que son un compuesto de componentes de datos. [2] Una abstracción es una entidad de datos que encapsula una entidad de acción, en cuyo caso la ejecución de la abstracción da como resultado la ejecución de la acción. Esta es la técnica mediante la cual la semántica de acción representa la declaración e invocación de subprogramas. [1]
Las entidades productoras consisten en cantidades de datos no evaluadas. Los valores de estas cantidades dependen de la información actual y del estado de cómputo. Las entidades productoras recurren a datos transitorios, enlaces y almacenamiento para seleccionar la información que se procesará mediante acciones. [1] Es durante la ejecución de la acción que se evalúan las entidades productoras, y su evaluación da como resultado entidades de datos. Si bien la información actual puede influir en los datos producidos por la evaluación de una entidad productora, la evaluación no puede influir en la información actual. Si se emplean operaciones de datos en entidades productoras, se pueden formar como resultado entidades productoras compuestas. [2]
Las palabras regulares del inglés sirven como símbolos de la notación de acciones. La notación de acciones está diseñada para simular el lenguaje natural, lo que se ilustra en las partes del discurso que se utilizan para denotar entidades semánticas. Las entidades de acción se representan mediante frases verbales y datos, y las entidades productoras mediante frases nominales. El resultado de esta elección de símbolos es un marco que es muy legible y no menos formal que otros marcos, ya que permanece definido con precisión. [2]
La semántica de la acción incorpora un nivel de abstracción que aumenta su comprensión. Los detalles específicos de los flujos de control y datos que implica una acción se incorporan implícitamente en la acción, en lugar de expresarse explícitamente como los detalles de las funciones semánticas en la semántica denotacional. Cuando se realiza una acción, la mayor parte del procesamiento y la manipulación de la información se produce de forma automática. [1]
Las frases de programa se asignan a acciones cuando se construye una definición del significado de un lenguaje de programación en la semántica de acciones. La ejecución de una frase de programación corresponde al desempeño de la acción a la que se asigna. [1]
La especificación del lenguaje de programación generada a partir de la aplicación de la semántica de acciones se puede dividir en un nivel inferior ( microsemántica ) y un nivel superior ( macrosemántica ). El nivel inferior consiste en definir el significado de la notación de acciones, mientras que el nivel superior consiste en definir el significado de un lenguaje de programación, utilizando la notación de acciones para hacerlo. [1]