Articulo de referencia

Semántica operacional

La semántica operacional es una categoría de la semántica formal de los lenguajes de programación en la que ciertas propiedades deseadas de un programa , como la corrección, la ...

La semántica operacional es una categoría de la semántica formal de los lenguajes de programación en la que ciertas propiedades deseadas de un programa , como la corrección, la seguridad o la protección, se verifican mediante la construcción de pruebas a partir de enunciados lógicos sobre su ejecución y procedimientos, en lugar de asignar significados matemáticos a sus términos ( semántica denotacional ). La semántica operacional se clasifica en dos categorías: la semántica operacional estructural (o semántica de pasos pequeños ) describe formalmente cómo se llevan a cabo los pasos individuales de un cálculo en un sistema informático; por oposición, la semántica natural (o semántica de pasos grandes ) describe cómo se obtienen los resultados generales de las ejecuciones. Otros enfoques para proporcionar una semántica formal de los lenguajes de programación incluyen la semántica axiomática , la semántica denotacional y la semántica algebraica .

La semántica operacional de un lenguaje de programación describe cómo se interpreta un programa válido como una secuencia de pasos computacionales. Estas secuencias constituyen el significado del programa. En el contexto de la programación funcional , el último paso de una secuencia devuelve el valor del programa. (En general, un mismo programa puede tener múltiples valores de retorno, ya que puede ser no determinista , e incluso un programa determinista puede tener múltiples secuencias computacionales, dado que la semántica no siempre especifica con exactitud qué secuencia de operaciones conduce a dicho valor).

Quizás la primera encarnación formal de la semántica operacional fue el uso del cálculo lambda para definir la semántica de Lisp . [ 1 ] Las máquinas abstractas en la tradición de la máquina SECD también están estrechamente relacionadas.

Historia

El concepto de semántica operacional se utilizó por primera vez para definir la semántica de Algol 68. La siguiente afirmación es una cita del informe revisado de ALGOL 68:

El significado de un programa en lenguaje estricto se explica en términos de una computadora hipotética que realiza el conjunto de acciones que constituyen la elaboración de dicho programa. ( Algol68 , Sección 2)

El primer uso del término "semántica operacional" con su significado actual se atribuye a Dana Scott ( Plotkin04 ). A continuación, se presenta una cita del artículo fundamental de Scott sobre semántica formal, en la que menciona los aspectos "operacionales" de la semántica.

Está muy bien aspirar a un enfoque más "abstracto" y "limpio" de la semántica, pero para que el plan tenga éxito, no se pueden ignorar por completo los aspectos operacionales. ( Scott70 )

Aproches

Gordon Plotkin introdujo la semántica operacional estructural, Matthias Felleisen y Robert Hieb la semántica de reducción, [ 2 ] y Gilles Kahn la semántica natural.

Semántica de pasos pequeños

Semántica operacional estructural

La semántica operacional estructural (SOS, también llamada semántica operacional estructurada o semántica de pasos pequeños ) fue introducida por Gordon Plotkin en ( Plotkin81 ) como un medio lógico para definir la semántica operacional. La idea básica detrás de SOS es definir el comportamiento de un programa en términos del comportamiento de sus partes, proporcionando así una visión estructural, es decir, orientada a la sintaxis e inductiva , de la semántica operacional. Una especificación SOS define el comportamiento de un programa en términos de una (o conjunto de) relaciones de transición . Las especificaciones SOS adoptan la forma de un conjunto de reglas de inferencia que definen las transiciones válidas de una pieza compuesta de sintaxis en términos de las transiciones de sus componentes.

Como ejemplo sencillo, consideremos parte de la semántica de un lenguaje de programación simple; en Plotkin81 y Hennessy90 , y otros libros de texto, se ofrecen ilustraciones adecuadas.do1,do2{\displaystyle C_{1},C_{2}}abarcar programas del lenguaje y dejars{\displaystyle s}abarcar estados (por ejemplo, funciones desde ubicaciones de memoria a valores). Si tenemos expresiones (recorridas pormi{\displaystyle E}), valores (V{\displaystyle V}) y ubicaciones (L{\displaystyle L}), entonces un comando de actualización de memoria tendría la siguiente semántica:

mi,sVL:=mi,s(s(LV)){\displaystyle {\frac {\langle E,s\rangle \Rightarrow V}{\langle L:=E\,,\,s\rangle \longrightarrow (s\uplus (L\mapsto V))}}}

De manera informal, la regla dice que " si la expresiónmi{\displaystyle E}en el estados{\displaystyle s}reduce a valorV{\displaystyle V}, luego el programaL:=mi{\displaystyle L:=E}actualizará el estados{\displaystyle s}con la tareaL=V{\displaystyle L=V}".

La semántica de la secuenciación se puede definir mediante las siguientes tres reglas:

