Para ampliar un poco la respuesta de Michael Madsen, un ejemplo podría ser el comportamiento del operador ++. Informalmente, describimos al operador usando un inglés simple. Por ejemplo:
Si x
es una variable de tipo int
, ++x
causas x que se incrementa en uno.
(estoy suponiendo que no haya desbordamientos de enteros, y que ++x
no devuelve nada)
En una semántica formal (y voy a utilizar semántica operacional), tendríamos un poco de trabajo para hacer. En primer lugar, necesitamos definir una noción de tipos. En este caso, supondré que todas las variables son del tipo int
. En este lenguaje simple, el estado actual del programa puede ser descrito por una tienda, que es un mapeo de variables a valores. Por ejemplo, en algún punto del programa, x
podría ser igual a 42, mientras que y
es igual a -5351. La tienda se puede usar como una función, por ejemplo, si la tienda s
tiene la variable x
con el valor 42, entonces s(x) = 42
.
También se incluyen en el estado actual del programa las declaraciones restantes del programa que tenemos que ejecutar. Podemos agrupar esto como <C, s>
, donde C
es el programa restante, y s
es la tienda.
Por lo tanto, si tenemos el estado <++x, {x -> 42, y -> -5351}>
, esto es informalmente un estado donde el comando único que queda es para ejecutar ++x
, la variable x
tiene un valor de 42, y la variable tiene un valor y
-5351
.
Podemos entonces definir transiciones de un estado del programa a otro - describimos lo que ocurre cuando damos el siguiente paso en el programa.Así, por ++
, podríamos definir la semántica siguiente:
<++x, s> --> <skip, s{x -> (s(x) + 1)>
Un tanto de manera informal, mediante la ejecución de ++x
, el siguiente comando es skip
, que no tiene ningún efecto, y las variables de la tienda son sin cambios, excepto por x
, que ahora tiene el valor que originalmente tenía más uno. Todavía queda algo por hacer, como definir la notación que utilicé para actualizar la tienda (¡lo cual no he hecho para evitar que esta respuesta se prolongue aún más!). Por lo tanto, una instancia específica de la regla general podría ser:
<++x, {x -> 42, y -> -5351}> --> <skip, {x -> 43, y -> -5351}>
Espero que eso le dé la idea. Tenga en cuenta que este es solo un ejemplo de semántica formal: junto con la semántica operacional, existe una semántica axiomática (que a menudo utiliza la lógica de Hoare) y una semántica denotacional, y probablemente mucho más con lo que no estoy familiarizado.
Como mencioné en un comentario a otra respuesta, una ventaja de la semántica formal es que puede usarlos para probar ciertas propiedades de su programa, por ejemplo, que termina. Además de mostrar que su programa no exhibe un mal comportamiento (como la no terminación), también puede probar que su programa se comporta según lo requerido demostrando que su programa coincide con una especificación dada. Habiendo dicho eso, nunca he encontrado la idea de especificar y verificar un programa tan convincente, ya que he encontrado que la especificación generalmente es solo el programa reescrito en lógica, por lo que la especificación es muy probable que tenga fallas.
Es cuando la semántica se representa en diagramas con esmoquin. – blowdart
¿Qué es Giotto? –
Wikipedia dice: "El lenguaje de programación Giotto para sistemas integrados en tiempo real". Y no dice nada más. – asveikau