No existe un acuerdo real sobre lo que caracteriza la semántica denotacional (ver también este artículo), excepto que debe ser compositivo . Eso significa que si es la función semántica, asignando programas a su significado, algo como lo siguiente debe ser el caso para todos los constructores de programas - y todos los programas , ..., (suponiendo implícitamente una buena tipificación):n f M 1 M n[[ ⋅ ]]norteFMETRO1METROnorte
[[ f( M1, . . . , Mnorte) ]] = t r a n s ( f) ( [[ M1]] , . . . , [[ Mnorte]] )
Aquí es el constructor correspondiente a en el dominio semántico. La composicionalidad es similar al concepto de homomorfismo en álgebra.ft r a n s ( f)F
La semántica operacional no es compositiva en este sentido. Históricamente, la semántica denotacional se desarrolló en parte porque la semántica operativa no era compositiva. Siguiendo la innovadora semántica de denotación teórica de orden de cálculo, la mayoría de la semántica de denotación solía ser de orden teórico. Me imagino que, aparte del interés intelectual puro, la semántica denotacional se inventó principalmente porque en ese momento (1960):λ
- Solía ser difícil razonar sobre la semántica operativa.
- Solía ser difícil dar semántica axiomática a lenguajes no triviales.
Parte del problema era que la noción de igualdad de programas no se entendía tan bien como ahora. Yo diría que ambos problemas se han mejorado en gran medida, (1) por ejemplo, mediante técnicas basadas en bisimilación provenientes de la teoría de procesos (que puede verse como una forma específica de semántica operativa) o, por ejemplo, el trabajo de Pitts en semántica operativa y programa equivalencia, y (2) por los desarrollos de, por ejemplo, la lógica de separación o las lógicas de Hoare derivadas como versiones escritas de las lógicas de Hennessy-Milner mediante incrustaciones de lenguaje de programación en cálculos π escritos. Tenga en cuenta que las lógicas del programa (= semántica axiomática) también son compositivas.
Otra forma de ver la semántica denotacional es que hay muchos lenguajes de programación y todos se ven algo similares, por lo que tal vez podamos encontrar un metalenguaje simple pero universal, y asignar todos los lenguajes de programación de manera compositiva a ese meta- idioma. En la década de 1960, se pensó que algún cálculo escrito es ese metalenguaje. Una imagen puede decir más de 1000 palabras:λ
¿Cuál es la ventaja de este enfoque? Tal vez tenga sentido mirarlo desde un punto de vista económico. Si queremos demostrar algo interesante sobre una clase de programa de objeto, tenemos dos opciones.
Demuéstralo directamente en el nivel del objeto.
Demuestre que la traducción al meta-nivel (y viceversa) 'conserva' la propiedad, y luego pruébela para el meta-nivel, y luego empuje el resultado nuevamente al nivel del objeto.
El costo combinado de este último es probablemente más alto que el costo del primero, pero el costo de probar la traducción puede amortizarse en todos los usos futuros, mientras que el costo que prueba la propiedad para el meta-nivel es mucho menor que el de la prueba en el nivel del objeto.
Hasta ahora, el enfoque original de la teoría del orden de la semántica denotativa no ha cumplido con esta promesa, porque las características del lenguaje complicadas, como la orientación a objetos, la concurrencia y la computación distribuida, todavía no han recibido una semántica precisa de la teoría del orden. Por "preciso" me refiero a la semántica que coincide con la semántica operacional natural de dichos lenguajes.
¿Vale la pena aprender semántica denotacional? Si te refieres a enfoques teóricos del orden de la semántica denotativa, entonces probablemente no, a menos que quieras trabajar en la teoría de los lenguajes de programación y necesites comprender documentos más antiguos. Otra razón para aprender enfoques teóricos del orden de la semántica denotacional es la belleza de este enfoque.