1.do1,ssdo1;do2,sdo2,s{\displaystyle {\frac {\langle C_{1},s\rangle \longrightarrow s'}{\langle C_{1};C_{2}\,,s\rangle \longrightarrow \langle C_{2},s'\rangle }}}
2.do1,sdo1,sdo1;do2,sdo1;do2,s{\displaystyle {\frac {\langle C_{1},s\rangle \longrightarrow \langle C_{1}',s'\rangle }{\langle C_{1};C_{2}\,,s\rangle \longrightarrow \langle C_{1}';C_{2}\,,s'\rangle }}}
3.skipag,ss{\displaystyle {\frac {}{\langle \mathbf {skip} ,s\rangle \longrightarrow s}}}

De manera informal, la primera regla dice que, si el programado1{\displaystyle C_{1}}en el estados{\displaystyle s}termina en el estados{\displaystyle s'}, luego el programado1;do2{\displaystyle C_{1};C_{2}}en el estados{\displaystyle s}se reducirá al programado2{\displaystyle C_{2}}en el estados{\displaystyle s'}. (Puedes pensar en esto como formalizar "Puedes correr"do1{\displaystyle C_{1}}y luego correrdo2{\displaystyle C_{2}} utilizando el almacenamiento de memoria resultante.) La segunda regla dice que si el programado1{\displaystyle C_{1}}en el estados{\displaystyle s}puede reducirse al programado1{\displaystyle C_{1}'}con el estados{\displaystyle s'}, luego el programado1;do2{\displaystyle C_{1};C_{2}}en el estados{\displaystyle s}se reducirá al programado1;do2{\displaystyle C_{1}';C_{2}}en el estados{\displaystyle s'}. (Puedes pensar en esto como la formalización del principio para un compilador optimizador: "Se te permite transformardo1{\displaystyle C_{1}}como si fuera independiente, incluso si es solo la primera parte de un programa." La semántica es estructural, porque el significado del programa secuencialdo1;do2{\displaystyle C_{1};C_{2}}, se define por el significado dedo1{\displaystyle C_{1}}y el significado dedo2{\displaystyle C_{2}}.

Si también tenemos expresiones booleanas sobre el estado, abarcadas porB{\displaystyle B}, entonces podemos definir la semántica del comando while : B,strmiwhilmi B do do,sdo;whilmi B do do,sB,sFalsmiwhilmi B do do,ss{\displaystyle {\frac {\langle B,s\rangle \Rightarrow \mathbf {true} }{\langle \mathbf {while} \ B\ \mathbf {do} \ C,s\rangle \longrightarrow \langle C;\mathbf {while} \ B\ \mathbf {do} \ C,s\rangle }}\quad {\frac {\langle B,s\rangle \Rightarrow \mathbf {false} }{\langle \mathbf {while} \ B\ \mathbf {do} \ C,s\rangle \longrightarrow s}}}

Esta definición permite un análisis formal del comportamiento de los programas, posibilitando el estudio de las relaciones entre ellos. Entre las relaciones importantes se incluyen los preórdenes de simulación y la bisimulación . Estas son especialmente útiles en el contexto de la teoría de la concurrencia .

Gracias a su aspecto intuitivo y su estructura fácil de seguir, SOS ha ganado gran popularidad y se ha convertido en un estándar de facto en la definición de la semántica operacional. Como muestra de su éxito, el informe original (el llamado informe de Aarhus) sobre SOS ( Plotkin81 ) ha atraído más de 1000 citas según CiteSeer., lo que lo convierte en uno de los informes técnicos más citados en Ciencias de la Computación .

semántica de reducción

La semántica de reducción es una presentación alternativa de la semántica operacional. Sus ideas clave fueron aplicadas por primera vez a variantes puramente funcionales de llamada por nombre y llamada por valor del cálculo lambda por Gordon Plotkin en 1975 [ 3 ] y generalizadas a lenguajes funcionales de orden superior con características imperativas por Matthias Felleisen en su disertación de 1987. [ 4 ] El método fue desarrollado posteriormente por Matthias Felleisen y Robert Hieb en 1992 en una teoría completamente ecuacional para el control y el estado . [ 2 ] La frase "semántica de reducción" fue acuñada por primera vez por Felleisen y Daniel P. Friedman en un artículo de PARLE de 1987. [ 5 ]

La semántica de reducción se define como un conjunto de reglas de reducción , cada una de las cuales especifica un único paso de reducción potencial. Por ejemplo, la siguiente regla de reducción establece que una instrucción de asignación puede reducirse si se encuentra inmediatamente junto a la declaración de su variable:

lmit rmido incógnita=v1 inorte incógnitav2; mi    lmit rmido incógnita=v2 inorte mi{\displaystyle \mathbf {let\ rec} \ x=v_{1}\ \mathbf {in} \ x\leftarrow v_{2};\ e\ \ \longrightarrow \ \ \mathbf {let\ rec} \ x=v_{2}\ \mathbf {in} \ e}

Para que una instrucción de asignación llegue a tal posición, se "asciende" a través de aplicaciones de funciones y el lado derecho de las instrucciones de asignación hasta que alcanza el punto adecuado. Dado que se interponelmit{\displaystyle \mathbf {let} }Las expresiones pueden declarar variables distintas, el cálculo también exige una regla de extrusión paralmit{\displaystyle \mathbf {let} }expresiones. La mayoría de los usos publicados de la semántica de reducción definen tales “reglas de burbuja” con la conveniencia de los contextos de evaluación. Por ejemplo, la gramática de los contextos de evaluación en un lenguaje simple de llamada por valor se puede dar como

mi::=[] | v mi | mi mi | incógnitami | lmit rmido incógnita=v inorte mi | mi; mi{\displaystyle E::=[\,]\ {\big |}\ v\ E\ {\big |}\ E\ e\ {\big |}\ x\leftarrow E\ {\big |}\ \mathbf {let\ rec} \ x=v\ \mathbf {in} \ E\ {\big |}\ E;\ e}

dóndemi{\displaystyle e}denota expresiones arbitrarias yv{\displaystyle v}denota valores totalmente reducidos. Cada contexto de evaluación incluye exactamente un hueco.[]{\displaystyle [\,]}en el que se inserta un término de forma que lo capture. La forma del contexto indica, mediante este orificio, dónde puede producirse la reducción. Para describir el “burbujeo” con la ayuda de contextos de evaluación, basta un único axioma:

mi[incógnitav; mi]    incógnitav; mi[mi](asignaciones de ascensores){\displaystyle E[\,x\leftarrow v;\ e\,]\ \ \longrightarrow \ \ x\leftarrow v;\ E[\,e\,]\qquad {\text{(lift assignments)}}}

Esta regla de reducción única es la regla de elevación del cálculo lambda de Felleisen y Hieb para sentencias de asignación. Los contextos de evaluación restringen esta regla a ciertos términos, pero es aplicable libremente a cualquier término, incluso bajo expresiones lambda.

Siguiendo a Plotkin, demostrar la utilidad de un cálculo derivado de un conjunto de reglas de reducción requiere (1) un lema de Church-Rosser para la relación de un solo paso, que induce una función de evaluación, y (2) un lema de estandarización de Curry-Feys para el cierre transitivo-reflexivo de la relación de un solo paso, que reemplaza la búsqueda no determinista en la función de evaluación por una búsqueda determinista de extremo izquierdo/externo. Felleisen demostró que las extensiones imperativas de este cálculo satisfacen estos teoremas. Como consecuencia de estos teoremas, la teoría ecuacional —el cierre simétrico-transitivo-reflexivo— constituye un principio de razonamiento sólido para estos lenguajes. Sin embargo, en la práctica, la mayoría de las aplicaciones de la semántica de reducción prescinden del cálculo y utilizan únicamente la reducción estándar (y el evaluador que se puede derivar de ella).

La semántica de reducción es particularmente útil dada la facilidad con la que los contextos de evaluación pueden modelar estados o construcciones de control inusuales (por ejemplo, continuaciones de primera clase ). Además, la semántica de reducción se ha utilizado para modelar lenguajes orientados a objetos , [ 6 ] sistemas de contratos , excepciones, futuros, llamadas por necesidad y muchas otras características del lenguaje. Matthias Felleisen, Robert Bruce Findler y Matthew Flatt ofrecen un tratamiento completo y moderno de la semántica de reducción que analiza en detalle varias de estas aplicaciones en Semantics Engineering with PLT Redex . [ 7 ]

Semántica de grandes pasos

semántica natural

La semántica operacional estructural de pasos grandes también se conoce con los nombres de semántica natural , semántica relacional y semántica de evaluación . [ 8 ] La semántica operacional de pasos grandes fue introducida con el nombre de semántica natural por Gilles Kahn al presentar Mini-ML, un dialecto puro de ML .

Las definiciones de pasos grandes pueden considerarse definiciones de funciones o, más generalmente, de relaciones, interpretando cada construcción del lenguaje en un dominio apropiado. Su intuición las convierte en una opción popular para la especificación semántica en lenguajes de programación, pero presentan algunos inconvenientes que las hacen poco prácticas o imposibles de usar en muchas situaciones, como en lenguajes con características de control intensivo o concurrencia. [ 9 ]

La semántica de grandes pasos describe, mediante la estrategia de divide y vencerás, cómo se pueden obtener los resultados de la evaluación final de las construcciones del lenguaje combinando los resultados de la evaluación de sus contrapartes sintácticas (subexpresiones, subinstrucciones, etc.).

Comparación

Existen varias diferencias entre la semántica de pasos pequeños y la de pasos grandes que influyen en si una u otra constituye una base más adecuada para especificar la semántica de un lenguaje de programación.

La semántica de pasos grandes tiene la ventaja de ser a menudo más simple (requiere menos reglas de inferencia) y a menudo corresponde directamente a una implementación eficiente de un intérprete para el lenguaje (de ahí que Kahn la llame "natural"). Ambas pueden conducir a pruebas más simples, por ejemplo, al probar la preservación de la corrección bajo alguna transformación de programa . [ 10 ]

La principal desventaja de la semántica de pasos grandes es que los cálculos no terminantes ( divergentes ) no tienen un árbol de inferencia, lo que hace imposible enunciar y probar propiedades sobre dichos cálculos. [ 10 ]

La semántica de pasos pequeños ofrece mayor control sobre los detalles y el orden de evaluación. En el caso de la semántica operacional instrumentada, esto permite que la semántica operacional realice un seguimiento y que el semántico formule y demuestre teoremas más precisos sobre el comportamiento en tiempo de ejecución del lenguaje. Estas propiedades hacen que la semántica de pasos pequeños sea más conveniente al demostrar la corrección de tipos de un sistema de tipos frente a una semántica operacional. [ 10 ]

Véase también

Referencias

  1. McCarthy, John . "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, parte I" . Archivado del original el 4 de octubre de 2013. Consultado el 13 de octubre de 2006 .
  2. 1 2 Felleisen, M.; Hieb, R. (1992). "The Revised Report on the Syntactic Theories of Sequential Control and State". Theoretical Computer Science . 103 (2): 235– 271. doi : 10.1016/0304-3975(92)90014-7 .
  3. Plotkin, Gordon (1975). "Call-by-name, call-by-value and the λ-calculus" (PDF) . Theoretical Computer Science . 1 (2): 125– 159. doi : 10.1016/0304-3975(75)90017-1 . Recuperado el 22 de julio de 2021 .
  4. Felleisen, Matthias (1987). Los cálculos de conversión Lambda-v-CS: una teoría sintáctica del control y el estado en lenguajes de programación imperativos de orden superior (PDF) (PhD). Universidad de Indiana . Recuperado el 22 de julio de 2021 .
  5. Felleisen, Matthias; Friedman, Daniel P. (1987). "Una semántica de reducción para lenguajes imperativos de orden superior". Actas de la Conferencia Internacional sobre Arquitecturas y Lenguajes Paralelos de Europa. Vol. 1. Springer-Verlag. pp. 206–223 . doi : 10.1007/3-540-17945-3_12 .  
  6. ^ Abadi, M.; Cardelli, L. (8 de septiembre de 2012). Una teoría de los objetos . Saltador. ISBN 9781441985989.
  7. Felleisen, Matthias; Findler, Robert Bruce; Flatt, Matthew (2009). Ingeniería semántica con PLT Redex . The MIT Press. ISBN 978-0-262-06275-6.
  8. Universidad de Illinois CS422
  9. ^ Nipkow, Tobías; Klein, Gerwin (2014). Semántica concreta (PDF) . págs. 101– 102. doi : 10.1007/978-3-319-10542-0 . ISBN  978-3-319-10541-3. Consultado el 13 de marzo de 2024 .
  10. 1 2 3 Xavier Leroy . "Semántica operacional coinductiva de grandes pasos".

Lecturas adicionales

  • Gilles Kahn . «Semántica natural». Actas del 4.º Simposio Anual sobre Aspectos Teóricos de la Informática . Springer-Verlag. Londres. 1987.
  • Gordon D. Plotkin. Un enfoque estructural de la semántica operacional . (1981) Informe técnico DAIMI FN-19, Departamento de Ciencias de la Computación, Universidad de Aarhus, Aarhus, Dinamarca. (Reimpreso con correcciones en J. Log. Algebr. Program. 60-61: 17-139 (2004), ( preimpresión ).
  • Gordon D. Plotkin. Los orígenes de la semántica operacional estructural. J. Log. Algebr. Program. 60-61:3-15, 2004. ( preimpresión ).
  • Dana S. Scott. Esquema de una teoría matemática de la computación, Grupo de Investigación en Programación, Monografía Técnica PRG–2, Universidad de Oxford, 1970.
  • Adriaan van Wijngaarden et al. Informe revisado sobre el lenguaje algorítmico ALGOL 68 . IFIP. 1968.
  • Matthew Hennessy . Semántica de los lenguajes de programación. Wiley, 1990. Disponible en línea .
  • Logotipo de Wikimedia CommonsContenido multimedia relacionado con la semántica operacional en Wikimedia Commons.